找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 786|回复: 2
收起左侧

STC15W408AS的NTC温度计修改为STC8H1K24的温度计,哪里不对?

[复制链接]
ID:72649 发表于 2023-11-26 10:48 | 显示全部楼层 |阅读模式
/***************************************/
/*   基于STC15W408AS的NTC温度计设计    */
/*       测温范围-40°~110°          */
/***************************************/
//3位共阳极数码管段码a-h顺序接P27-P20,位选端接P14 P15 P33
//NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
//NTC温度输出端子接P1.7
// 基于STC15W408AS的NTC温度计设计修改为STC8H1K24的NTC温度计
数码管共阳,段码P2,位选P14 P15 P33
//#include "reg52.h"
#include "STC8H.h"
#include "intrins.h"
//声明增加的寄存器地址
//sfr AUXR = 0x8e;         //辅助寄存器   
//sfr P3M0 = 0xB2;         //P3口引脚模式寄存器
//sfr P2M0 = 0x96;         //P2口引脚模式寄存器
//sfr P1M0 = 0x92;         //P1口引脚模式寄存器

//sfr ADC_CONTR = 0xBC;//A/D 转换控制寄存器 ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000
//sfr ADC_RES   = 0xBD;//A/D 转换结果高8位  ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2;0000,0000
//sfr ADC_RESL  = 0xBE;//A/D 转换结果低2位                                            ADCV.1 ADCV.0;0000,0000
//sfr P1ASF          = 0x9D;//P1引脚功能选择寄存器

#define ADC_POWER        0x80        //ADC电源控制位
#define ADC_FLAG        0x10        //ADC完成标志位
#define ADC_START        0x08        //ADC启动控制位
#define ADC_SPEED0        0x00        //ADC转换速度,一次转换需要540个时钟
#define ADC_SPEED1        0x20        //ADC转换速度,一次转换需要360个时钟
#define ADC_SPEED2        0x40        //ADC转换速度,一次转换需要180个时钟
#define ADC_SPEED3        0x60        //ADC转换速度,一次转换需要90个时钟

#define N 8        //ADC采样使用递推平均滤波算法,采样次数

//sbit Beep= P1^0;        //fengmingqi
//sbit K1  = P1^1;
//sbit K2  = P1^2;
//sbit K3  = P1^3;

sbit Beep= P3^2;        //fengmingqi
sbit K1  = P1^1;
sbit K2  = P1^2;
sbit K3  = P1^3;
sbit K4  = P1^4;
sbit shezhi  = P1^5;
sbit up  = P3^3;
sbit dowm  = P5^4;
sbit Key_com = P0^2;
/*共阳极数码管*/
unsigned char code Table[]={        
        0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/
        0x11,/*A*/
        0xC1,/*b*/
        0x63,/*C*/
        0x85,/*d*/
        0x61,/*E*/
        0x71,/*F*/
        0xFD,/*-*/
  0x00};/*灭*/

//unsigned char Show[4]={0,0,0,0};        //显示数组
unsigned char Show[4]={0,0,0};        //显示数组
unsigned int  Temp_Buf[N+1];                //采样数组
unsigned char Ledcount,ADCcount;        //数码管显示计数变量,ADC采样次数变量
/*************************************
NTC阻值与温度关系表
Vcc---NTC(±1%)---R(10K±1%)---GND
                |
              ADC端子
NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
**************************************/
unsigned int code NTCcode[] = {
/*ADC采样值****温度值*******电阻值**********/        
        0x033,        // -40.00                190.5562
        0x034,        // -39.00                183.4132
        0x037,        // -38.00                175.6740
        0x039,        // -37.00                167.6467
        0x03c,        // -36.00                159.5647
        0x03f,        // -35.00                151.5975
        0x042,        // -34.00                143.8624
        0x045,        // -33.00                136.4361
        0x049,        // -32.00                129.3641
        0x04d,        // -31.00                122.6678
        0x050,        // -30.00                116.3519
        0x054,        // -29.00                110.4098
        0x059,        // -28.00                104.8272
        0x05d,        // -27.00                99.5847
        0x061,        // -26.00                94.6608
        0x066,        // -25.00                90.0326
        0x06a,        // -24.00                85.6778
        0x06f,        // -23.00                81.5747
        0x074,        // -22.00                77.7031
        0x079,        // -21.00                74.0442
        0x07e,        // -20.00                70.5811
        0x084,        // -19.00                67.2987
        0x089,        // -18.00                64.1834
        0x08f,        // -17.00                61.2233
        0x095,        // -16.00                58.4080
        0x09b,        // -15.00                55.7284
        0x0a1,        // -14.00                53.1766
        0x0a8,        // -13.00                50.7456
        0x0af,        // -12.00                48.4294
        0x0b5,        // -11.00                46.2224
        0x0bd,        // -10.00                44.1201
        0x0c4,        // -9.00                42.1180
        0x0cb,        // -8.00                40.2121
        0x0d3,        // -7.00                38.3988
        0x0db,        // -6.00                36.6746
        0x0e3,        // -5.00                35.0362
        0x0eb,        // -4.00                33.4802
        0x0f3,        // -3.00                32.0035
        0x0fb,        // -2.00                30.6028
        0x0104,        // -1.00                29.2750
        0x010d,        // 0.00                28.0170
        0x0115,        // 1.00                26.8255
        0x011e,        // 2.00                25.6972
        0x0127,        // 3.00                24.6290
        0x0130,        // 4.00                23.6176
        0x0139,        // 5.00                22.6597
        0x0142,        // 6.00                21.7522
        0x014b,        // 7.00                20.8916
        0x0154,        // 8.00                20.0749
        0x015d,        // 9.00                19.2988
        0x0166,        // 10.00                18.5600
        0x0167,        // 11.00                18.4818
        0x016b,        // 12.00                18.1489
        0x0172,        // 13.00                17.6316
        0x017b,        // 14.00                16.9917
        0x0185,        // 15.00                16.2797
        0x0190,        // 16.00                15.5350
        0x019c,        // 17.00                14.7867
        0x01a9,        // 18.00                14.0551
        0x01b6,        // 19.00                13.3536
        0x01c2,        // 20.00                12.6900
        0x01cf,        // 21.00                12.0684
        0x01dc,        // 22.00                11.4900
        0x01e8,        // 23.00                10.9539
        0x01f4,        // 24.00                10.4582
        0x01ff,        // 25.00                10.0000
        0x020a,        // 26.00                9.5762
        0x0215,        // 27.00                9.1835
        0x021f,        // 28.00                8.8186
        0x0229,        // 29.00                8.4784
        0x0233,        // 30.00                8.1600
        0x023c,        // 31.00                7.8608
        0x0245,        // 32.00                7.5785
        0x024e,        // 33.00                7.3109
        0x0257,        // 34.00                7.0564
        0x0260,        // 35.00                6.8133
        0x0268,        // 36.00                6.5806
        0x0271,        // 37.00                6.3570
        0x0279,        // 38.00                6.1418
        0x0282,        // 39.00                5.9343
        0x028a,        // 40.00                5.7340
        0x0292,        // 41.00                5.5405
        0x029a,        // 42.00                5.3534
        0x02a2,        // 43.00                5.1725
        0x02aa,        // 44.00                4.9976
        0x02b1,        // 45.00                4.8286
        0x02b9,        // 46.00                4.6652
        0x02c1,        // 47.00                4.5073
        0x02c8,        // 48.00                4.3548
        0x02d0,        // 49.00                4.2075
        0x02d7,        // 50.00                4.0650
        0x02de,        // 51.00                3.9271
        0x02e5,        // 52.00                3.7936
        0x02ec,        // 53.00                3.6639
        0x02f3,        // 54.00                3.5377
        0x02fa,        // 55.00                3.4146
        0x0301,        // 56.00                3.2939
        0x0308,        // 57.00                3.1752
        0x030f,        // 58.00                3.0579
        0x0316,        // 59.00                2.9414
        0x031d,        // 60.00                2.8250
        0x0320,        // 61.00                2.7762
        0x0324,        // 62.00                2.7179
        0x0328,        // 63.00                2.6523
        0x032d,        // 64.00                2.5817
        0x0331,        // 65.00                2.5076
        0x0336,        // 66.00                2.4319
        0x033b,        // 67.00                2.3557
        0x0341,        // 68.00                2.2803
        0x0346,        // 69.00                2.2065
        0x034b,        // 70.00                2.1350
        0x034f,        // 71.00                2.0661
        0x0354,        // 72.00                2.0004
        0x0358,        // 73.00                1.9378
        0x035d,        // 74.00                1.8785
        0x0361,        // 75.00                1.8225
        0x0365,        // 76.00                1.7696
        0x0368,        // 77.00                1.7197
        0x036c,        // 78.00                1.6727
        0x036f,        // 79.00                1.6282
        0x0372,        // 80.00                1.5860
        0x0376,        // 81.00                1.5458
        0x0378,        // 82.00                1.5075
        0x037b,        // 83.00                1.4707
        0x037e,        // 84.00                1.4352
        0x0381,        // 85.00                1.4006
        0x0383,        // 86.00                1.3669
        0x0386,        // 87.00                1.3337
        0x0389,        // 88.00                1.3009
        0x038b,        // 89.00                1.2684
        0x038e,        // 90.00                1.2360
        0x0391,        // 91.00                1.2037
        0x0393,        // 92.00                1.1714
        0x0396,        // 93.00                1.1390
        0x0399,        // 94.00                1.1067
        0x039b,        // 95.00                1.0744
        0x039e,        // 96.00                1.0422
        0x03a1,        // 97.00                1.0104
        0x03a3,        // 98.00                0.9789
        0x03a6,        // 99.00                0.9481
        0x03a8,        // 100.00                0.9180
        0x03ab,        // 101.00                0.8889
        0x03ad,        // 102.00                0.8610
        0x03b0,        // 103.00                0.8346
        0x03b2,        // 104.00                0.8099
        0x03b4,        // 105.00                0.7870
        0x03b6,        // 106.00                0.7665
        0x03b7,        // 107.00                0.7485
        0x03b9,        // 108.00                0.7334
        0x03ba,        // 109.00                0.7214
        0x03ba        // 110.00                0.7130
};
/******************************
函数说明:延时函数,执行一次1毫秒,STC_ISP_V6.21软件给出
入口参数:i=延时毫秒数
出口参数:无
******************************/
void Delay_MS(unsigned int ms)
{
        unsigned char i, j;
        while(ms--)
        {
                i = 6;        j = 211;
                do{
                        while (--j);
                } while (--i);
        }
}

/******************************
函数说明:初始化ADC寄存器,设置P1.7为ADC输入功能
入口参数:无
出口参数:无
******************************/
void Init_ADC(void)
{
//  P1ASF = 0x80;                //打开P1.7口的ADC功能
        
        ADC_RES = 0;        
        ADC_RESL= 0;                //清掉ADC转换结果寄存器
//    ADC_CONTR = ADC_POWER | ADC_SPEED3;        //使能A/D供电,设置转换速度90T
        ADC_CONTR = ADC_POWER |  ADC_START |  ADC_FLAG     ;          //1110 0111       P17 0111  P16 0110
        ADCCFG =   0x00;            //0000   0000  左对齐,SYSclk/2/1
}

/******************************
函数说明:查询方式读取ADC转换结果
入口参数:ch  ADC采样通道
出口参数:int ADC_RES ADC转换结果
******************************/
unsigned int Get_ADC_Result(unsigned char ch)
{
        unsigned int result;
        ADC_RES = 0;        
        ADC_RESL= 0;                                        //清掉ADC转换结果寄存器
//        ADC_CONTR =ADC_POWER|ADC_SPEED3|ch|ADC_START;//配置ADC,设置转换通道,启动转换
                ADC_CONTR =ADC_POWER|ch|ADC_START;//配置ADC,设置转换通道,启动转换
          ADCCFG =   0x00;
    _nop_();        _nop_();
    _nop_();        _nop_();                        //等待设置ADC_POWER完毕
    while (!(ADC_CONTR & ADC_FLAG));//读取转换完毕标志位ADC_FLAG
    ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG标志位
        result = ADC_RES<<2|ADC_RESL;        //读取10位转换结果保存到result
    return result;                  //返回ADC转换结果10位
}
/******************************
函数说明:获取温度值
入口参数:无
出口参数:无
******************************/
void Get_Temp(void)
{
        unsigned char xx;
        unsigned int sum,tempvalue;
        sum = tempvalue =0;        
        Temp_Buf[N]=Get_ADC_Result(7);        //将ADC转换结果放数组最高位
        if( ++ADCcount < 8)                //采样初期不使用滤波算法
        {        
                for(xx=0;xx<N;xx++)        //准备滤波算法的数据
                {
                        Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
                }
                tempvalue=Temp_Buf[N];//采样初期使用当前采样值
        }
        else         //只有采样次数大于8次以后才使用滤波算法        
        {
                ADCcount=8;        //采样次数超过8次后,固定设置为8
                for(xx=0;xx<N;xx++)        //滤波算法
                {
                        Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
                        sum+=Temp_Buf[xx];        //求和
                }
                tempvalue=sum/N;                //求平均值               
        }        
        xx=0;
        while( tempvalue > NTCcode[xx] )        //将当前温度值与温度表对比,得到所在位置
        {        xx++;        }

        tempvalue=xx*10 + (tempvalue*10 - NTCcode[xx-1]*10)/( NTCcode[xx] - NTCcode[xx-1] );
        //插值法计算温度,将数据全部扩大10倍,使小数变为整数

        //tempvalue=tempvalue-30;//修正温度,比正常高3.0度(扩大10倍为30)

        if(tempvalue>400)        //正温度(大于0度)
        {
                tempvalue=tempvalue-400;        //取得0°以上温度
                if(tempvalue>999)//大于100度显示最高位
                        Show[0]=Table[tempvalue/1000];
                else                         //小于100度不显示最高位
                        Show[0]=Table[17];
                Show[1]=Table[tempvalue%1000/100];        //十位
                Show[2]=Table[tempvalue%100/10]|0x01;//个位加小数点
                Show[3]=Table[tempvalue%10];        //小数位
        }
        else        //负温度(小于0度)
        {
                tempvalue=410-tempvalue;        //取得0°以下温度
                //插值法计算温度,将数据全部扩大10倍,使小数变为整数,+5是四舍五入
                Show[0]=Table[16];                //显示负号-
                Show[1]=Table[tempvalue/100];
                Show[2]=Table[tempvalue%100/10]|0x01;//加小数点
                Show[3]=Table[tempvalue%10];
        }
}

void Timer0Init(void)//定时器0,方式0(16位自动重装),2毫秒@6.000MHz
{
        AUXR &= 0x7F;        //定时器时钟12T模式
        TMOD &= 0xF0;        //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

//Time0扫描LED显示驱动,计时,2ms
void time0(void) interrupt 1
{
        if(4==++Ledcount)
                Ledcount=0;
          P1 = 0xcf;               //关闭显示,P14 P15  1100  1111   
          P3 = 0xf7;                                //关闭显示,P33     1111 0111
//        P2 = ~Show[Ledcount];                //送段码,使用共阳极数码管
//        P3 = 0x10<<Ledcount;                //选择位选   
                P2 = Show[Ledcount];                //送段码,使用共阳极数码管
}

void IO_init()
{
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x80;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
}

void main(void)
{
        Init_ADC();                //初始化ADC
        Timer0Init();        //设置T0用作数码管显示定时2ms扫描,中断模式
//        P2M0=0xff;                //推挽输出驱动共阳极数码管
//        P3M0=0xf0;                //推挽输出驱动4个三极管
//        P1M0=0x01;                //P1.0推挽输出驱动fengmingqi
  IO_init();
        Beep=1;
        Ledcount=0;                //LED扫描显示计数用
        ADCcount=0;                //ADC采样次数        

        ET0=1;                        //允许T0定时中断
        EA=1;
        while(1)
        {
                Get_Temp();        //获取温度值
                //Beep=1;
                Delay_MS(50);
                //Beep=0;
                Delay_MS(950);        
        }
}


回复

使用道具 举报

ID:213173 发表于 2023-11-26 16:33 | 显示全部楼层
ADC部分改好了,你试试。
  1. /***************************************/
  2. /*   基于STC15W408AS的NTC温度计设计    */
  3. /*       测温范围-40°~110°          */
  4. /***************************************/
  5. //3位共阳极数码管段码a-h顺序接P27-P20,位选端接P14 P15 P33
  6. //NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
  7. //NTC温度输出端子接P1.7
  8. // 基于STC15W408AS的NTC温度计设计修改为STC8H1K24的NTC温度计
  9. //数码管共阳,段码P2,位选P14 P15 P33
  10. //#include "reg52.h"
  11. #include "STC8H.h"
  12. #include "intrins.h"

  13. #define ADC_POWER   0x80                        //ADC power control dit (宏定义ADC电源控制位)1000 0000
  14. #define ADC_START   0x40                        //ADC start control dit (宏定义ADC启动控制位)0100 0000
  15. #define ADC_FLAG    0x20                        //ADC complete flag (宏定义ADC完成标志位)    0010 0000
  16. #define ADC_EPWMT   0x10                        //使能 PWM  实时触发 ADC                     0001 0000
  17. #define N 8        //ADC采样使用递推平均滤波算法,采样次数

  18. //sbit Beep= P1^0;        //fengmingqi
  19. //sbit K1  = P1^1;
  20. //sbit K2  = P1^2;
  21. //sbit K3  = P1^3;

  22. sbit Beep= P3^2;        //fengmingqi
  23. sbit K1  = P1^1;
  24. sbit K2  = P1^2;
  25. sbit K3  = P1^3;
  26. sbit K4  = P1^4;
  27. sbit shezhi  = P1^5;
  28. sbit up  = P3^3;
  29. sbit dowm  = P5^4;
  30. sbit Key_com = P0^2;
  31. /*共阳极数码管*/
  32. unsigned char code Table[]={        
  33.         0x03,/*0*/
  34.         0x9F,/*1*/
  35.         0x25,/*2*/
  36.         0x0D,/*3*/
  37.         0x99,/*4*/
  38.         0x49,/*5*/
  39.         0x41,/*6*/
  40.         0x1F,/*7*/
  41.         0x01,/*8*/
  42.         0x09,/*9*/
  43.         0x11,/*A*/
  44.         0xC1,/*b*/
  45.         0x63,/*C*/
  46.         0x85,/*d*/
  47.         0x61,/*E*/
  48.         0x71,/*F*/
  49.         0xFD,/*-*/
  50.         0x00};/*灭*/

  51. //unsigned char Show[4]={0,0,0,0};        //显示数组
  52. unsigned char Show[4]={0,0,0};        //显示数组
  53. unsigned int  Temp_Buf[N+1];                //采样数组
  54. unsigned char Ledcount,ADCcount;        //数码管显示计数变量,ADC采样次数变量
  55. /*************************************
  56. NTC阻值与温度关系表
  57. Vcc---NTC(±1%)---R(10K±1%)---GND
  58.                 |
  59.               ADC端子
  60. NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
  61. **************************************/
  62. unsigned int code NTCcode[] = {
  63. /*ADC采样值****温度值*******电阻值**********/        
  64.         0x033,        // -40.00                190.5562
  65.         0x034,        // -39.00                183.4132
  66.         0x037,        // -38.00                175.6740
  67.         0x039,        // -37.00                167.6467
  68.         0x03c,        // -36.00                159.5647
  69.         0x03f,        // -35.00                151.5975
  70.         0x042,        // -34.00                143.8624
  71.         0x045,        // -33.00                136.4361
  72.         0x049,        // -32.00                129.3641
  73.         0x04d,        // -31.00                122.6678
  74.         0x050,        // -30.00                116.3519
  75.         0x054,        // -29.00                110.4098
  76.         0x059,        // -28.00                104.8272
  77.         0x05d,        // -27.00                99.5847
  78.         0x061,        // -26.00                94.6608
  79.         0x066,        // -25.00                90.0326
  80.         0x06a,        // -24.00                85.6778
  81.         0x06f,        // -23.00                81.5747
  82.         0x074,        // -22.00                77.7031
  83.         0x079,        // -21.00                74.0442
  84.         0x07e,        // -20.00                70.5811
  85.         0x084,        // -19.00                67.2987
  86.         0x089,        // -18.00                64.1834
  87.         0x08f,        // -17.00                61.2233
  88.         0x095,        // -16.00                58.4080
  89.         0x09b,        // -15.00                55.7284
  90.         0x0a1,        // -14.00                53.1766
  91.         0x0a8,        // -13.00                50.7456
  92.         0x0af,        // -12.00                48.4294
  93.         0x0b5,        // -11.00                46.2224
  94.         0x0bd,        // -10.00                44.1201
  95.         0x0c4,        // -9.00                42.1180
  96.         0x0cb,        // -8.00                40.2121
  97.         0x0d3,        // -7.00                38.3988
  98.         0x0db,        // -6.00                36.6746
  99.         0x0e3,        // -5.00                35.0362
  100.         0x0eb,        // -4.00                33.4802
  101.         0x0f3,        // -3.00                32.0035
  102.         0x0fb,        // -2.00                30.6028
  103.         0x0104,        // -1.00                29.2750
  104.         0x010d,        // 0.00                28.0170
  105.         0x0115,        // 1.00                26.8255
  106.         0x011e,        // 2.00                25.6972
  107.         0x0127,        // 3.00                24.6290
  108.         0x0130,        // 4.00                23.6176
  109.         0x0139,        // 5.00                22.6597
  110.         0x0142,        // 6.00                21.7522
  111.         0x014b,        // 7.00                20.8916
  112.         0x0154,        // 8.00                20.0749
  113.         0x015d,        // 9.00                19.2988
  114.         0x0166,        // 10.00                18.5600
  115.         0x0167,        // 11.00                18.4818
  116.         0x016b,        // 12.00                18.1489
  117.         0x0172,        // 13.00                17.6316
  118.         0x017b,        // 14.00                16.9917
  119.         0x0185,        // 15.00                16.2797
  120.         0x0190,        // 16.00                15.5350
  121.         0x019c,        // 17.00                14.7867
  122.         0x01a9,        // 18.00                14.0551
  123.         0x01b6,        // 19.00                13.3536
  124.         0x01c2,        // 20.00                12.6900
  125.         0x01cf,        // 21.00                12.0684
  126.         0x01dc,        // 22.00                11.4900
  127.         0x01e8,        // 23.00                10.9539
  128.         0x01f4,        // 24.00                10.4582
  129.         0x01ff,        // 25.00                10.0000
  130.         0x020a,        // 26.00                9.5762
  131.         0x0215,        // 27.00                9.1835
  132.         0x021f,        // 28.00                8.8186
  133.         0x0229,        // 29.00                8.4784
  134.         0x0233,        // 30.00                8.1600
  135.         0x023c,        // 31.00                7.8608
  136.         0x0245,        // 32.00                7.5785
  137.         0x024e,        // 33.00                7.3109
  138.         0x0257,        // 34.00                7.0564
  139.         0x0260,        // 35.00                6.8133
  140.         0x0268,        // 36.00                6.5806
  141.         0x0271,        // 37.00                6.3570
  142.         0x0279,        // 38.00                6.1418
  143.         0x0282,        // 39.00                5.9343
  144.         0x028a,        // 40.00                5.7340
  145.         0x0292,        // 41.00                5.5405
  146.         0x029a,        // 42.00                5.3534
  147.         0x02a2,        // 43.00                5.1725
  148.         0x02aa,        // 44.00                4.9976
  149.         0x02b1,        // 45.00                4.8286
  150.         0x02b9,        // 46.00                4.6652
  151.         0x02c1,        // 47.00                4.5073
  152.         0x02c8,        // 48.00                4.3548
  153.         0x02d0,        // 49.00                4.2075
  154.         0x02d7,        // 50.00                4.0650
  155.         0x02de,        // 51.00                3.9271
  156.         0x02e5,        // 52.00                3.7936
  157.         0x02ec,        // 53.00                3.6639
  158.         0x02f3,        // 54.00                3.5377
  159.         0x02fa,        // 55.00                3.4146
  160.         0x0301,        // 56.00                3.2939
  161.         0x0308,        // 57.00                3.1752
  162.         0x030f,        // 58.00                3.0579
  163.         0x0316,        // 59.00                2.9414
  164.         0x031d,        // 60.00                2.8250
  165.         0x0320,        // 61.00                2.7762
  166.         0x0324,        // 62.00                2.7179
  167.         0x0328,        // 63.00                2.6523
  168.         0x032d,        // 64.00                2.5817
  169.         0x0331,        // 65.00                2.5076
  170.         0x0336,        // 66.00                2.4319
  171.         0x033b,        // 67.00                2.3557
  172.         0x0341,        // 68.00                2.2803
  173.         0x0346,        // 69.00                2.2065
  174.         0x034b,        // 70.00                2.1350
  175.         0x034f,        // 71.00                2.0661
  176.         0x0354,        // 72.00                2.0004
  177.         0x0358,        // 73.00                1.9378
  178.         0x035d,        // 74.00                1.8785
  179.         0x0361,        // 75.00                1.8225
  180.         0x0365,        // 76.00                1.7696
  181.         0x0368,        // 77.00                1.7197
  182.         0x036c,        // 78.00                1.6727
  183.         0x036f,        // 79.00                1.6282
  184.         0x0372,        // 80.00                1.5860
  185.         0x0376,        // 81.00                1.5458
  186.         0x0378,        // 82.00                1.5075
  187.         0x037b,        // 83.00                1.4707
  188.         0x037e,        // 84.00                1.4352
  189.         0x0381,        // 85.00                1.4006
  190.         0x0383,        // 86.00                1.3669
  191.         0x0386,        // 87.00                1.3337
  192.         0x0389,        // 88.00                1.3009
  193.         0x038b,        // 89.00                1.2684
  194.         0x038e,        // 90.00                1.2360
  195.         0x0391,        // 91.00                1.2037
  196.         0x0393,        // 92.00                1.1714
  197.         0x0396,        // 93.00                1.1390
  198.         0x0399,        // 94.00                1.1067
  199.         0x039b,        // 95.00                1.0744
  200.         0x039e,        // 96.00                1.0422
  201.         0x03a1,        // 97.00                1.0104
  202.         0x03a3,        // 98.00                0.9789
  203.         0x03a6,        // 99.00                0.9481
  204.         0x03a8,        // 100.00                0.9180
  205.         0x03ab,        // 101.00                0.8889
  206.         0x03ad,        // 102.00                0.8610
  207.         0x03b0,        // 103.00                0.8346
  208.         0x03b2,        // 104.00                0.8099
  209.         0x03b4,        // 105.00                0.7870
  210.         0x03b6,        // 106.00                0.7665
  211.         0x03b7,        // 107.00                0.7485
  212.         0x03b9,        // 108.00                0.7334
  213.         0x03ba,        // 109.00                0.7214
  214.         0x03ba        // 110.00                0.7130
  215. };
  216. /******************************
  217. 函数说明:延时函数,执行一次1毫秒,STC_ISP_V6.21软件给出
  218. 入口参数:i=延时毫秒数
  219. 出口参数:无
  220. ******************************/
  221. void Delay_MS(unsigned int ms)
  222. {
  223.         unsigned char i, j;
  224.         while(ms--)
  225.         {
  226.                 i = 15;
  227.                 j = 90;
  228.                 do
  229.                 {
  230.                 while (--j);
  231.                 } while (--i);
  232.         }
  233. }

  234. /******************************
  235. 函数说明:初始化ADC寄存器,设置P1.7为ADC输入功能
  236. 入口参数:无
  237. 出口参数:无
  238. ******************************/
  239. void Init_ADC(void)
  240. {        //ADC 控制器  电源  启动  完成  --   15通道模拟选择位
  241.         //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  242.         P_SW2 |= 0x80;                        //打开
  243.         ADCTIM = 0x3f;                        //设置 ADC 内部时序
  244.         P_SW2 &= 0x7f;                        //关闭
  245.         ADCCFG = 0x27;                        //设置ADC结果右对齐,速度为512系统时钟
  246.         ADC_RES=0;                                //清除ADC_RES存储器以前的结果
  247.         ADC_RESL=0;
  248.         ADC_CONTR=ADC_POWER;         //ADC 开启电源
  249.         Delay_MS(1);                                //上电延时1ms
  250. }

  251. /******************************
  252. 函数说明:查询方式读取ADC转换结果
  253. 入口参数:ch  ADC采样通道
  254. 出口参数:int ADC_RES ADC转换结果
  255. ******************************/
  256. unsigned int Get_ADC_Result(unsigned char ch)
  257. {
  258.         ADC_CONTR=ADC_POWER|ADC_START|ch;//启动转换1100 1000
  259.         _nop_();_nop_();                                //小延时
  260.         while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成标志置位 1010 0000
  261.         ADC_CONTR &=~ADC_FLAG;                        //清完成标志
  262.         return ADC_RES<<8|ADC_RESL;                //返回十位ADC结果
  263. }
  264. /******************************
  265. 函数说明:获取温度值
  266. 入口参数:无
  267. 出口参数:无
  268. ******************************/
  269. void Get_Temp(void)
  270. {
  271.         unsigned char xx;
  272.         unsigned int sum,tempvalue;
  273.         sum = tempvalue =0;        
  274.         Temp_Buf[N]=Get_ADC_Result(7);        //将ADC转换结果放数组最高位
  275.         if( ++ADCcount < 8)                //采样初期不使用滤波算法
  276.         {        
  277.                 for(xx=0;xx<N;xx++)        //准备滤波算法的数据
  278.                 {
  279.                         Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
  280.                 }
  281.                 tempvalue=Temp_Buf[N];//采样初期使用当前采样值
  282.         }
  283.         else         //只有采样次数大于8次以后才使用滤波算法        
  284.         {
  285.                 ADCcount=8;        //采样次数超过8次后,固定设置为8
  286.                 for(xx=0;xx<N;xx++)        //滤波算法
  287.                 {
  288.                         Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
  289.                         sum+=Temp_Buf[xx];        //求和
  290.                 }
  291.                 tempvalue=sum/N;                //求平均值               
  292.         }        
  293.         xx=0;
  294.         while( tempvalue > NTCcode[xx] )        //将当前温度值与温度表对比,得到所在位置
  295.         {        xx++;        }

  296.         tempvalue=xx*10 + (tempvalue*10 - NTCcode[xx-1]*10)/( NTCcode[xx] - NTCcode[xx-1] );
  297.         //插值法计算温度,将数据全部扩大10倍,使小数变为整数

  298.         //tempvalue=tempvalue-30;//修正温度,比正常高3.0度(扩大10倍为30)

  299.         if(tempvalue>400)        //正温度(大于0度)
  300.         {
  301.                 tempvalue=tempvalue-400;        //取得0°以上温度
  302.                 if(tempvalue>999)//大于100度显示最高位
  303.                         Show[0]=Table[tempvalue/1000];
  304.                 else                         //小于100度不显示最高位
  305.                         Show[0]=Table[17];
  306.                 Show[1]=Table[tempvalue%1000/100];        //十位
  307.                 Show[2]=Table[tempvalue%100/10]|0x01;//个位加小数点
  308.                 Show[3]=Table[tempvalue%10];        //小数位
  309.         }
  310.         else        //负温度(小于0度)
  311.         {
  312.                 tempvalue=410-tempvalue;        //取得0°以下温度
  313.                 //插值法计算温度,将数据全部扩大10倍,使小数变为整数,+5是四舍五入
  314.                 Show[0]=Table[16];                //显示负号-
  315.                 Show[1]=Table[tempvalue/100];
  316.                 Show[2]=Table[tempvalue%100/10]|0x01;//加小数点
  317.                 Show[3]=Table[tempvalue%10];
  318.         }
  319. }

  320. void Timer0Init(void)//定时器0,方式0(16位自动重装),2毫秒@6.000MHz
  321. {
  322.         AUXR &= 0x7F;        //定时器时钟12T模式
  323.         TMOD &= 0xF0;        //设置定时器模式
  324.         TL0 = 0x18;                //设置定时初值
  325.         TH0 = 0xFC;                //设置定时初值
  326.         TF0 = 0;                //清除TF0标志
  327.         TR0 = 1;                //定时器0开始计时
  328. }

  329. //Time0扫描LED显示驱动,计时,2ms
  330. void time0(void) interrupt 1
  331. {
  332.         if(4==++Ledcount)
  333.                 Ledcount=0;
  334.           P1 = 0xcf;               //关闭显示,P14 P15  1100  1111   
  335.           P3 = 0xf7;                                //关闭显示,P33     1111 0111
  336. //        P2 = ~Show[Ledcount];                //送段码,使用共阳极数码管
  337. //        P3 = 0x10<<Ledcount;                //选择位选   
  338.                 P2 = Show[Ledcount];                //送段码,使用共阳极数码管
  339. }

  340. void IO_init()
  341. {
  342.     P0M0 = 0x00; P0M1 = 0x00;
  343.     P1M0 = 0x00; P1M1 = 0x80;
  344.     P2M0 = 0x00; P2M1 = 0x00;
  345.     P3M0 = 0x00; P3M1 = 0x00;
  346.     P4M0 = 0x00; P4M1 = 0x00;
  347.     P5M0 = 0x00; P5M1 = 0x00;
  348.     P6M0 = 0x00; P6M1 = 0x00;
  349.     P7M0 = 0x00; P7M1 = 0x00;
  350. }

  351. void main(void)
  352. {
  353.         Init_ADC();                //初始化ADC
  354.         Timer0Init();        //设置T0用作数码管显示定时2ms扫描,中断模式
  355. //        P2M0=0xff;                //推挽输出驱动共阳极数码管
  356. //        P3M0=0xf0;                //推挽输出驱动4个三极管
  357. //        P1M0=0x01;                //P1.0推挽输出驱动fengmingqi
  358.   IO_init();
  359.         Beep=1;
  360.         Ledcount=0;                //LED扫描显示计数用
  361.         ADCcount=0;                //ADC采样次数        

  362.         ET0=1;                        //允许T0定时中断
  363.         EA=1;
  364.         while(1)
  365.         {
  366.                 Get_Temp();        //获取温度值
  367.                 //Beep=1;
  368.                 Delay_MS(50);
  369.                 //Beep=0;
  370.                 Delay_MS(950);        
  371.         }
  372. }
复制代码

回复

使用道具 举报

ID:883242 发表于 2023-11-26 16:50 | 显示全部楼层
两个芯片的SFR特殊寄存器不兼容吧?!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表