久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2557|回復: 10
打印 上一主題 下一主題
收起左側

用STC8G1K08單片機的P1.1口采集NTC溫度顯示000 還請大佬抽空幫忙看看問題所在

  [復制鏈接]
跳轉到指定樓層
樓主



原理圖如上,測試STC8G1K08的NTC溫度采樣,3位數碼管始終顯示000。P5.4口接LED測試發現ADC轉換函數未采樣出數值。
單片機代碼如下:
#include    "STC8xxxx.h"       //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復定義
#include    "intrins.h"
#include    "math.h"
#define     MAIN_Fosc       24000000L   //定義主時鐘
#define    Timer0_Reload    (MAIN_Fosc / 1000)        //Timer 0 中斷頻率, 1000次/秒
#define    Timer1_Reload    (MAIN_Fosc / 1000)        //Timer 1 中斷頻率, 1000次/秒
#define     Vref     5


/****************************** 用戶定義宏 ***********************************/

#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)

/*****************************************************************************/


#define DIS_DOT     0x20
#define DIS_BLACK   0x10
#define DIS_        0x11

sbit DS = P1^7;                //串行輸入
sbit ST = P1^6;                //鎖存時鐘
sbit SH = P1^5;                //串行輸入時鐘
sbit COM1 = P1^2;            //數碼管公共端COM1
sbit COM2 = P1^3;            //數碼管公共端COM2
sbit COM3 = P1^4;            //數碼管公共端COM3
sbit LED = P5^4;
u16 temperature;

            //         0    1    2    3     4      5       6    7    8    9   0.   1.   2.   3.   4.   5.   6.   7.   8.   9.    A    B    C    D    E    F     
u8 SEG_Code[29] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x88,0x83,0xc6,0xa1,0x86,0x8e,        //共陽數碼管段碼:0~F,   
                                        0xFF,0xBF,0x00};    //數碼管全滅(17),橫桿-(18),數碼管全亮(19)

void  delayms(u16 ms)        //簡單延時函數,自適應主頻,1毫秒*ms
{
    u16 i;
    do{
            i = MAIN_Fosc / 15000;
            while(--i);
        }while(--ms);
}


/*************  本地變量聲明    **************/

bit B_1ms;          //1ms標志
u16 msecond;

/*************  本地函數聲明    **************/
u16 get_temperature(u16 adc);
u16 Get_ADC10bitResult(u8 channel); //channel = 0~15
void Write595();
void DisplayScan();


/**********************************************/
void main(void)
{
    u16 j;
    P1M1 = 0x03;P1M0 = 0x1C;        //設置P1口模式 00:準雙向口 01:推挽輸出 10:高阻輸入 11:開漏輸出
    P3M1 = 0x14;P3M0 = 0x28;        //設置P3口模式 00:準雙向口 01:推挽輸出 10:高阻輸入 11:開漏輸出  0001 0100      
    P5M1 = 0x00;P5M0 = 0x10;        //設置P5口模式 00:準雙向口 01:推挽輸出 10:高阻輸入 11:開漏輸出  0010 1000

        ADC_CONTR = 0x81;
    P_SW2 |= 0x80;
        ADCTIM = 0x3f;                //設置 ADC 內部時序,ADC采樣時間建議設最大值
        P_SW2 &= 0x7f;
        ADCCFG = 0x2f;                //設置 ADC 時鐘為系統時鐘/2/16/16
        ADC_CONTR |= 0x80; //使能 ADC 模塊

    AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
    TH0 = (u8)(Timer0_Reload / 256);
    TL0 = (u8)(Timer0_Reload % 256);
    ET0 = 1;    //Timer0 interrupt enable
    TR0 = 1;    //Tiner0 run
    EA = 1;     //打開總中斷
    LED = 0;

    while(1)
    {
        if(B_1ms)   //1ms到
        {
            B_1ms = 0;
            if(++msecond >= 300)    //300ms到
            {
                msecond = 0;

                j = Get_ADC10bitResult(1);  //參數0~15,查詢方式做一次ADC, 返回值就是結果, == 1024 為錯誤

                if(j < 1024)
                    temperature = get_temperature(j); //計算溫度值
            }
        }

    }
}
/**********************************************/

//========================================================================
// 函數: u16 Get_ADC10bitResult(u8 channel)
// 描述: 查詢法讀一次ADC結果.
// 參數: channel: 選擇要轉換的ADC.
// 返回: 10位ADC結果.
// 版本: V1.0, 2012-10-22
//========================================================================
u16 Get_ADC10bitResult(u8 channel)  //channel = 0~15
{  
    u16 ADC_Data = 0;
    ADC_RES = 0;
    ADC_RESL = 0;

    ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //啟動 AD 轉換
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ADC_CONTR|=0x01;
    while((ADC_CONTR & 0x20) == 0)  ;   //wait for ADC finish
    ADC_CONTR &= ~0x20;     //清除ADC結束標志
    ADC_Data = ((u16)(ADC_RES << 8) | ADC_RESL);
    if(ADC_Data != 0)
        LED = 1;
    return ADC_Data;
}

void Write595(u8 dat)                  //向595寫數據函數
{
    u16 i;
    u8 datcode;
    datcode = SEG_Code[dat];           //十進制數轉段碼
    for(i = 0;i < 8;i++)               //寫數據
    {
        SH = 0;                        //拉低串行輸入時鐘SCLK
        DS = datcode & 0x80;           //取最高位
        SH = 1;                        //SCKL時鐘上升沿,數據存移位寄存器
     datcode <<= 1;                    //每次一位
    }
    ST = 0;                            //拉低ST時鐘
    ST = 1;                            //ST時鐘上升沿,更新輸出存儲器數據
}

//顯示掃描函數
void DisplayScan(void)
{   
    while(1)
    {
        Write595((u8)(temperature%1000/100));     //顯示00-999計數百位
        COM1 = 0;
        COM2 = 0;
        COM3 = 1;                    //共陽極數碼管,公共端給高電平點亮,點亮數碼管左起第1位
        delayms(3);                                    //延時3毫秒

        Write595((u8)(temperature%100/10)+10);    //顯示00-999計數十位
        COM1 = 0;
        COM2 = 1;
        COM3 = 0;                    //共陽極數碼管,公共端給高電平點亮,點亮數碼管左起第2位
        delayms(3);                                    //延時3毫秒

        Write595((u8)(temperature%10));           //顯示00-999計數個位
        COM1 = 1;
        COM2 = 0;
        COM3 = 0;                    //共陽極數碼管,公共端給高電平點亮,點亮數碼管左起第3位
        delayms(3);                                    //延時3毫秒        
    }
}

//  MF52E 10K at 25, B = 3950, ADC = 12 bits
u16 code temp_table[]={
        140,    //;-40  0
        149,    //;-39  1
        159,    //;-38  2
        168,    //;-37  3
        178,    //;-36  4
        188,    //;-35  5
        199,    //;-34  6
        210,    //;-33  7
        222,    //;-32  8
        233,    //;-31  9
        246,    //;-30  10
        259,    //;-29  11
        272,    //;-28  12
        286,    //;-27  13
        301,    //;-26  14
        317,    //;-25  15
        333,    //;-24  16
        349,    //;-23  17
        367,    //;-22  18
        385,    //;-21  19
        403,    //;-20  20
        423,    //;-19  21
        443,    //;-18  22
        464,    //;-17  23
        486,    //;-16  24
        509,    //;-15  25
        533,    //;-14  26
        558,    //;-13  27
        583,    //;-12  28
        610,    //;-11  29
        638,    //;-10  30
        667,    //;-9   31
        696,    //;-8   32
        727,    //;-7   33
        758,    //;-6   34
        791,    //;-5   35
        824,    //;-4   36
        858,    //;-3   37
        893,    //;-2   38
        929,    //;-1   39
        965,    //;0    40
        1003,   //;1    41
        1041,   //;2    42
        1080,   //;3    43
        1119,   //;4    44
        1160,   //;5    45
        1201,   //;6    46
        1243,   //;7    47
        1285,   //;8    48
        1328,   //;9    49
        1371,   //;10   50
        1414,   //;11   51
        1459,   //;12   52
        1503,   //;13   53
        1548,   //;14   54
        1593,   //;15   55
        1638,   //;16   56
        1684,   //;17   57
        1730,   //;18   58
        1775,   //;19   59
        1821,   //;20   60
        1867,   //;21   61
        1912,   //;22   62
        1958,   //;23   63
        2003,   //;24   64
        2048,   //;25   65
        2093,   //;26   66
        2137,   //;27   67
        2182,   //;28   68
        2225,   //;29   69
        2269,   //;30   70
        2312,   //;31   71
        2354,   //;32   72
        2397,   //;33   73
        2438,   //;34   74
        2479,   //;35   75
        2519,   //;36   76
        2559,   //;37   77
        2598,   //;38   78
        2637,   //;39   79
        2675,   //;40   80
        2712,   //;41   81
        2748,   //;42   82
        2784,   //;43   83
        2819,   //;44   84
        2853,   //;45   85
        2887,   //;46   86
        2920,   //;47   87
        2952,   //;48   88
        2984,   //;49   89
        3014,   //;50   90
        3044,   //;51   91
        3073,   //;52   92
        3102,   //;53   93
        3130,   //;54   94
        3157,   //;55   95
        3183,   //;56   96
        3209,   //;57   97
        3234,   //;58   98
        3259,   //;59   99
        3283,   //;60   100
        3306,   //;61   101
        3328,   //;62   102
        3351,   //;63   103
        3372,   //;64   104
        3393,   //;65   105
        3413,   //;66   106
        3432,   //;67   107
        3452,   //;68   108
        3470,   //;69   109
        3488,   //;70   110
        3506,   //;71   111
        3523,   //;72   112
        3539,   //;73   113
        3555,   //;74   114
        3571,   //;75   115
        3586,   //;76   116
        3601,   //;77   117
        3615,   //;78   118
        3628,   //;79   119
        3642,   //;80   120
        3655,   //;81   121
        3667,   //;82   122
        3679,   //;83   123
        3691,   //;84   124
        3702,   //;85   125
        3714,   //;86   126
        3724,   //;87   127
        3735,   //;88   128
        3745,   //;89   129
        3754,   //;90   130
        3764,   //;91   131
        3773,   //;92   132
        3782,   //;93   133
        3791,   //;94   134
        3799,   //;95   135
        3807,   //;96   136
        3815,   //;97   137
        3822,   //;98   138
        3830,   //;99   139
        3837,   //;100  140
        3844,   //;101  141
        3850,   //;102  142
        3857,   //;103  143
        3863,   //;104  144
        3869,   //;105  145
        3875,   //;106  146
        3881,   //;107  147
        3887,   //;108  148
        3892,   //;109  149
        3897,   //;110  150
        3902,   //;111  151
        3907,   //;112  152
        3912,   //;113  153
        3917,   //;114  154
        3921,   //;115  155
        3926,   //;116  156
        3930,   //;117  157
        3934,   //;118  158
        3938,   //;119  159
        3942    //;120  160
};

/********************  計算溫度 ***********************************************/
// 計算結果: 0對應-40.0度, 400對應0度, 625對應25.0度, 最大1600對應120.0度.
// 為了通用, ADC輸入為12bit的ADC值.
// 電路和軟件算法設計: Coody
/**********************************************/

#define     D_SCALE     10      //結果放大倍數, 放大10倍就是保留一位小數
u16 get_temperature(u16 adc)
{
    u16 code *p;
    u16 i;
    u8  j,k,min,max;

    adc = 1024 - adc;   //Rt接地
    p = temp_table;
    if(adc < p[0])      return (0xfffe);
    if(adc > p[160])    return (0xffff);

    min = 0;        //-40度
    max = 160;      //120度

    for(j=0; j<5; j++)  //對分查表
    {
        k = min / 2 + max / 2;
        if(adc <= p[k]) max = k;
        else            min = k;
    }
         if(adc == p[min])  i = min * D_SCALE;
    else if(adc == p[max])  i = max * D_SCALE;
    else    // min < temp < max
    {
        while(min <= max)
        {
            min++;
            if(adc == p[min])   {i = min * D_SCALE; break;}
            else if(adc < p[min])
            {
                min--;
                i = p[min]; //min
                j = (adc - i) * D_SCALE / (p[min+1] - i);
                i = min;
                i *= D_SCALE;
                i += j;
                break;
            }
        }
    }
    return i;
}




/********************** Timer0 1ms中斷函數 ************************/
void timer0 (void) interrupt 1
{
    DisplayScan();  //1ms掃描顯示一位
    B_1ms = 1;      //1ms標志
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2023-4-27 06:05 | 只看該作者
由于你DisplayScan函數中用了死循環while(1)并放在中斷中運行,一旦進入中斷就再也出不來。
回復

使用道具 舉報

板凳
ID:155507 發表于 2023-4-27 08:27 | 只看該作者
你的顯示掃描函數有問題。


//顯示掃描函數
void DisplayScan(void)
{   
    while(1) <---------------- 進了中斷,就不出來了。
    {
        Write595((u8)(temperature%1000/100));     //顯示00-999計數百位
        COM1 = 0;
        COM2 = 0;
        COM3 = 1;                    //共陽極數碼管,公共端給高電平點亮,點亮數碼管左起第1位
        delayms(3);                                    //延時3毫秒
/********************** Timer0 1ms中斷函數 ************************/
void timer0 (void) interrupt 1
{
    DisplayScan();  //1ms掃描顯示一位
    B_1ms = 1;      //1ms標志
}
回復

使用道具 舉報

地板
ID:1034262 發表于 2023-4-27 10:10 | 只看該作者
因為你的程序永遠在中斷里調用的 DisplayScan(),不退出,根本就沒有運行其余程序。
回復

使用道具 舉報

5#
ID:883242 發表于 2023-4-27 15:09 | 只看該作者
運算放主循環里面,中斷只負責顯示好了,最基本的編程思路都不對。
回復

使用道具 舉報

6#
ID:608427 發表于 2023-4-27 22:47 | 只看該作者
wulin 發表于 2023-4-27 06:05
由于你DisplayScan函數中用了死循環while(1)并放在中斷中運行,一旦進入中斷就再也出不來。

大佬 感激不盡 把掃描顯示調用從中斷揪到主函數 并且去掉其中的while(1)完美解決問題
回復

使用道具 舉報

7#
ID:608427 發表于 2023-4-27 22:48 | 只看該作者
angmall 發表于 2023-4-27 08:27
你的顯示掃描函數有問題。

大佬 感激不盡 問題解決了
回復

使用道具 舉報

8#
ID:608427 發表于 2023-4-27 22:48 | 只看該作者
coody_sz 發表于 2023-4-27 10:10
因為你的程序永遠在中斷里調用的 DisplayScan(),不退出,根本就沒有運行其余程序。

大佬 感激不盡 問題解決了
回復

使用道具 舉報

9#
ID:608427 發表于 2023-4-27 22:49 | 只看該作者
Hephaestus 發表于 2023-4-27 15:09
運算放主循環里面,中斷只負責顯示好了,最基本的編程思路都不對。

感謝大佬提點 問題已經解決了
回復

使用道具 舉報

10#
ID:1056945 發表于 2023-9-20 20:19 | 只看該作者
兄弟,求完整程序包
回復

使用道具 舉報

11#
ID:479851 發表于 2024-9-19 20:05 | 只看該作者
鐵汁,有沒有完整程序包拿來研究研究
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一道本视频 | 国产精品毛片久久久久久久 | www一级片 | 亚洲精品v日韩精品 | 国产高清视频一区二区 | 久久毛片 | www.男人天堂.com | 狼色网| 999久久久久久久久6666 | 99精品久久久 | 激情 一区 | 成人免费在线观看视频 | 精品乱子伦一区二区三区 | 台湾佬成人网 | 亚洲国产成人精品女人久久久野战 | 国产精品久久久久久久久免费桃花 | 国产人成精品一区二区三 | 亚洲一卡二卡 | 色综合一区二区 | 国产成人在线视频 | 狠狠干五月天 | 99免费精品| 草草视频在线观看 | 亚洲人成在线播放 | 欧美中文一区 | 国产精品亚洲综合 | 黄色一级毛片 | 亚洲男人的天堂网站 | 国产色播av在线 | 人人干天天干 | 亚洲精品视频一区 | 狠狠亚洲| 永久免费av | 中文字幕av在线播放 | 99视频网站 | 国产精品一区二区三区久久 | 亚洲欧美国产精品久久 | 91夜夜夜| 亚洲乱码国产乱码精品精98午夜 | 国产精品二区三区在线观看 | 精精国产xxxx视频在线播放 |