找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5408|回复: 7
打印 上一主题 下一主题
收起左侧

自制NTC测温度带24C02保存设置1637数码管显示单片机STC15

  [复制链接]
跳转到指定楼层
楼主
这个很实用,主要用来给电热水怀加热控制的。

制作出来的实物图如下:


单片机源码:

  1. //*   基于STC15W408AS的NTC温度计设计    */
  2. /*       测温范围-40°~110°          */
  3. //NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
  4. //NTC温度输出端子接P1.7
  5. #include "reg52.h"
  6. #include "intrins.h"
  7. #define uchar unsigned char
  8. #define uint  unsigned int
  9. //声明增加的寄存器地址
  10. sfr AUXR = 0x8e;         //辅助寄存器   
  11. sfr P3M0 = 0xB2;         //P3口引脚模式寄存器
  12. sfr P2M0 = 0x96;         //P2口引脚模式寄存器
  13. sfr P1M0 = 0x92;         //P1口引脚模式寄存器


  14. sfr ADC_CONTR = 0xBC;//A/D 转换控制寄存器 ADC_POWER,SPEED1,SPEED0,ADC_FLAG,ADC_START,CHS2,CHS1,CHS0;0000,0000
  15. 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
  16. sfr ADC_RESL  = 0xBE;//A/D 转换结果低2位                                            ADCV.1 ADCV.0;0000,0000
  17. sfr P1ASF          = 0x9D;//P1引脚功能选择寄存器


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


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


  26. unsigned int  Temp_Buf[N+1];                //采样数组
  27. unsigned char Ledcount,ADCcount;        //数码管显示计数变量,ADC采样次数变量
  28. sbit SCL=P2^0; //CLK
  29. sbit SDA=P2^1; //DIO
  30. sbit k1 = P2^2;//绿色线
  31. sbit k2= P2^3;//白色线
  32. sbit out = P2^4;//输出继电器
  33. int set,wd;//设置温度


  34. sbit scl_24=P2^5;//24c02时钟线
  35. sbit sda_24=P2^6;//24c02数据线




  36. void usdelay()
  37. {
  38. _nop_();_nop_();_nop_();
  39. _nop_();_nop_();_nop_();      
  40. }
  41. /***************以下开始为24CXX用子程序**********************/
  42. void star24()         //开始信号
  43. {//时钟线在高电平时,数据线由高变低即为开始信号        由高变低即为开始信号
  44.         sda_24=1;
  45.         usdelay();
  46.         scl_24=1;
  47.         usdelay();
  48.         sda_24=0;//数据线由高变低即为开始信号
  49.         usdelay();
  50.         scl_24=0;
  51. }
  52. void stop24()         //结束信号
  53. {//时钟线在高电平时,数据线由低变高即为结束信号
  54.         sda_24=0;
  55.         usdelay();
  56.         scl_24=1;
  57.         usdelay();
  58.         sda_24=1;
  59.         usdelay();
  60.         sda_24=0;        //这句可有可无
  61.         scl_24=0;        //这句可有可无
  62. }
  63. void Ack24()//应答         
  64. {        uchar i;
  65.         scl_24=1;
  66.         usdelay();      
  67.     while((sda_24==1)&&(i<200))i++;
  68.         scl_24=0;
  69.     usdelay();
  70. }
  71. /*
  72. void NoAck24()  //不应答
  73. {
  74.         sda_24=1;        //时钟线高电平时,数据线高,即为不应答
  75.         usdelay();
  76.     scl_24=1;
  77.         usdelay();
  78.         scl_24=0;
  79.     usdelay();
  80. } */
  81. /**********24c0初始化***************************/
  82. void init_24()
  83. {
  84. sda_24=1;
  85. usdelay();
  86. scl_24=1;
  87. usdelay();
  88. }
  89. /**********读数据24c02***************************/
  90. void write_byte(uchar dat)
  91. {
  92. uchar i,temp;
  93. temp=dat;
  94. //scl_24=0;//低电平可以变数据,为高时是读,且不能变
  95. for(i=0;i<8;i++)
  96.   {
  97.    temp=temp<<1;
  98.    scl_24=0;
  99.    usdelay();
  100. sda_24=CY;//CY是PSW寄存器中的CY位,再把CY赋给SDA,再由SCL控制发出去
  101. //sda_24=(bit)(temp&0x80);//用这句也可以换掉上一句(bit)是强制转换命令,把数据转成非0即1
  102.    usdelay();
  103.    scl_24=1;
  104.    usdelay();
  105.   }
  106.   scl_24=0;
  107.   usdelay();
  108.   sda_24=1;//释放总线
  109.   usdelay();
  110. }
  111. /**********读数据24c02***************************/
  112. uchar read_byte()
  113. {


  114. uchar i,k;
  115. scl_24=0;         //这句可有可无
  116. usdelay(); //这句可有可无
  117. sda_24=1; //释放总线
  118. usdelay();
  119. for(i=0;i<8;i++)
  120.   {
  121.    scl_24=1;
  122.    usdelay();
  123.    k=(k<<1)|sda_24;//判断8次,移位7次
  124.    scl_24=0;
  125.    usdelay();
  126.    }
  127. return k;
  128. }
  129. /**********写24c02指定地址的数据***************************/
  130. void write_add(uchar add,uchar dat)
  131. {
  132. star24();
  133. write_byte(0xa0);//呼叫器件,高四位为定了的1010,即A,低四位三个接了地,所以为000,最后一个0是写标志
  134. Ack24();//写了后要马上应答
  135. write_byte(add);//写要往哪个地址写数据00-1023
  136. Ack24();//每写一次要给一个应答位
  137.   write_byte(dat);//把数据写入
  138.    Ack24();
  139.   stop24();//给一个停止位,结束写数据
  140. }


  141. /**********读数据24c02指定地址的数据***************************/
  142. uchar read_add(uchar add)
  143. {
  144. uchar dat;
  145. star24();
  146. write_byte(0xa0);//呼叫器件,高四位为定了的1010,即A,低四位三个接了地,所以为000,最后一个0是写标志
  147. Ack24();//写了后要马上应答
  148. write_byte(add);//写入要往哪个地址读数据00-1023
  149. Ack24();//每写一次要给一个应答位
  150. star24();                                                  
  151. write_byte(0xa1);//呼叫器件,高四位为定了的1010,即A,低四位三个接了地,所以为000,最后一个1是读标志
  152. Ack24();//写了后要马上应答
  153. dat=read_byte();
  154. stop24();//给一个停止位,结束读数据
  155. return dat;//返回一个DAT(数据)
  156. }










  157. unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};


  158. unsigned int sum,tempvalue;//温度
  159. /*************************************
  160. NTC阻值与温度关系表
  161. Vcc---NTC(±1%)---R(10K±1%)---GND
  162.                 |
  163.               ADC端子
  164. NTC使用MF52-103/3435;10K±1%精度;B值:3435±1%
  165. **************************************/
  166. unsigned int code NTCcode[] = {
  167. /*ADC采样值****温度值*******电阻值**********/      
  168.         0x033,        // -40.00                190.5562
  169.         0x034,        // -39.00                183.4132
  170.         0x037,        // -38.00                175.6740
  171.         0x039,        // -37.00                167.6467
  172.         0x03c,        // -36.00                159.5647
  173.         0x03f,        // -35.00                151.5975
  174.         0x042,        // -34.00                143.8624
  175.         0x045,        // -33.00                136.4361
  176.         0x049,        // -32.00                129.3641
  177.         0x04d,        // -31.00                122.6678
  178.         0x050,        // -30.00                116.3519
  179.         0x054,        // -29.00                110.4098
  180.         0x059,        // -28.00                104.8272
  181.         0x05d,        // -27.00                99.5847
  182.         0x061,        // -26.00                94.6608
  183.         0x066,        // -25.00                90.0326
  184.         0x06a,        // -24.00                85.6778
  185.         0x06f,        // -23.00                81.5747
  186.         0x074,        // -22.00                77.7031
  187.         0x079,        // -21.00                74.0442
  188.         0x07e,        // -20.00                70.5811
  189.         0x084,        // -19.00                67.2987
  190.         0x089,        // -18.00                64.1834
  191.         0x08f,        // -17.00                61.2233
  192.         0x095,        // -16.00                58.4080
  193.         0x09b,        // -15.00                55.7284
  194.         0x0a1,        // -14.00                53.1766
  195.         0x0a8,        // -13.00                50.7456
  196.         0x0af,        // -12.00                48.4294
  197.         0x0b5,        // -11.00                46.2224
  198.         0x0bd,        // -10.00                44.1201
  199.         0x0c4,        // -9.00                42.1180
  200.         0x0cb,        // -8.00                40.2121
  201.         0x0d3,        // -7.00                38.3988
  202.         0x0db,        // -6.00                36.6746
  203.         0x0e3,        // -5.00                35.0362
  204.         0x0eb,        // -4.00                33.4802
  205.         0x0f3,        // -3.00                32.0035
  206.         0x0fb,        // -2.00                30.6028
  207.         0x0104,        // -1.00                29.2750
  208.         0x010d,        // 0.00                28.0170
  209.         0x0115,        // 1.00                26.8255
  210.         0x011e,        // 2.00                25.6972
  211.         0x0127,        // 3.00                24.6290
  212.         0x0130,        // 4.00                23.6176
  213.         0x0139,        // 5.00                22.6597
  214.         0x0142,        // 6.00                21.7522
  215.         0x014b,        // 7.00                20.8916
  216.         0x0154,        // 8.00                20.0749
  217.         0x015d,        // 9.00                19.2988
  218.         0x0166,        // 10.00                18.5600
  219.         0x0167,        // 11.00                18.4818
  220.         0x016b,        // 12.00                18.1489
  221.         0x0172,        // 13.00                17.6316
  222.         0x017b,        // 14.00                16.9917
  223.         0x0185,        // 15.00                16.2797
  224.         0x0190,        // 16.00                15.5350
  225.         0x019c,        // 17.00                14.7867
  226.         0x01a9,        // 18.00                14.0551
  227.         0x01b6,        // 19.00                13.3536
  228.         0x01c2,        // 20.00                12.6900
  229.         0x01cf,        // 21.00                12.0684
  230.         0x01dc,        // 22.00                11.4900
  231.         0x01e8,        // 23.00                10.9539
  232.         0x01f4,        // 24.00                10.4582
  233.         0x01ff,        // 25.00                10.0000
  234.         0x020a,        // 26.00                9.5762
  235.         0x0215,        // 27.00                9.1835
  236.         0x021f,        // 28.00                8.8186
  237.         0x0229,        // 29.00                8.4784
  238.         0x0233,        // 30.00                8.1600
  239.         0x023c,        // 31.00                7.8608
  240.         0x0245,        // 32.00                7.5785
  241.         0x024e,        // 33.00                7.3109
  242.         0x0257,        // 34.00                7.0564
  243.         0x0260,        // 35.00                6.8133
  244.         0x0268,        // 36.00                6.5806
  245.         0x0271,        // 37.00                6.3570
  246.         0x0279,        // 38.00                6.1418
  247.         0x0282,        // 39.00                5.9343
  248.         0x028a,        // 40.00                5.7340
  249.         0x0292,        // 41.00                5.5405
  250.         0x029a,        // 42.00                5.3534
  251.         0x02a2,        // 43.00                5.1725
  252.         0x02aa,        // 44.00                4.9976
  253.         0x02b1,        // 45.00                4.8286
  254.         0x02b9,        // 46.00                4.6652
  255.         0x02c1,        // 47.00                4.5073
  256.         0x02c8,        // 48.00                4.3548
  257.         0x02d0,        // 49.00                4.2075
  258.         0x02d7,        // 50.00                4.0650
  259.         0x02de,        // 51.00                3.9271
  260.         0x02e5,        // 52.00                3.7936
  261.         0x02ec,        // 53.00                3.6639
  262.         0x02f3,        // 54.00                3.5377
  263.         0x02fa,        // 55.00                3.4146
  264.         0x0301,        // 56.00                3.2939
  265.         0x0308,        // 57.00                3.1752
  266.         0x030f,        // 58.00                3.0579
  267.         0x0316,        // 59.00                2.9414
  268.         0x031d,        // 60.00                2.8250
  269.         0x0320,        // 61.00                2.7762
  270.         0x0324,        // 62.00                2.7179
  271.         0x0328,        // 63.00                2.6523
  272.         0x032d,        // 64.00                2.5817
  273.         0x0331,        // 65.00                2.5076
  274.         0x0336,        // 66.00                2.4319
  275.         0x033b,        // 67.00                2.3557
  276.         0x0341,        // 68.00                2.2803
  277.         0x0346,        // 69.00                2.2065
  278.         0x034b,        // 70.00                2.1350
  279.         0x034f,        // 71.00                2.0661
  280.         0x0354,        // 72.00                2.0004
  281.         0x0358,        // 73.00                1.9378
  282.         0x035d,        // 74.00                1.8785
  283.         0x0361,        // 75.00                1.8225
  284.         0x0365,        // 76.00                1.7696
  285.         0x0368,        // 77.00                1.7197
  286.         0x036c,        // 78.00                1.6727
  287.         0x036f,        // 79.00                1.6282
  288.         0x0372,        // 80.00                1.5860
  289.         0x0376,        // 81.00                1.5458
  290.         0x0378,        // 82.00                1.5075
  291.         0x037b,        // 83.00                1.4707
  292.         0x037e,        // 84.00                1.4352
  293.         0x0381,        // 85.00                1.4006
  294.         0x0383,        // 86.00                1.3669
  295.         0x0386,        // 87.00                1.3337
  296.         0x0389,        // 88.00                1.3009
  297.         0x038b,        // 89.00                1.2684
  298.         0x038e,        // 90.00                1.2360
  299.         0x0391,        // 91.00                1.2037
  300.         0x0393,        // 92.00                1.1714
  301.         0x0396,        // 93.00                1.1390
  302.         0x0399,        // 94.00                1.1067
  303.         0x039b,        // 95.00                1.0744
  304.         0x039e,        // 96.00                1.0422
  305.         0x03a1,        // 97.00                1.0104
  306.         0x03a3,        // 98.00                0.9789
  307.         0x03a6,        // 99.00                0.9481
  308.         0x03a8,        // 100.00                0.9180
  309.         0x03ab,        // 101.00                0.8889
  310.         0x03ad,        // 102.00                0.8610
  311.         0x03b0,        // 103.00                0.8346
  312.         0x03b2,        // 104.00                0.8099
  313.         0x03b4,        // 105.00                0.7870
  314.         0x03b6,        // 106.00                0.7665
  315.         0x03b7,        // 107.00                0.7485
  316.         0x03b9,        // 108.00                0.7334
  317.         0x03ba,        // 109.00                0.7214
  318.         0x03ba        // 110.00                0.7130
  319. };
  320. /******************************
  321. 函数说明:延时函数,执行一次1毫秒,STC_ISP_V6.21软件给出
  322. 入口参数:i=延时毫秒数
  323. 出口参数:无
  324. ******************************/
  325. void Delay_MS(unsigned int ms)
  326. {
  327.         unsigned char i, j;
  328.         while(ms--)
  329.         {
  330.                 i = 6;        j = 211;
  331.                 do{
  332.                         while (--j);
  333.                 } while (--i);
  334.         }
  335. }
  336. void IIC_delay(void)
  337. {
  338.     unsigned char i;
  339.     for(i=0;i<20;i++) _nop_();
  340. }
  341. void start_IIC(void)// 启动IIC


  342. {
  343.     SCL=1; //给芯片发送开始信号
  344.     SDA=1;
  345.     IIC_delay();
  346.     SDA=0;
  347.     IIC_delay();
  348.     SCL=0; //开始信号传送完
  349.     IIC_delay();
  350. }
  351. void stop_IIC(void) //停止IIC
  352. {
  353.     SCL=0;
  354.     IIC_delay();
  355.     SDA=0;
  356.     IIC_delay();
  357.     SCL=1;
  358.     IIC_delay();
  359.     SDA=1;
  360. }
  361. void ack_IIC()
  362. {
  363.     SCL=0;
  364.     _nop_();_nop_();_nop_();
  365.     while(SDA);
  366.     SCL=1;
  367.     _nop_();_nop_();_nop_();
  368.     SCL=0;
  369. }
  370. void WriteByte(unsigned char WriteData) //写一个字节数据
  371. {
  372.     unsigned char i;
  373.     for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
  374.     {
  375.         SCL=0;
  376.         IIC_delay();
  377.         WriteData=WriteData>>1;
  378.         SDA=CY;
  379.         IIC_delay();
  380.         SCL=1;
  381.         IIC_delay();
  382.     }
  383. //8位数据传送完
  384.     ack_IIC(); //判断芯片发过来的ACK应答信号
  385. }
  386. void write_LEDSROM(unsigned char addr,unsigned char WData) //写一字节数据到LEDSROM
  387. {
  388.     start_IIC(); //调用开始信号
  389.     WriteByte(addr); //写起始地址命令(0C0H),地址00H单元。
  390.     WriteByte(WData);//给显示寄存器写显示数据,值可根据实参改变
  391.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  392. }

  393. /******************************
  394. 函数说明:初始化ADC寄存器,设置P1.7为ADC输入功能
  395. 入口参数:无
  396. 出口参数:无
  397. ******************************/
  398. void Init_ADC(void)
  399. {
  400.     P1ASF = 0x80;                //打开P1.7口的ADC功能
  401.         ADC_RES = 0;      
  402.         ADC_RESL= 0;                //清掉ADC转换结果寄存器
  403.     ADC_CONTR = ADC_POWER | ADC_SPEED3;        //使能A/D供电,设置转换速度90T
  404. }


  405. /******************************
  406. 函数说明:查询方式读取ADC转换结果
  407. 入口参数:ch  ADC采样通道
  408. 出口参数:int ADC_RES ADC转换结果
  409. ******************************/
  410. unsigned int Get_ADC_Result(unsigned char ch)
  411. {
  412.         unsigned int result;
  413.         ADC_RES = 0;      
  414.         ADC_RESL= 0;                                        //清掉ADC转换结果寄存器
  415.         ADC_CONTR =ADC_POWER|ADC_SPEED3|ch|ADC_START;//配置ADC,设置转换通道,启动转换
  416.     _nop_();        _nop_();
  417.     _nop_();        _nop_();                        //等待设置ADC_POWER完毕
  418.     while (!(ADC_CONTR & ADC_FLAG));//读取转换完毕标志位ADC_FLAG
  419.     ADC_CONTR &= ~ADC_FLAG;         //清除ADC_FLAG标志位
  420.         result = ADC_RES<<2|ADC_RESL;        //读取10位转换结果保存到result
  421.     return result;                  //返回ADC转换结果10位
  422. }


  423. void Timer0Init(void)//定时器0,方式0(16位自动重装),2毫秒@6.000MHz
  424. {
  425.         AUXR &= 0x7F;        //定时器时钟12T模式
  426.         TMOD &= 0xF0;        //设置定时器模式
  427.         TL0 = 0x18;                //设置定时初值
  428.         TH0 = 0xFC;                //设置定时初值
  429.         TF0 = 0;                //清除TF0标志
  430.         TR0 = 1;                //定时器0开始计时
  431. }
  432. void display(int temp) //显示
  433. {
  434.          
  435.     SDA=1;
  436.     SCL=1;
  437.     start_IIC(); //调用开始信号
  438.     WriteByte(0x40);//写命令40H(数据设置)
  439.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  440.       
  441.       
  442.     //write_LEDSROM(0xC1,xsbcdbuf[temp/1000]); //第一个数码管
  443.     write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]);  //第二个数码管,0x80打开DP小数点
  444.          // write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]|0x80);  //第二个数码管,0x80打开DP小数点
  445.     write_LEDSROM(0xC2,xsbcdbuf[temp%100/10]); //第三个数码管
  446.          // write_LEDSROM(0xC3,xsbcdbuf[temp%10]);//第四个数码管
  447.       
  448.     write_LEDSROM(0xC0,0x00);//第四个数码管
  449.           write_LEDSROM(0xC3,0x58);//第四个数码管
  450.       
  451.       
  452.       
  453.       
  454.     IIC_delay();
  455.     start_IIC(); //调用开始信号
  456.     WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
  457.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  458. }
  459. void display2(int temp) //显示
  460. {
  461.          
  462.     SDA=1;
  463.     SCL=1;
  464.     start_IIC(); //调用开始信号
  465.     WriteByte(0x40);//写命令40H(数据设置)
  466.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  467.       
  468.       
  469.     //write_LEDSROM(0xC1,xsbcdbuf[temp/1000]); //第一个数码管
  470.     write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]);  //第二个数码管,0x80打开DP小数点
  471.          // write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]|0x80);  //第二个数码管,0x80打开DP小数点
  472.     write_LEDSROM(0xC2,xsbcdbuf[temp%100/10]); //第三个数码管
  473.          // write_LEDSROM(0xC3,xsbcdbuf[temp%10]);//第四个数码管
  474.       
  475.     write_LEDSROM(0xC0,0x40);//第四个数码管
  476.           write_LEDSROM(0xC3,0x58);//第四个数码管
  477.       
  478.       
  479.       
  480.       
  481.     IIC_delay();
  482.     start_IIC(); //调用开始信号
  483.     WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
  484.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  485. }
  486. void display3(int temp) //显示
  487. {
  488.          
  489.     SDA=1;
  490.     SCL=1;
  491.     start_IIC(); //调用开始信号
  492.     WriteByte(0x40);//写命令40H(数据设置)
  493.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  494.       
  495.       
  496.     //write_LEDSROM(0xC1,xsbcdbuf[temp/1000]); //第一个数码管
  497.    // write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]);  //第二个数码管,0x80打开DP小数点
  498.          // write_LEDSROM(0xC1,xsbcdbuf[temp%1000/100]|0x80);  //第二个数码管,0x80打开DP小数点
  499.     write_LEDSROM(0xC1,xsbcdbuf[temp%100/10]); //第三个数码管
  500.           write_LEDSROM(0xC2,xsbcdbuf[temp%10]);//第四个数码管
  501.       
  502.     write_LEDSROM(0xC0,0x49);//第四个数码管
  503.           write_LEDSROM(0xC3,0x58);//第四个数码管
  504.       
  505.       
  506.       
  507.       
  508.     IIC_delay();
  509.     start_IIC(); //调用开始信号
  510.     WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
  511.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  512. }
  513. /******************************
  514. 函数说明:获取温度值
  515. 入口参数:无
  516. 出口参数:无
  517. ******************************/
  518. void Get_Temp(void)
  519. {
  520.         unsigned char xx;
  521. uint a,i;
  522.         sum = tempvalue =0;      
  523.         Temp_Buf[N]=Get_ADC_Result(7);        //将ADC转换结果放数组最高位
  524.       
  525.         if( ++ADCcount < 8)                //采样初期不使用滤波算法
  526.         {      
  527.                 for(xx=0;xx<N;xx++)        //准备滤波算法的数据
  528.                 {
  529.                         Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
  530.                 }
  531.                 tempvalue=Temp_Buf[N];//采样初期使用当前采样值
  532.         }
  533.         else         //只有采样次数大于8次以后才使用滤波算法      
  534.         {
  535.                 ADCcount=8;        //采样次数超过8次后,固定设置为8
  536.                 for(xx=0;xx<N;xx++)        //滤波算法
  537.                 {
  538.                         Temp_Buf[xx]=Temp_Buf[xx+1];//所有数据循环左移
  539.                         sum+=Temp_Buf[xx];        //求和
  540.                 }
  541.                 tempvalue=sum/N;                //求平均值               
  542.         }      
  543.         xx=0;
  544.         while( tempvalue > NTCcode[xx] )        //将当前温度值与温度表对比,得到所在位置
  545.         {        xx++;        }


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


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


  549.       
  550.       
  551.         if(tempvalue>400)        //正温度(大于0度)
  552.         {
  553.                 tempvalue=tempvalue-400;        //取得0°以上温度
  554.           display(tempvalue);//显示温度值 display
  555.                
  556.         }
  557.         else        //负温度(小于0度)
  558.         {
  559.                 tempvalue=410-tempvalue;        //取得0°以下温度
  560.                 //插值法计算温度,将数据全部扩大10倍,使小数变为整数,+5是四舍五入
  561.            display2(tempvalue);//显示温度值
  562.         }


  563.         if(tempvalue>=set)
  564.                                  {
  565.                                  out=1;//继电器工作停止
  566.                                  }
  567.                                         else
  568.                                         {
  569.                                  out=0;//继电器工作输出
  570.                                   }
  571.                        
  572.                               
  573.                 if(k1==0)//加温度
  574.                                         {                                       
  575.                                         set=set+10;
  576.                                         if(set>=990)set=990;
  577.                                         for(a=5;a>0;a--)        //多显示一会儿
  578.                                                 {
  579.                                                 display3(wd); //显示设置温度
  580.                                                 write_add(0,wd);//在地址2 写入min               
  581.                                                 Delay_MS(1);      
  582.                                                 }      
  583.                                         }
  584.                                        
  585.                         if(k2==0)//加温度
  586.                                         {                                       
  587.                                         set=set-10;
  588.                                         if(set<=10)set=10;
  589.                                         for(a=5;a>0;a--)        //多显示一会儿
  590.                                                 {
  591.                                                 display3(wd); //显示设置温度
  592.                                                 write_add(0,wd);//在地址2 写入min               
  593.                                                 Delay_MS(1);      
  594.                                                 }      
  595.                                         }                       
  596.       
  597. }


  598. void main(void)
  599. {
  600.       
  601.         Init_ADC();                //初始化ADC
  602.         ADCcount=0;                //ADC采样次数        //1.7
  603.   //set=500;
  604.         wd=set/10;//
  605.                                   out=1;
  606.                 k1=1;
  607.                 k2=1;
  608.         init_24();//24c02初始化
  609.         Delay_MS(101);
  610.         wd=read_add(0);//从地址( )中读出以前保存的数据
  611.         Delay_MS(101);
  612.         set=wd*10;//放大数据用于参考输出
  613.         while(1)
  614.         {
  615.                 Get_Temp();        //获取温度值               
  616.                 Delay_MS(900);      
  617.                
  618.                 write_add(0,wd);//在地址2 写入min      
  619.                 Delay_MS(1);
  620.                 wd=set/10;//只保持255数据,用于读写24C02
  621.         }
  622. }
复制代码

全部资料51hei下载地址:
1637显STC15按钮24 C02 NTC10K温度OK.zip (69.5 KB, 下载次数: 163)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:358930 发表于 2018-12-11 03:12 | 只看该作者
电源部分完成,用12V18A电源,这个电源也改过,要短路才跳保护,为的是功率更大,改了电流取样部分,不然这个电源懂的人都知道太敏感了,只能给服务器用,控制部分用降压模块调节到5V。现在开始弄个芋头吃吃,代码还要改下,就是防到温度闪烁现像,忙忘了,哈哈哈哈,开吃了。

15444612081920.17350934727717082.jpg (284.89 KB, 下载次数: 96)

15444612081920.17350934727717082.jpg

20181211_025332.jpg (297.86 KB, 下载次数: 85)

20181211_025332.jpg

20181211_025704.jpg (299.12 KB, 下载次数: 88)

20181211_025704.jpg
回复

使用道具 举报

板凳
ID:412814 发表于 2018-12-11 06:32 | 只看该作者
太好了,谢谢楼主下载研究研究。
回复

使用道具 举报

地板
ID:254251 发表于 2019-5-3 16:55 | 只看该作者
楼主加个回温差才实用,或者可以设温度上限和下限,
回复

使用道具 举报

5#
ID:28260 发表于 2022-7-13 19:14 | 只看该作者
已拜读,谢谢楼主!
回复

使用道具 举报

6#
ID:72088 发表于 2022-7-16 12:40 | 只看该作者
单片机内部有EEPROM,不必再用外接24C02
回复

使用道具 举报

7#
ID:941205 发表于 2022-7-28 02:26 | 只看该作者
下来研究下,多谢。
回复

使用道具 举报

8#
ID:47634 发表于 2023-3-27 08:36 | 只看该作者
实际上可以使用单片机自带的EEPROM
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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