STC15 51单片机NTC测温程序

[复制链接]
查看8 | 回复0 | 2021-6-9 18:56:59 | 显示全部楼层 |阅读模式
  1. /*
  2. *                        NTC测温,10位AD分辨率0.1度
  3. *                                                  硬件说明:IAP15W4K58S4  
  4. *                                第一位数码管 位引脚-->P41                                                                  *
  5. *                                                         第二位数码管 位引脚-->P42                                                                  *
  6. *                                                         第三位数码管 位引脚-->P44                                                                  *
  7. *                                                         第四位数码管 位引脚-->P45                                                                  *
  8. *                                                         所有的数码管 段引脚-->P2                                                                    *
  9. *******************************************************************************/
  10. #define         MAIN_Fosc                22118400L        //定义主时钟
  11. #include <STC15.H>
  12. #include <intrins.H>
  13. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒
  14. //#define uchar unsigned char
  15. //#define uint unsigned int
  16. typedef         unsigned char        u8;
  17. typedef         unsigned int        u16;
  18. typedef         unsigned long        u32;

  19. #define DIS_DOT                0x20
  20. #define DIS_BLACK        0x10
  21. #define DIS_                0x11

  22. u8 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数字编码  0.1.2.3.4....9
  23. u8 qian,bai,shi,ge;

  24. bit        B_1ms;                        //1ms标志
  25. u16        msecond;
  26. u8 flag0;                      //正负温度标志位
  27. u8 flag1;                                        //温度超过100度,千位数正常显示
  28. u16        Get_ADC10bitResult(u8 channel);         //AD转换函数声明,channl输入通道选择
  29. u16        get_temperature(u16 adc);                          //温度转换函数声明

  30. /********************************************************************
  31. * 名称 : Delay()
  32. * 功能 : 延时
  33. * 输入 : i
  34. * 输出 : 无
  35. ***********************************************************************/
  36. void delay(u8 i)         //延时函数
  37. {
  38.   u16 j,k;
  39.   for(j=i;j>0;j--)
  40.     for(k=500;k>0;k--);
  41. }

  42. /********************************************************************
  43. * 名称 : display()
  44. * 功能 : 数码管显示函数
  45. * 输入 : 无
  46. * 输出 : 无
  47. ***********************************************************************/
  48. void display(u8 qian,u8 bai,u8 shi,u8 ge) //显示函数
  49. {
  50.                 if(flag0)    //温度低于0度千位数码管显示-
  51.                 {
  52.                                 P2=0XBF;
  53.                                 P41 = 0;
  54.                                 delay(5);
  55.                                 P41 = 1;
  56.                 }
  57.                 if(flag1)   //温度超过100度,千位显示
  58.                 {
  59.                                 P2=table[qian];
  60.                                 P41 = 0;
  61.                                 delay(5);
  62.                                 P41 = 1;
  63.                 }
  64.                 P2=table[bai];
  65.                 P42 = 0;
  66.                 delay(5);
  67.                 P42 = 1;

  68.                 P2=table[shi]&0X7F;                //十位显示小数点
  69.                 P44 = 0;
  70.                 delay(5);
  71.                 P44 = 1;

  72.                 P2=table[ge];
  73.                 P45 = 0;
  74.                 delay(5);
  75.                 P45 = 1;
  76. }
  77. /********************************************************************
  78. * 名称 : main()
  79. * 功能 : 主函数
  80. * 输入 : 无
  81. * 输出 : 无
  82. ***********************************************************************/
  83. void main(void)
  84. {   
  85.   long int j;
  86.         P0M1 = 0;        P0M0 = 0;        //设置为准双向口
  87.         P1M1 = 0;        P1M0 = 0;        //设置为准双向口
  88.         P2M1 = 0;        P2M0 = 0;        //设置为准双向口
  89.         P3M1 = 0;        P3M0 = 0;        //设置为准双向口
  90.         P4M1 = 0;        P4M0 = 0;        //设置为准双向口
  91.         P5M1 = 0;        P5M0 = 0;        //设置为准双向口
  92.         P6M1 = 0;        P6M0 = 0;        //设置为准双向口
  93.         P7M1 = 0;        P7M0 = 0;        //设置为准双向口

  94.         P1ASF = 0xff;                //P1口全部做ADC   
  95.   P1 &= 0x00;         //设置P1.0口输出低电平确保能采集到外部电平信号
  96.   ADC_CONTR = 0xE0;        //90T, ADC power on
  97.   AUXR = 0x80;        //定时器0,1T ,16位自动重装
  98.         TH0 = (u8)(Timer0_Reload / 256);//1ms中断一次
  99.         TL0 = (u8)(Timer0_Reload % 256);
  100.         ET0 = 1;        //开定时器0中断
  101.         TR0 = 1;        //打开定时器0
  102.         EA = 1;                //打开总中断

  103.   while(1)
  104.         {         
  105.                   if(B_1ms)        //1ms到
  106.                         {
  107.                                         B_1ms = 0;   //清0标志位
  108.                                         if(++msecond >= 300)        //300ms到
  109.                             {
  110.                                                         msecond = 0;
  111.                                                         j = Get_ADC10bitResult(2);
  112.                                                         j =        get_temperature(j);        //计算温度值
  113.                                                         if(j >= 400)        flag0 = 0,        j -= 400;                //温度 >= 0度
  114.                                             else flag0 = 1,        j  = 400 - j;        //温度 <  0度
  115.                                                         if(j>=1000) flag1=1;
  116.                                                         else flag1=0;//温度超过100度标志位,千位数正常显示
  117.                                         }
  118.                         }
  119.                   qian=j/1000;
  120.                         bai=j%1000/100;
  121.                         shi=j%100/10;
  122.                         ge=j%10;
  123.                   display(qian,bai,shi,ge);      
  124.         }
  125. }
  126. //========================================================================
  127. // 函数: u16        Get_ADC10bitResult(u8 channel)
  128. // 描述: 查询法读一次ADC结果.
  129. // 参数: channel: 选择要转换的ADC.
  130. // 返回: 10位ADC结果.
  131. // 版本: V1.0, 2012-10-22
  132. //========================================================================
  133. u16        Get_ADC10bitResult(u8 channel)                //channel = 0~7
  134. {      
  135.     u8 status=0;                //判断AD转换结束标志位
  136.                 u16 AD_dat=0;                //转换结果10位ADC值
  137.                 ADC_RES = 0;
  138.                 ADC_RESL = 0;
  139.                 ADC_CONTR|=0x80;  ////开启ADC电源
  140.     _nop_();    _nop_();
  141.     _nop_();    _nop_();   //等待ADC电源稳定
  142.                 //开启ADC电源,转换速度300k。启动ADC转换。选择转换通道
  143.                 ADC_CONTR = (ADC_CONTR | 0xe0) | 0x08 | channel;
  144.                 //while((ADC_CONTR & 0x10) == 0)        ;        //ADC_CONTR寄存器ADC_FLAG==1
  145.                 //ADC_CONTR &= ~0x10;                //清零ADC结束标志
  146.                 while(status==0)   //等待AD转换结束
  147.           {
  148.                     status=ADC_CONTR & 0X10;//判断ADC_FLAG转换结束标志位,转换结束硬件置1,必须软件清零         
  149.           }
  150.           ADC_CONTR&=0xe7;                // 清零ADC_FLAG标志位关闭ADC转换1110 0111
  151.                 AD_dat = (ADC_RES << 2)|(ADC_RESL&0X03);//高低字节拼接成一个10位结果
  152.                 return AD_dat;               
  153. }

  154. //        MF52E 10K at 25, B = 3950, ADC = 12 bits
  155. u16 code temp_table[]=
  156. {
  157.                 25,                //-40                0
  158.                 27,                //-39                1
  159.                 29,                //-38                2
  160.                 31,                //-37                3
  161.                 33,                //-36                4
  162.                 35,                //-35                5
  163.                 38,                //-34                6
  164.                 40,                //-33                7
  165.                 43,                //-32                8
  166.                 46,                //-31                9
  167.                 49,                //-30                10
  168.                 52,                //-29                11
  169.                 55,                //-28                12
  170.                 59,                //-27                13
  171.                 62,                //-26                14
  172.                 66,                //-25                15      
  173.                 70,                //-24                16
  174.                 75,                //-23                17
  175.                 79,                //-22                18
  176.                 84,                //-21                19      
  177.                 89,                //-20                20
  178.                 94,                //-19                21
  179.                 99,                //-18                22
  180.                 105,        //-17                23
  181.                 110,        //-16                24
  182.                 116,        //-15                25
  183.                 123,        //-14                26
  184.                 129,        //-13                27
  185.                 136,        //-12                28
  186.                 143,        //-11                29
  187.                 150,        //-10                30
  188.                 157,        //-9                31
  189.                 165,        //-8                32
  190.                 173,        //-7                33               
  191.                 181,        //-6                34
  192.                 190,        //-5                35
  193.                 198,        //-4                36
  194.                 207,        //-3                37
  195.                 216,        //-2                38
  196.                 225,        //-1                39
  197.                 235,        //0                40
  198.                 244,        //1                41
  199.                 254,        //2                42
  200.                 264,        //3                43
  201.                 275,        //4                44
  202.                 285,        //5                45
  203.                 296,        //6                46
  204.                 306,        //7                47      
  205.                 317,        //8                48
  206.                 328,        //9                49
  207.                 339,        //10                50
  208.                 351,        //11                51
  209.                 362,        //12                52
  210.                 373,        //13                53
  211.                 385,        //14                54
  212.                 396,        //15                55      
  213.                 408,        //16                56
  214.                 420,        //17                57
  215.                 431,        //18                58
  216.                 443,        //19                59
  217.                 454,        //20                60
  218.                 466,        //21                61
  219.                 478,        //22                62
  220.                 489,        //23                63
  221.                 501,        //24                64
  222.                 512,        //25                65
  223.                 523,        //26                66
  224.                 535,        //27                67
  225.                 546,        //28                68
  226.                 557,        //29                69
  227.                 568,        //30                70
  228.                 579,        //31                71
  229.                 589,        //32                72
  230.                 600,        //33                73
  231.                 610,        //34                74
  232.                 620,        //35                75
  233.                 630,        //36                76
  234.                 640,        //37                77
  235.                 650,        //38                78
  236.                 660,        //39                79
  237.                 669,        //40                80
  238.                 678,        //41                81
  239.                 688,        //42                82
  240.                 696,        //43                83
  241.                 705,        //44                84
  242.                 714,        //45                85
  243.                 722,        //46                86
  244.                 730,        //47                87
  245.                 738,        //48                88
  246.                 746,        //49                89
  247.                 754,        //50                90      
  248.                 761,        //51                91
  249.                 768,        //52                92
  250.                 775,        //53                93
  251.                 782,        //54                94
  252.                 789,        //55                95
  253.                 796,        //56                96
  254.                 802,        //57                97
  255.                 808,        //58                98
  256.                 814,        //59                99
  257.                 820,        //60                100
  258.                 826,        //61                101
  259.                 831,        //62                102
  260.                 837,        //63                103
  261.                 842,        //64                104
  262.                 847,        //65                105
  263.                 852,        //66                106
  264.                 857,        //67                107
  265.                 862,        //68                108
  266.                 866,        //69                109
  267.                 871,        //70                110      
  268.                 875,        //71                111
  269.                 879,        //72                112      
  270.                 883,        //73                113
  271.                 887,        //74                114
  272.                 891,        //75                115
  273.                 895,        //76                116
  274.                 898,        //77                117
  275.                 902,        //78                118
  276.                 905,        //79                119
  277.                 909,        //80                120
  278.                 912,        //81                121
  279.                 915,        //82                122
  280.                 918,        //83                123
  281.                 921,        //84                124
  282.                 924,        //85                125               
  283.                 926,        //86                126
  284.                 929,        //87                127
  285.                 932,        //88                128
  286.                 934,        //89                129
  287.                 937,        //90                130
  288.                 939,        //91                131
  289.                 941,        //92                132
  290.                 943,        //93                133
  291.                 946,        //94                134
  292.                 948,        //95                135
  293.                 950,        //96                136
  294.                 952,        //97                137
  295.                 954,        //98                138
  296.                 955,        //99                139
  297.                 957,        //100                140
  298.                 959,        //101                141
  299.                 961,        //102                142
  300.                 962,        //103                143
  301.                 964,        //104                144
  302.                 965,        //105                145
  303.                 967,        //106                146
  304.                 968,        //107                147
  305.                 970,        //108                148
  306.                 971,        //109                149
  307.                 973,        //110                150
  308.                 974,        //111                151
  309.                 975,        //112                152
  310.                 976,        //113                153
  311.                 978,        //114                154
  312.                 979,        //115                155
  313.                 980,        //116                156               
  314.                 981,        //117                157
  315.                 982,        //118                158
  316.                 983,        //119                159
  317.                 984,        //120                160
  318. };



  319. /********************  计算温度 ***********************************************/
  320. // 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
  321. // 为了通用, ADC输入为12bit的ADC值.
  322. // 电路和软件算法设计: Coody
  323. /**********************************************/

  324. /********************  计算温度 ***********************************************/
  325. // 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
  326. // 为了通用, ADC输入为12bit的ADC值.
  327. // 电路和软件算法设计: Coody
  328. /**********************************************/

  329. #define                D_SCALE                10                //结果放大倍数, 放大10倍就是保留一位小数
  330. u16        get_temperature(u16 adc)
  331. {
  332.         u16        code *p;    //定义指针变量
  333.         u16        i;
  334.         u8        j,k,min,max;      //定义局部变量j,k,min最小值,max最大值;
  335.       
  336.         adc = 1023 - adc;        //Rt接地时启用//RT接电源时屏蔽
  337.         p = temp_table;
  338.         if(adc < p[0])                return (0xfffe);
  339.         if(adc > p[160])        return (0xffff);
  340.       
  341.         min = 0;                //-40度
  342.         max = 160;                //120度

  343.         for(j=0; j<5; j++)        //对分查表
  344.         {
  345.                 k = min / 2 + max / 2;
  346.                 if(adc <= p[k])        max = k;
  347.                 else                        min = k;
  348.         }
  349.                  if(adc == p[min])        i = min * D_SCALE;
  350.         else if(adc == p[max])        i = max * D_SCALE;
  351.         else        // min < temp < max
  352.         {
  353.                 while(min <= max)
  354.                 {
  355.                         min++;
  356.                         if(adc == p[min])        {i = min * D_SCALE;        break;}
  357.                         else if(adc < p[min])
  358.                         {
  359.                                 min--;
  360.                                 i = p[min];        //min
  361.                                 j = (adc - i) * D_SCALE / (p[min+1] - i);
  362.                                 i = min;
  363.                                 i *= D_SCALE;
  364.                                 i += j;
  365.                                 break;
  366.                         }
  367.                 }
  368.         }
  369.         return i;
  370. }


  371. /********************** Timer0 1ms中断函数 ************************/
  372. void timer0 (void) interrupt 1
  373. {
  374.         //DisplayScan();        //1ms扫描显示一位
  375.         B_1ms = 1;                //1ms标志
  376. }
复制代码


回复

使用道具 举报

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

本版积分规则