单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

开源4个元件打造NTC10K温度计

  [复制链接]
回帖奖励 9 黑币 回复本帖可获得 3 黑币奖励! 每人限 1 次(中奖概率 80%)
跳转到指定楼层
楼主
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, 下载次数: 126)

NTC10K温度计02.png

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

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

评分

参与人数 20黑币 +172 收起 理由
100860903 + 5 赞一个!
slhslhhao + 5 赞一个!
YJGG + 12 很给力!
凌净清河 + 16 非常精炼,看着舒服,感谢
zhanghoub + 5
h198513 + 5 赞一个!
天涯无芳 + 3 很给力!
sirf3 + 3
GUOXUAN + 15 绝世好帖!
lishiliang + 6 很给力!
brave_ruan + 10 很给力!
3760609865 + 12 很给力!
zhaok2013 + 5 赞一个!
nscj1998 + 5 赞一个!
davg1 + 35 共享资料的黑币奖励!
ssfc + 5 很给力!
随易而安 + 5 共享资料的黑币奖励!
titan90921 + 5 很给力!
滴~电子小白 + 5 赞一个!
维超 + 10 赞一个!

查看全部评分

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

使用道具 举报

沙发
维超 发表于 2016-10-26 08:59 | 只看该作者
很好的一个学习例程。
回复

使用道具 举报

板凳
wc86110 发表于 2016-10-26 16:24 | 只看该作者

回帖奖励 +3 黑币

用四位数码管测温范围会更宽
回复

使用道具 举报

地板
 楼主| 刘海龙 发表于 2016-10-26 16:50 | 只看该作者
wc86110 发表于 2016-10-26 16:24
用四位数码管测温范围会更宽

此制作仅为抛砖引玉,坛友可以加入更好的创意进去。
回复

使用道具 举报

5#
七颗星星 发表于 2016-10-27 12:57 来自手机 | 只看该作者

回帖奖励 +3 黑币

请问按照你的原理,因为你的单片机里已经包含了AD转换模块,若必须分离出来那么这样行吗?NTC 10k热敏电阻和10k精密电阻串联,然后将它接入A/D转换器,例如ADC0804然后通过DB1~DB2将数字信号送入单片机,而这个数就是NTC的分压值,之后由再计算那个NTC的电阻,再查表求温度,可以不?
回复

使用道具 举报

6#
 楼主| 刘海龙 发表于 2016-10-27 13:56 | 只看该作者
七颗星星 发表于 2016-10-27 12:57
请问按照你的原理,因为你的单片机里已经包含了AD转换模块,若必须分离出来那么这样行吗?NTC 10k热敏电阻 ...

可以的
回复

使用道具 举报

7#
七颗星星 发表于 2016-10-27 14:21 来自手机 | 只看该作者
刘海龙 发表于 2016-10-27 13:56
可以的

那这个程序应该怎么写呀,我只会写简单的,这个我不太会,还有今天课间问了老师这个电路,老师说按原理可以实现,要我仿真看看,他说加到AD的电路的电压前面灵敏度会不够,可能要加一个电压放大器,这应该怎么连接呢
回复

使用道具 举报

8#
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位

评分

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

查看全部评分

回复

使用道具 举报

9#
 楼主| 刘海龙 发表于 2016-10-27 21:52 | 只看该作者
七颗星星 发表于 2016-10-27 14:21
那这个程序应该怎么写呀,我只会写简单的,这个我不太会,还有今天课间问了老师这个电路,老师说按原理可 ...

根据这个程序的思路自己改改
回复

使用道具 举报

10#
hi海龟 发表于 2016-11-21 11:01 | 只看该作者
不错,谢谢分享
回复

使用道具 举报

11#
急不可待 发表于 2016-11-22 09:16 | 只看该作者
这个要看看。0度一下不显?
回复

使用道具 举报

12#
2527 发表于 2016-11-22 10:54 | 只看该作者
很有用
回复

使用道具 举报

13#
ma070432 发表于 2016-11-23 14:57 | 只看该作者
非常实用!感谢分享学习中!
回复

使用道具 举报

14#
gshuxiao8 发表于 2016-12-5 21:49 | 只看该作者
真的值得学习,,,!!
回复

使用道具 举报

15#
简单点爱情 发表于 2016-12-8 15:57 | 只看该作者

回帖奖励 +3 黑币

不错 不错 不错的
回复

使用道具 举报

16#
adls 发表于 2016-12-9 06:10 | 只看该作者
真的值得学习!谢谢分享
回复

使用道具 举报

17#
titan90921 发表于 2016-12-13 11:11 | 只看该作者

 很好的一个学习例程。
回复

使用道具 举报

18#
随易而安 发表于 2016-12-13 19:54 | 只看该作者

 很好的一个学习例程。
回复

使用道具 举报

19#
kevintang 发表于 2016-12-14 20:22 | 只看该作者
不错,谢谢分享。
回复

使用道具 举报

20#
yeemes 发表于 2016-12-15 22:59 | 只看该作者
不错,谢谢
回复

使用道具 举报

21#
kkfy888 发表于 2016-12-18 22:39 | 只看该作者
负温如何显示呢?
回复

使用道具 举报

22#
邰夏留 发表于 2016-12-19 08:43 | 只看该作者
参考学习下
回复

使用道具 举报

23#
 楼主| 刘海龙 发表于 2016-12-20 13:19 | 只看该作者
kkfy888 发表于 2016-12-18 22:39
负温如何显示呢?

数码管换成4位的,程序改改。
回复

使用道具 举报

24#
随易而安 发表于 2016-12-20 15:20 | 只看该作者

回帖奖励 +3 黑币

回帖有钱
回复

使用道具 举报

25#
bpdy168 发表于 2017-2-7 18:45 | 只看该作者

回帖奖励 +3 黑币

请问读取一次温度值大约需要多长时间?
回复

使用道具 举报

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

读取一次1秒内
回复

使用道具 举报

27#
zeng_fanlong 发表于 2017-2-8 08:42 | 只看该作者
不错不错
回复

使用道具 举报

28#
ts01001 发表于 2017-2-9 15:59 | 只看该作者
赞一个!
回复

使用道具 举报

29#
ts01001 发表于 2017-2-9 16:01 | 只看该作者
很好的一个学习例程。
回复

使用道具 举报

30#
zjdt 发表于 2017-2-17 21:07 | 只看该作者
谢谢分享
回复

使用道具 举报

31#
xieyajun888 发表于 2017-2-27 00:04 | 只看该作者
楼主太棒了,谢谢分享
回复

使用道具 举报

32#
奶油霄神 发表于 2017-2-27 10:05 | 只看该作者
6666666666666  等一下试一下
回复

使用道具 举报

33#
nscj1998 发表于 2017-3-1 10:10 | 只看该作者
谢谢楼主!
回复

使用道具 举报

34#
zying 发表于 2017-3-7 21:50 | 只看该作者
程序这个好!学习了。谢谢分享!!!!!!!!!!!!
回复

使用道具 举报

35#
zhaok2013 发表于 2017-3-7 22:22 | 只看该作者

回帖奖励 +3 黑币

这个貌似需要AD/DA转换吧,单片机自带功能吗?
回复

使用道具 举报

36#
imxuheng 发表于 2017-3-8 11:15 | 只看该作者
不错的制作,存这么多数据有些耗内存
回复

使用道具 举报

37#
 楼主| 刘海龙 发表于 2017-3-9 03:12 | 只看该作者
zhaok2013 发表于 2017-3-7 22:22
这个貌似需要AD/DA转换吧,单片机自带功能吗?

这块单片机自带ADC
回复

使用道具 举报

38#
dwwzl 发表于 2017-3-9 07:56 | 只看该作者
真心是好文章!
回复

使用道具 举报

39#
越快乐越堕落 发表于 2017-3-10 17:37 | 只看该作者
为毛我的做出来显示乱码
回复

使用道具 举报

40#
 楼主| 刘海龙 发表于 2017-3-11 20:51 | 只看该作者
越快乐越堕落 发表于 2017-3-10 17:37
为毛我的做出来显示乱码

把数码管倒过来看
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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