标题: 开源4个元件打造NTC10K温度计 [打印本页]

作者: 刘海龙    时间: 2016-10-25 19:32
标题: 开源4个元件打造NTC10K温度计
1.最近发现坛里对热敏电阻测温系统呼声很高,刚好我手里有个NTC10K的热敏电阻,于是乎我就打算做个热敏电阻温度计。
2.我首先了解了NTC热敏电阻的特性,阻值随温度的升高而减小。通过厂商提供的温度和电阻对应的关系表就可以知道阻值对应的温度,要想测温度就要测出热敏电阻的阻值,知道了原理就好办多了。


3.闭上眼开始思考测量电阻的方法,不可能直接拿万用表测吧,首先想到初中物理学到的R=U/I(电阻的阻值等于加在它两端的电压除以流过它的电流)。只要在热敏电阻上加上电,测出电压和电流就行了。


4.测量电压可以用ADC测量,可是电流怎么测量呢?于是想到串联电路电流相等,把一个已知阻值的精密电阻和热敏电阻串联,根据I=U/R测到已知电阻上分得的电压就可以知道电路中的电流了。


5.系统原理:NTC 10k热敏电阻和10k精密电阻串联接入VCC—GND,利用单片机内部的ADC模块测出NTC电阻上分的电压ADC_V以及系统的供电电压POWER_V,从而得到10k精密电阻上的电压R_V=(POWER_V-ADC_V),根据电阻串联电流相等可以知道NTC电阻中的电流I=R_V/10K,,再根据U=I*R可得到热敏电阻的阻值NTC_R=ADC_V/I,通过查表找出此阻值对应的温度。此系统由于使用了STC单片机内部的电压基准为参考,所以测温精度不受系统电压VCC的影响。


6.为了简化NTC10k测温系统的硬件制作难度,我尽量优化设计,只需NTC热敏电阻+10k精密电阻+STC单片机+数码管公4个元件。单片机依然采用STC15W408ASS,温度显示只有两位所以数码管采用3位共阴数码管(把数码管旋转180度颠倒过来使用,前两位显示温度第三位显示“”符号),10k电阻尽量选择精密一点的。
下图为测得的室温21度


下图为数码管正放时的显示,实际使用时要旋转180度放
(这样就可以显示温度符号℃)


下图为原理图截图(源文件见附件PADS layout)


下图为买热敏电阻时卖家提供的阻值与温度对应关系表




请评分支持一下谢谢
  1. /********************************************/
  2. //2016.10.24日编写完成
  3. //作者:刘海龙 (读单片机内部BandGap基准电压值参考的STC官网程序)
  4. //硬件:STC15W408AS+3位共阴数码管+1个10K的电阻(最好选用精密电阻)+NTC10K热敏电阻
  5. //晶振选12M或11.0952M
  6. /*原理:NTC 10k热敏电阻和10k精密电阻串联接入VCC—GND,利用单片机内部的ADC
  7. 模块测出NTC电阻上分的电压ADC_V以及系统的供电电压POWER_V,从而得到10k精密电阻上
  8. 的电压R_V=(POWER_V-ADC_V),根据电阻串联电流相等可以知道NTC电阻中的电流I=R_V/10K,
  9. ,再根据U=I*R可得到热敏电阻的阻值NTC_R=ADC_V/I,通过查表找出此阻值对应的温度。*/
  10. #include <STC15W.h>//STC15W408AS头文件
  11. #include <intrins.h>
  12. unsigned int NTC_R;//定义热敏电阻阻值变量
  13. unsigned char temperature;//定义温度存储变量
  14. unsigned int code Ttable[106][2]={//温度与电阻阻值对应关系表格
  15. 0,3274,//0度对应阻值32.74k
  16. 1,3111,//1度对应阻值31.11k
  17. 2,2957,//2度对应阻值29.57k
  18. 3,2812,//
  19. 4,2674,//
  20. 5,2545,
  21. 6,2422,
  22. 7,2306,
  23. 8,2196,
  24. 9,2092,
  25. 10,1993,
  26. 11,1900,
  27. 12,1811,
  28. 13,1728,
  29. 14,1648,
  30. 15,1573,
  31. 16,1501,
  32. 17,1433,
  33. 18,1369,
  34. 19,1308,
  35. 20,1250,
  36. 21,1194,
  37. 22,1142,
  38. 23,1092,
  39. 24,1045,
  40. 25,1000,//25度对应阻值10k               
  41. 26,957,//26度对应阻值9.57k
  42. 27,916,
  43. 28,877,
  44. 29,840,
  45. 30,805,
  46. 31,771,
  47. 32,739,
  48. 33,709,
  49. 34,679,
  50. 35,652,
  51. 36,625,
  52. 37,600,
  53. 38,576,
  54. 39,553,
  55. 40,531,
  56. 41,510,
  57. 42,490,
  58. 43,471,
  59. 44,453,
  60. 45,435,
  61. 46,418,
  62. 47,402,
  63. 48,387,
  64. 49,372,
  65. 50,358,
  66. 51,345,
  67. 52,332,
  68. 53,320,
  69. 54,308,
  70. 55,297,
  71. 56,286,
  72. 57,276,
  73. 58,266,
  74. 59,256,
  75. 60,247,
  76. 61,238,
  77. 62,230,
  78. 63,222,
  79. 64,214,
  80. 65,207,
  81. 66,199,
  82. 67,193,
  83. 68,186,
  84. 69,180,
  85. 70,174,
  86. 71,168,
  87. 72,162,
  88. 73,157,
  89. 74,        152,
  90. 75,        147,
  91. 76,        142,
  92. 77,        137,
  93. 78,        133,
  94. 79,        128,
  95. 80,        124,
  96. 81,        120,
  97. 82,        116,
  98. 83,        113,
  99. 84,        109,
  100. 85,        106,
  101. 86,        102,//86度对应阻值1.02k
  102. 87,        99,//87度对应阻值0.99k
  103. 88,        96,
  104. 89,        93,
  105. 90,        90,
  106. 91,        88,
  107. 92,        85,
  108. 93,        82,
  109. 94,        80,
  110. 95,        78,
  111. 96,        75,
  112. 97,        73,
  113. 98,        71,
  114. 99,        69,
  115. 100,67,
  116. 101,65,
  117. 102,63,
  118. 103,61,
  119. 104,59,
  120. 105,58//105度对应阻值0.58k
  121.          

  122. };        
  123. #include<4LED_YIN.H>//数码管驱动显示程序
  124. #include <BandGap.H>//包含读单片机内部BandGap基准电压值
  125. void T_dis(){//温度处理函数采集到的阻值与二维数组的阻值进行比较,从而获得相对应的温度值。
  126.          unsigned char i;
  127.          for(i=105;i<106;i--)  {
  128.                 if(NTC_R >= Ttable[i][1] && NTC_R < Ttable[i-1][1]){
  129.                    temperature=(Ttable[i][0]+1);
  130.                    break;
  131.                 }
  132.         }
  133. }
  134. /********************************/
  135. void main (void)
  136. {        Delay20ms();//待系统稳定
  137.     InitADC();//初始化ADC
  138.     P1M1=0X80;//P1.7高阻输入
  139.         init();//IO口设置初始化
  140.     while (1)
  141.     {
  142.         ShowResult(7);//测量NTC热敏电阻上的电压并根据电压计算出阻值
  143.                 T_dis();//测量到的阻值进行查表对比找到阻值对应的温度值
  144.                 disp();        //数码管显示温度值
  145.     }
  146. }
复制代码





NTC10K温度计02.png (757.21 KB, 下载次数: 414)

NTC10K温度计02.png

NTC10K温度计源程序 原理图.rar

2.34 MB, 下载次数: 1233, 下载积分: 黑币 -5


作者: 维超    时间: 2016-10-26 08:59
很好的一个学习例程。
作者: wc86110    时间: 2016-10-26 16:24
用四位数码管测温范围会更宽
作者: 刘海龙    时间: 2016-10-26 16:50
wc86110 发表于 2016-10-26 16:24
用四位数码管测温范围会更宽

此制作仅为抛砖引玉,坛友可以加入更好的创意进去。
作者: 七颗星星    时间: 2016-10-27 12:57
请问按照你的原理,因为你的单片机里已经包含了AD转换模块,若必须分离出来那么这样行吗?NTC 10k热敏电阻和10k精密电阻串联,然后将它接入A/D转换器,例如ADC0804然后通过DB1~DB2将数字信号送入单片机,而这个数就是NTC的分压值,之后由再计算那个NTC的电阻,再查表求温度,可以不?
作者: 刘海龙    时间: 2016-10-27 13:56
七颗星星 发表于 2016-10-27 12:57
请问按照你的原理,因为你的单片机里已经包含了AD转换模块,若必须分离出来那么这样行吗?NTC 10k热敏电阻 ...

可以的

作者: 七颗星星    时间: 2016-10-27 14:21
刘海龙 发表于 2016-10-27 13:56
可以的

那这个程序应该怎么写呀,我只会写简单的,这个我不太会,还有今天课间问了老师这个电路,老师说按原理可以实现,要我仿真看看,他说加到AD的电路的电压前面灵敏度会不够,可能要加一个电压放大器,这应该怎么连接呢
作者: siman275    时间: 2016-10-27 15:13
可以直接用EXCEL 做个温度表  5v  =1024   2.5v=512 然后查表来做温度变换 这样来更快。
/*************************************************************
*        NTC=3950   10K                                 
*        取样电阻   R=10K
*      
*************************************************************/
const unsigned char temp_table[ ]=
{
   //60
     60,63,65,67,70,72,75,78,80,83,                 //0-9
     85,88,91,94,97,100,102,105,108,111,         //10-19
     114,117,120,122,125,128,131,134,136,139,    //20-29
     142,145,147,150,152,155,157,160,162,165,    //30-39
     167,170,172,174,176,178,180,183,185,186,    //40-49
     188,190,192,194,196,197,199,201,202,204,    //50-59
     205,207,208,209,211,212,213,214,216,217,    //60-69
     218,219,220,221,222,223,224,225,226,227,    //70-79
     227,228,229,230,231,231,232,233,233,234,    //80-89
     234,235,236,237,237,238,238,239,239,240,240     //90-99              
};   

//===================================================
//   NTC  AD 采样
//
//
//===================================================
void  ntc_ad(void)
{
  uchar i,j;
  DISI();
  AISR=0x08;                                    //P53 IS AD INPUT
  ADCON=0x0B;                                        //VREFS=VDD,CKR1/CKR0=00,ADPD=1,ADIS1/ADIS0=P53
  ADRUN=1;
  for(count=0;count<9;count++)
   {
     while(ADRUN)                        //WAIT ADC END
            {
                 WDTC();
                }
          ad_val[count]=ADDATA;          
          ADRUN=1;
   }          
   
//========================冒泡======================================  
    count=9;
         for(i=0;i<count;i++)
          {
           for(j=0;j<(count-i);j++)
            {
            if (ad_val[j]>ad_val[j+1])
              {
                        temp=ad_val[j+1];
                        ad_val[j+1]=ad_val[j];
                        ad_val[j]=temp;
               }
             }
           }
           if(ad_val[4]<=60)   
            {
               tt_new=0;
               return;
            }        
           if(ad_val[4]>=240)
            {
               tt_new=99;
               return;
            }  
            
           tt_2=temp_table[tt_new+1];
       tt_1=temp_table[tt_new-1];     
       if((ad_val[4]<=tt_1)||(ad_val[4]>=tt_2))
        {
          count1++;
          if(count1>5)
            {
              count1=0;
              tt_new=0;
                  do                                
                {
                  if(temp_table[tt_new]>=ad_val[4])
                   {
                     break;
                   }
                  tt_new++;     
                }while(tt_new<100);
            }
        }
      else
        {
            count1=0;
        }
    ENI();
}

我用的是义隆的芯片  AD 是8位
作者: 刘海龙    时间: 2016-10-27 21:52
七颗星星 发表于 2016-10-27 14:21
那这个程序应该怎么写呀,我只会写简单的,这个我不太会,还有今天课间问了老师这个电路,老师说按原理可 ...

根据这个程序的思路自己改改
作者: hi海龟    时间: 2016-11-21 11:01
不错,谢谢分享
作者: 急不可待    时间: 2016-11-22 09:16
这个要看看。0度一下不显?
作者: 2527    时间: 2016-11-22 10:54
很有用
作者: ma070432    时间: 2016-11-23 14:57
非常实用!感谢分享学习中!
作者: gshuxiao8    时间: 2016-12-5 21:49
真的值得学习,,,!!
作者: 简单点爱情    时间: 2016-12-8 15:57
不错 不错 不错的
作者: adls    时间: 2016-12-9 06:10
真的值得学习!谢谢分享
作者: titan90921    时间: 2016-12-13 11:11

 很好的一个学习例程。
作者: 随易而安    时间: 2016-12-13 19:54

 很好的一个学习例程。
作者: kevintang    时间: 2016-12-14 20:22
不错,谢谢分享。
作者: yeemes    时间: 2016-12-15 22:59
不错,谢谢
作者: kkfy888    时间: 2016-12-18 22:39
负温如何显示呢?
作者: 邰夏留    时间: 2016-12-19 08:43
参考学习下
作者: 刘海龙    时间: 2016-12-20 13:19
kkfy888 发表于 2016-12-18 22:39
负温如何显示呢?

数码管换成4位的,程序改改。
作者: 随易而安    时间: 2016-12-20 15:20
回帖有钱
作者: bpdy168    时间: 2017-2-7 18:45
请问读取一次温度值大约需要多长时间?

作者: 刘海龙    时间: 2017-2-7 20:14
bpdy168 发表于 2017-2-7 18:45
请问读取一次温度值大约需要多长时间?

读取一次1秒内
作者: zeng_fanlong    时间: 2017-2-8 08:42
不错不错
作者: ts01001    时间: 2017-2-9 15:59
赞一个!
作者: ts01001    时间: 2017-2-9 16:01
很好的一个学习例程。
作者: zjdt    时间: 2017-2-17 21:07
谢谢分享
作者: xieyajun888    时间: 2017-2-27 00:04
楼主太棒了,谢谢分享
作者: 奶油霄神    时间: 2017-2-27 10:05
6666666666666  等一下试一下
作者: nscj1998    时间: 2017-3-1 10:10
谢谢楼主!
作者: zying    时间: 2017-3-7 21:50
程序这个好!学习了。谢谢分享!!!!!!!!!!!!
作者: zhaok2013    时间: 2017-3-7 22:22
这个貌似需要AD/DA转换吧,单片机自带功能吗?
作者: imxuheng    时间: 2017-3-8 11:15
不错的制作,存这么多数据有些耗内存
作者: 刘海龙    时间: 2017-3-9 03:12
zhaok2013 发表于 2017-3-7 22:22
这个貌似需要AD/DA转换吧,单片机自带功能吗?

这块单片机自带ADC
作者: dwwzl    时间: 2017-3-9 07:56
真心是好文章!
作者: 越快乐越堕落    时间: 2017-3-10 17:37
为毛我的做出来显示乱码
作者: 刘海龙    时间: 2017-3-11 20:51
越快乐越堕落 发表于 2017-3-10 17:37
为毛我的做出来显示乱码

把数码管倒过来看
作者: 越快乐越堕落    时间: 2017-3-12 12:32
刘海龙 发表于 2017-3-11 20:51
把数码管倒过来看

不是这个问题 已经解决了 有引脚短路了。。。
作者: xllin    时间: 2017-4-9 20:17
用EXCEL做个公式来计算,应该好些
作者: fuckjg    时间: 2017-5-3 10:33
新人,学习一下
作者: dpzc1234    时间: 2017-5-9 09:58
搞得不错 ,学习一下 正好用到。
作者: 弱水三千@    时间: 2017-6-1 19:16
越快乐越堕落 发表于 2017-3-10 17:37
为毛我的做出来显示乱码

大佬能不能把上面那个程序发给我,我下载不了,邮箱591757523@qq.com,多谢了
作者: 3760609865    时间: 2017-6-4 08:12
我用此程序原码,修改部份程序后做了个简洁温度计,发张实物图,我用stc15w404As弄的。再次感谢楼主分享。
作者: 3760609865    时间: 2017-6-4 08:16
把照片发漏了,补上。

1496535188552..jpg (41.82 KB, 下载次数: 589)

1496535188552..jpg

作者: doudow    时间: 2017-6-7 15:31
感谢分享。
作者: doudow    时间: 2017-6-8 14:38
楼主太棒了,谢谢分享
作者: play_emma    时间: 2017-7-29 09:47
这个不错,可以参考一下,以前用的都是DS18B20.
作者: zhongjinhua1    时间: 2017-8-28 19:57


谢谢,学习学习
作者: 2387536488    时间: 2017-9-12 17:14
感谢!
作者: 2387536488    时间: 2017-9-12 17:15
好论坛,好人啊!
作者: lboy    时间: 2017-9-13 16:14
谢谢楼主分享
作者: 铭创    时间: 2017-9-14 10:43
学习中,学习中,
作者: join22life    时间: 2017-9-21 16:03
很好的资料,非常感谢楼主
作者: 独孤侠    时间: 2017-10-11 18:09
是我需要的.谢谢楼主无私奉献!
作者: majestslx    时间: 2017-10-12 09:11
非常感谢 最近也在做这个 支持lz
作者: tqmtonychen    时间: 2017-10-12 16:08
不错啊,准备做一个试试
作者: 大骨头    时间: 2017-10-13 22:41
非常不错,正在找这样的文章,可是不知道ADC怎么用!
作者: join22life    时间: 2017-10-16 14:32
非常的感谢你的分享,其他主题也很受用
作者: linxiangrong15    时间: 2017-10-31 23:22
给力!
作者: linxiangrong15    时间: 2017-10-31 23:23
给力!good。
作者: GUOXUAN    时间: 2017-12-8 21:31
楼主老师做的很细,这是绝世好贴!神贴呀!
我之前用过N多的NTC电阻,10K和20K的,用它加运放来制做温控风扇.我怎么就没想到用单片机的ADC通过查表来实现呢?
作者: wy382    时间: 2017-12-25 14:30
很好的一个学习例程。
作者: GGG160375123645    时间: 2017-12-25 15:30
谢谢分享!
作者: 撼地神牛雨    时间: 2018-1-6 19:20
学习一下。
作者: acp1234567    时间: 2018-2-8 13:54
非常不错。。。。。。。。。。。。。
作者: 神剑无敌    时间: 2018-2-19 18:48
挺好的 下载借鉴一下
作者: 2369526254    时间: 2018-3-8 14:52
谢谢分享刚好有这些东西可以验证一下谢谢
作者: 2369526254    时间: 2018-3-8 14:58
学习值得借鉴
作者: loobing    时间: 2018-3-8 17:24
这样也能工作?单片机不用晶振,不用复位?
作者: 神剑无敌    时间: 2018-4-2 20:40
好像重复下载也一样收黑币的
作者: 刘海龙    时间: 2018-4-2 21:30
loobing 发表于 2018-3-8 17:24
这样也能工作?单片机不用晶振,不用复位?

STC15W408AS单片机自带内部高精准晶振,内部自带复位电路‘
作者: 言必信行必果    时间: 2018-4-9 20:06
很好的一个学习例程。
作者: znddcc    时间: 2018-5-4 15:21
感谢分享,学习了
作者: njgwx    时间: 2018-5-6 21:13
kan kan kan.
作者: njgwx    时间: 2018-5-6 21:14
很好的一个学习例程
作者: 天涯无芳    时间: 2018-5-8 09:44
这个很好作者给了开源支持,正好适合我们初学者
作者: 1943681359    时间: 2018-5-8 22:22
谢谢分享,已用上
作者: mcuz    时间: 2018-5-19 19:10
感谢分享,让初学者少走弯路。
作者: omer    时间: 2018-5-21 16:59
感谢分享;
家里的机械调节电烤箱温度控制不准确,准备diy个NTC的测温及温度设置,学习了。
作者: dukecheng    时间: 2018-5-23 15:56
学习了
作者: nanning321    时间: 2018-5-24 16:02
DIY4位数码管加按键可控预定温度,加热温度到预定温度停止输出
作者: allen2016    时间: 2018-5-30 13:43
下来玩玩哦,好!
作者: TKJT    时间: 2018-6-4 07:36
感谢分享
作者: mxsohu    时间: 2018-6-5 14:31
谢谢楼主分享,楼主制作和上传辛苦了
作者: wzs909    时间: 2018-6-11 15:20
赞一个!
作者: msydyf    时间: 2018-6-12 12:52
谢谢分享。
作者: priam    时间: 2018-7-1 18:59
谢谢楼主分享
作者: second_chan    时间: 2018-7-4 17:04
点赞一个,感谢楼主分享
作者: second_chan    时间: 2018-7-4 19:24
感谢楼主分享,看能否下载学习一下
作者: 17681899568    时间: 2018-7-11 13:03
真的好

作者: lxl941122    时间: 2018-7-11 14:39
在实际做电路时,建议在热敏电阻两端加上104,防止干扰,这样做对单片机好。
作者: fenghaihuac    时间: 2018-7-16 23:07
不错学习
作者: lee40039    时间: 2018-7-19 08:53
学习!值得借鉴
作者: zhouqiang    时间: 2018-7-20 20:10
多谢分享!
作者: 40560335    时间: 2018-8-1 10:30
本帖最后由 40560335 于 2018-8-1 10:55 编辑

不错,学习了!
作者: kongjkd    时间: 2018-8-14 08:46
先下载 表示感谢  正好前几天做了一个18b20的测温  不过价格太贵了,所以想用这个试试看
作者: hbdj1234    时间: 2018-8-24 09:25
很好的资料,非常感谢楼主!准备做一个试试看!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1