標(biāo)題: 用STC8G1K08單片機(jī)的P1.1口采集NTC溫度顯示000 還請大佬抽空幫忙看看問題所在 [打印本頁]

作者: asdfasdfa    時間: 2023-4-26 23:28
標(biāo)題: 用STC8G1K08單片機(jī)的P1.1口采集NTC溫度顯示000 還請大佬抽空幫忙看看問題所在



原理圖如上,測試STC8G1K08的NTC溫度采樣,3位數(shù)碼管始終顯示000。P5.4口接LED測試發(fā)現(xiàn)ADC轉(zhuǎn)換函數(shù)未采樣出數(shù)值。
單片機(jī)代碼如下:
#include    "STC8xxxx.h"       //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復(fù)定義
#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;            //數(shù)碼管公共端COM1
sbit COM2 = P1^3;            //數(shù)碼管公共端COM2
sbit COM3 = P1^4;            //數(shù)碼管公共端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,        //共陽數(shù)碼管段碼:0~F,   
                                        0xFF,0xBF,0x00};    //數(shù)碼管全滅(17),橫桿-(18),數(shù)碼管全亮(19)

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


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

bit B_1ms;          //1ms標(biāo)志
u16 msecond;

/*************  本地函數(shù)聲明    **************/
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;        //設(shè)置P1口模式 00:準(zhǔn)雙向口 01:推挽輸出 10:高阻輸入 11:開漏輸出
    P3M1 = 0x14;P3M0 = 0x28;        //設(shè)置P3口模式 00:準(zhǔn)雙向口 01:推挽輸出 10:高阻輸入 11:開漏輸出  0001 0100      
    P5M1 = 0x00;P5M0 = 0x10;        //設(shè)置P5口模式 00:準(zhǔn)雙向口 01:推挽輸出 10:高阻輸入 11:開漏輸出  0010 1000

        ADC_CONTR = 0x81;
    P_SW2 |= 0x80;
        ADCTIM = 0x3f;                //設(shè)置 ADC 內(nèi)部時序,ADC采樣時間建議設(shè)最大值
        P_SW2 &= 0x7f;
        ADCCFG = 0x2f;                //設(shè)置 ADC 時鐘為系統(tǒng)時鐘/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);  //參數(shù)0~15,查詢方式做一次ADC, 返回值就是結(jié)果, == 1024 為錯誤

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

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

//========================================================================
// 函數(shù): u16 Get_ADC10bitResult(u8 channel)
// 描述: 查詢法讀一次ADC結(jié)果.
// 參數(shù): channel: 選擇要轉(zhuǎn)換的ADC.
// 返回: 10位ADC結(jié)果.
// 版本: 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 轉(zhuǎn)換
    _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結(jié)束標(biāo)志
    ADC_Data = ((u16)(ADC_RES << 8) | ADC_RESL);
    if(ADC_Data != 0)
        LED = 1;
    return ADC_Data;
}

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

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

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

        Write595((u8)(temperature%10));           //顯示00-999計數(shù)個位
        COM1 = 1;
        COM2 = 0;
        COM3 = 0;                    //共陽極數(shù)碼管,公共端給高電平點亮,點亮數(shù)碼管左起第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
};

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

#define     D_SCALE     10      //結(jié)果放大倍數(shù), 放大10倍就是保留一位小數(shù)
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中斷函數(shù) ************************/
void timer0 (void) interrupt 1
{
    DisplayScan();  //1ms掃描顯示一位
    B_1ms = 1;      //1ms標(biāo)志
}

作者: wulin    時間: 2023-4-27 06:05
由于你DisplayScan函數(shù)中用了死循環(huán)while(1)并放在中斷中運行,一旦進(jìn)入中斷就再也出不來。
作者: angmall    時間: 2023-4-27 08:27
你的顯示掃描函數(shù)有問題。


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

作者: coody_sz    時間: 2023-4-27 10:10
因為你的程序永遠(yuǎn)在中斷里調(diào)用的 DisplayScan(),不退出,根本就沒有運行其余程序。
作者: Hephaestus    時間: 2023-4-27 15:09
運算放主循環(huán)里面,中斷只負(fù)責(zé)顯示好了,最基本的編程思路都不對。
作者: asdfasdfa    時間: 2023-4-27 22:47
wulin 發(fā)表于 2023-4-27 06:05
由于你DisplayScan函數(shù)中用了死循環(huán)while(1)并放在中斷中運行,一旦進(jìn)入中斷就再也出不來。

大佬 感激不盡 把掃描顯示調(diào)用從中斷揪到主函數(shù) 并且去掉其中的while(1)完美解決問題
作者: asdfasdfa    時間: 2023-4-27 22:48
angmall 發(fā)表于 2023-4-27 08:27
你的顯示掃描函數(shù)有問題。

大佬 感激不盡 問題解決了
作者: asdfasdfa    時間: 2023-4-27 22:48
coody_sz 發(fā)表于 2023-4-27 10:10
因為你的程序永遠(yuǎn)在中斷里調(diào)用的 DisplayScan(),不退出,根本就沒有運行其余程序。

大佬 感激不盡 問題解決了
作者: asdfasdfa    時間: 2023-4-27 22:49
Hephaestus 發(fā)表于 2023-4-27 15:09
運算放主循環(huán)里面,中斷只負(fù)責(zé)顯示好了,最基本的編程思路都不對。

感謝大佬提點 問題已經(jīng)解決了
作者: 菜鳥123321    時間: 2023-9-20 20:19
兄弟,求完整程序包
作者: 143914885    時間: 2024-9-19 20:05
鐵汁,有沒有完整程序包拿來研究研究




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1