標(biāo)題: 開源4個元件打造NTC10K溫度計 [打印本頁]

作者: 劉海龍    時間: 2016-10-25 19:32
標(biāo)題: 開源4個元件打造NTC10K溫度計
1.最近發(fā)現(xiàn)壇里對熱敏電阻測溫系統(tǒng)呼聲很高,剛好我手里有個NTC10K的熱敏電阻,于是乎我就打算做個熱敏電阻溫度計。
2.我首先了解了NTC熱敏電阻的特性,阻值隨溫度的升高而減小。通過廠商提供的溫度和電阻對應(yīng)的關(guān)系表就可以知道阻值對應(yīng)的溫度,要想測溫度就要測出熱敏電阻的阻值,知道了原理就好辦多了。


3.閉上眼開始思考測量電阻的方法,不可能直接拿萬用表測吧,首先想到初中物理學(xué)到的R=U/I(電阻的阻值等于加在它兩端的電壓除以流過它的電流)。只要在熱敏電阻上加上電,測出電壓和電流就行了。


4.測量電壓可以用ADC測量,可是電流怎么測量呢?于是想到串聯(lián)電路電流相等,把一個已知阻值的精密電阻和熱敏電阻串聯(lián),根據(jù)I=U/R測到已知電阻上分得的電壓就可以知道電路中的電流了。


5.系統(tǒng)原理:NTC 10k熱敏電阻和10k精密電阻串聯(lián)接入VCC—GND,利用單片機內(nèi)部的ADC模塊測出NTC電阻上分的電壓ADC_V以及系統(tǒng)的供電電壓POWER_V,從而得到10k精密電阻上的電壓R_V=(POWER_V-ADC_V),根據(jù)電阻串聯(lián)電流相等可以知道NTC電阻中的電流I=R_V/10K,,再根據(jù)U=I*R可得到熱敏電阻的阻值NTC_R=ADC_V/I,通過查表找出此阻值對應(yīng)的溫度。此系統(tǒng)由于使用了STC單片機內(nèi)部的電壓基準(zhǔn)為參考,所以測溫精度不受系統(tǒng)電壓VCC的影響。


6.為了簡化NTC10k測溫系統(tǒng)的硬件制作難度,我盡量優(yōu)化設(shè)計,只需NTC熱敏電阻+10k精密電阻+STC單片機+數(shù)碼管公4個元件。單片機依然采用STC15W408ASS,溫度顯示只有兩位所以數(shù)碼管采用3位共陰數(shù)碼管(把數(shù)碼管旋轉(zhuǎn)180度顛倒過來使用,前兩位顯示溫度第三位顯示“”符號),10k電阻盡量選擇精密一點的。
下圖為測得的室溫21度


下圖為數(shù)碼管正放時的顯示,實際使用時要旋轉(zhuǎn)180度放
(這樣就可以顯示溫度符號℃)


下圖為原理圖截圖(源文件見附件PADS layout)


下圖為買熱敏電阻時賣家提供的阻值與溫度對應(yīng)關(guān)系表




請評分支持一下謝謝
  1. /********************************************/
  2. //2016.10.24日編寫完成
  3. //作者:劉海龍 (讀單片機內(nèi)部BandGap基準(zhǔn)電壓值參考的STC官網(wǎng)程序)
  4. //硬件:STC15W408AS+3位共陰數(shù)碼管+1個10K的電阻(最好選用精密電阻)+NTC10K熱敏電阻
  5. //晶振選12M或11.0952M
  6. /*原理:NTC 10k熱敏電阻和10k精密電阻串聯(lián)接入VCC—GND,利用單片機內(nèi)部的ADC
  7. 模塊測出NTC電阻上分的電壓ADC_V以及系統(tǒng)的供電電壓POWER_V,從而得到10k精密電阻上
  8. 的電壓R_V=(POWER_V-ADC_V),根據(jù)電阻串聯(lián)電流相等可以知道NTC電阻中的電流I=R_V/10K,
  9. ,再根據(jù)U=I*R可得到熱敏電阻的阻值NTC_R=ADC_V/I,通過查表找出此阻值對應(yīng)的溫度。*/
  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]={//溫度與電阻阻值對應(yīng)關(guān)系表格
  15. 0,3274,//0度對應(yīng)阻值32.74k
  16. 1,3111,//1度對應(yīng)阻值31.11k
  17. 2,2957,//2度對應(yīng)阻值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度對應(yīng)阻值10k               
  41. 26,957,//26度對應(yīng)阻值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度對應(yīng)阻值1.02k
  102. 87,        99,//87度對應(yīng)阻值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度對應(yīng)阻值0.58k
  121.          

  122. };        
  123. #include<4LED_YIN.H>//數(shù)碼管驅(qū)動顯示程序
  124. #include <BandGap.H>//包含讀單片機內(nèi)部BandGap基準(zhǔn)電壓值
  125. void T_dis(){//溫度處理函數(shù)采集到的阻值與二維數(shù)組的阻值進(jìn)行比較,從而獲得相對應(yīng)的溫度值。
  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();//待系統(tǒng)穩(wěn)定
  137.     InitADC();//初始化ADC
  138.     P1M1=0X80;//P1.7高阻輸入
  139.         init();//IO口設(shè)置初始化
  140.     while (1)
  141.     {
  142.         ShowResult(7);//測量NTC熱敏電阻上的電壓并根據(jù)電壓計算出阻值
  143.                 T_dis();//測量到的阻值進(jìn)行查表對比找到阻值對應(yīng)的溫度值
  144.                 disp();        //數(shù)碼管顯示溫度值
  145.     }
  146. }
復(fù)制代碼





NTC10K溫度計02.png (757.21 KB, 下載次數(shù): 414)

NTC10K溫度計02.png

NTC10K溫度計源程序 原理圖.rar

2.34 MB, 下載次數(shù): 1233, 下載積分: 黑幣 -5


作者: 維超    時間: 2016-10-26 08:59
很好的一個學(xué)習(xí)例程。
作者: wc86110    時間: 2016-10-26 16:24
用四位數(shù)碼管測溫范圍會更寬
作者: 劉海龍    時間: 2016-10-26 16:50
wc86110 發(fā)表于 2016-10-26 16:24
用四位數(shù)碼管測溫范圍會更寬

此制作僅為拋磚引玉,壇友可以加入更好的創(chuàng)意進(jìn)去。
作者: 七顆星星    時間: 2016-10-27 12:57
請問按照你的原理,因為你的單片機里已經(jīng)包含了AD轉(zhuǎn)換模塊,若必須分離出來那么這樣行嗎?NTC 10k熱敏電阻和10k精密電阻串聯(lián),然后將它接入A/D轉(zhuǎn)換器,例如ADC0804然后通過DB1~DB2將數(shù)字信號送入單片機,而這個數(shù)就是NTC的分壓值,之后由再計算那個NTC的電阻,再查表求溫度,可以不?
作者: 劉海龍    時間: 2016-10-27 13:56
七顆星星 發(fā)表于 2016-10-27 12:57
請問按照你的原理,因為你的單片機里已經(jīng)包含了AD轉(zhuǎn)換模塊,若必須分離出來那么這樣行嗎?NTC 10k熱敏電阻 ...

可以的

作者: 七顆星星    時間: 2016-10-27 14:21
劉海龍 發(fā)表于 2016-10-27 13:56
可以的

那這個程序應(yīng)該怎么寫呀,我只會寫簡單的,這個我不太會,還有今天課間問了老師這個電路,老師說按原理可以實現(xiàn),要我仿真看看,他說加到AD的電路的電壓前面靈敏度會不夠,可能要加一個電壓放大器,這應(yīng)該怎么連接呢
作者: 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
七顆星星 發(fā)表于 2016-10-27 14:21
那這個程序應(yīng)該怎么寫呀,我只會寫簡單的,這個我不太會,還有今天課間問了老師這個電路,老師說按原理可 ...

根據(jù)這個程序的思路自己改改
作者: hi海龜    時間: 2016-11-21 11:01
不錯,謝謝分享
作者: 急不可待    時間: 2016-11-22 09:16
這個要看看。0度一下不顯?
作者: 2527    時間: 2016-11-22 10:54
很有用
作者: ma070432    時間: 2016-11-23 14:57
非常實用!感謝分享學(xué)習(xí)中!
作者: gshuxiao8    時間: 2016-12-5 21:49
真的值得學(xué)習(xí),,,��!
作者: 簡單點愛情    時間: 2016-12-8 15:57
不錯 不錯 不錯的
作者: adls    時間: 2016-12-9 06:10
真的值得學(xué)習(xí)!謝謝分享
作者: titan90921    時間: 2016-12-13 11:11

 很好的一個學(xué)習(xí)例程。
作者: 隨易而安    時間: 2016-12-13 19:54

 很好的一個學(xué)習(xí)例程。
作者: kevintang    時間: 2016-12-14 20:22
不錯,謝謝分享。
作者: yeemes    時間: 2016-12-15 22:59
不錯,謝謝
作者: kkfy888    時間: 2016-12-18 22:39
負(fù)溫如何顯示呢?
作者: 邰夏留    時間: 2016-12-19 08:43
參考學(xué)習(xí)下
作者: 劉海龍    時間: 2016-12-20 13:19
kkfy888 發(fā)表于 2016-12-18 22:39
負(fù)溫如何顯示呢?

數(shù)碼管換成4位的,程序改改。
作者: 隨易而安    時間: 2016-12-20 15:20
回帖有錢
作者: bpdy168    時間: 2017-2-7 18:45
請問讀取一次溫度值大約需要多長時間?

作者: 劉海龍    時間: 2017-2-7 20:14
bpdy168 發(fā)表于 2017-2-7 18:45
請問讀取一次溫度值大約需要多長時間?

讀取一次1秒內(nèi)
作者: zeng_fanlong    時間: 2017-2-8 08:42
不錯不錯
作者: ts01001    時間: 2017-2-9 15:59
贊一個!
作者: ts01001    時間: 2017-2-9 16:01
很好的一個學(xué)習(xí)例程。
作者: 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
程序這個好!學(xué)習(xí)了。謝謝分享�。。。。。。。。。。�!
作者: zhaok2013    時間: 2017-3-7 22:22
這個貌似需要AD/DA轉(zhuǎn)換吧,單片機自帶功能嗎?
作者: imxuheng    時間: 2017-3-8 11:15
不錯的制作,存這么多數(shù)據(jù)有些耗內(nèi)存
作者: 劉海龍    時間: 2017-3-9 03:12
zhaok2013 發(fā)表于 2017-3-7 22:22
這個貌似需要AD/DA轉(zhuǎn)換吧,單片機自帶功能嗎?

這塊單片機自帶ADC
作者: dwwzl    時間: 2017-3-9 07:56
真心是好文章!
作者: 越快樂越墮落    時間: 2017-3-10 17:37
為毛我的做出來顯示亂碼
作者: 劉海龍    時間: 2017-3-11 20:51
越快樂越墮落 發(fā)表于 2017-3-10 17:37
為毛我的做出來顯示亂碼

把數(shù)碼管倒過來看
作者: 越快樂越墮落    時間: 2017-3-12 12:32
劉海龍 發(fā)表于 2017-3-11 20:51
把數(shù)碼管倒過來看

不是這個問題 已經(jīng)解決了 有引腳短路了。。。
作者: xllin    時間: 2017-4-9 20:17
用EXCEL做個公式來計算,應(yīng)該好些
作者: fuckjg    時間: 2017-5-3 10:33
新人,學(xué)習(xí)一下
作者: dpzc1234    時間: 2017-5-9 09:58
搞得不錯 ,學(xué)習(xí)一下 正好用到。
作者: 弱水三千@    時間: 2017-6-1 19:16
越快樂越墮落 發(fā)表于 2017-3-10 17:37
為毛我的做出來顯示亂碼

大佬能不能把上面那個程序發(fā)給我,我下載不了,郵箱591757523@qq.com,多謝了
作者: 3760609865    時間: 2017-6-4 08:12
我用此程序原碼,修改部份程序后做了個簡潔溫度計,發(fā)張實物圖,我用stc15w404As弄的。再次感謝樓主分享。
作者: 3760609865    時間: 2017-6-4 08:16
把照片發(fā)漏了,補上。

1496535188552..jpg (41.82 KB, 下載次數(shù): 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


謝謝,學(xué)習(xí)學(xué)習(xí)
作者: 2387536488    時間: 2017-9-12 17:14
感謝!
作者: 2387536488    時間: 2017-9-12 17:15
好論壇,好人��!
作者: lboy    時間: 2017-9-13 16:14
謝謝樓主分享
作者: 銘創(chuàng)    時間: 2017-9-14 10:43
學(xué)習(xí)中,學(xué)習(xí)中,
作者: join22life    時間: 2017-9-21 16:03
很好的資料,非常感謝樓主
作者: 獨孤俠    時間: 2017-10-11 18:09
是我需要的.謝謝樓主無私奉獻(xiàn)!
作者: majestslx    時間: 2017-10-12 09:11
非常感謝 最近也在做這個 支持lz
作者: tqmtonychen    時間: 2017-10-12 16:08
不錯啊,準(zhǔn)備做一個試試
作者: 大骨頭    時間: 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
樓主老師做的很細(xì),這是絕世好貼!神貼呀!
我之前用過N多的NTC電阻,10K和20K的,用它加運放來制做溫控風(fēng)扇.我怎么就沒想到用單片機的ADC通過查表來實現(xiàn)呢?
作者: wy382    時間: 2017-12-25 14:30
很好的一個學(xué)習(xí)例程。
作者: GGG160375123645    時間: 2017-12-25 15:30
謝謝分享!
作者: 撼地神牛雨    時間: 2018-1-6 19:20
學(xué)習(xí)一下。
作者: acp1234567    時間: 2018-2-8 13:54
非常不錯。。。。。。。。。。。。。
作者: 神劍無敵    時間: 2018-2-19 18:48
挺好的 下載借鑒一下
作者: 2369526254    時間: 2018-3-8 14:52
謝謝分享剛好有這些東西可以驗證一下謝謝
作者: 2369526254    時間: 2018-3-8 14:58
學(xué)習(xí)值得借鑒
作者: loobing    時間: 2018-3-8 17:24
這樣也能工作?單片機不用晶振,不用復(fù)位?
作者: 神劍無敵    時間: 2018-4-2 20:40
好像重復(fù)下載也一樣收黑幣的
作者: 劉海龍    時間: 2018-4-2 21:30
loobing 發(fā)表于 2018-3-8 17:24
這樣也能工作?單片機不用晶振,不用復(fù)位?

STC15W408AS單片機自帶內(nèi)部高精準(zhǔn)晶振,內(nèi)部自帶復(fù)位電路‘
作者: 言必信行必果    時間: 2018-4-9 20:06
很好的一個學(xué)習(xí)例程。
作者: znddcc    時間: 2018-5-4 15:21
感謝分享,學(xué)習(xí)了
作者: njgwx    時間: 2018-5-6 21:13
kan kan kan.
作者: njgwx    時間: 2018-5-6 21:14
很好的一個學(xué)習(xí)例程
作者: 天涯無芳    時間: 2018-5-8 09:44
這個很好作者給了開源支持,正好適合我們初學(xué)者
作者: 1943681359    時間: 2018-5-8 22:22
謝謝分享,已用上
作者: mcuz    時間: 2018-5-19 19:10
感謝分享,讓初學(xué)者少走彎路。
作者: omer    時間: 2018-5-21 16:59
感謝分享;
家里的機械調(diào)節(jié)電烤箱溫度控制不準(zhǔn)確,準(zhǔn)備diy個NTC的測溫及溫度設(shè)置,學(xué)習(xí)了。
作者: dukecheng    時間: 2018-5-23 15:56
學(xué)習(xí)了
作者: nanning321    時間: 2018-5-24 16:02
DIY4位數(shù)碼管加按鍵可控預(yù)定溫度,加熱溫度到預(yù)定溫度停止輸出
作者: 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
感謝樓主分享,看能否下載學(xué)習(xí)一下
作者: 17681899568    時間: 2018-7-11 13:03
真的好

作者: lxl941122    時間: 2018-7-11 14:39
在實際做電路時,建議在熱敏電阻兩端加上104,防止干擾,這樣做對單片機好。
作者: fenghaihuac    時間: 2018-7-16 23:07
不錯學(xué)習(xí)
作者: lee40039    時間: 2018-7-19 08:53
學(xué)習(xí)!值得借鑒
作者: zhouqiang    時間: 2018-7-20 20:10
多謝分享!
作者: 40560335    時間: 2018-8-1 10:30
本帖最后由 40560335 于 2018-8-1 10:55 編輯

不錯,學(xué)習(xí)了!
作者: kongjkd    時間: 2018-8-14 08:46
先下載 表示感謝  正好前幾天做了一個18b20的測溫  不過價格太貴了,所以想用這個試試看
作者: hbdj1234    時間: 2018-8-24 09:25
很好的資料,非常感謝樓主!準(zhǔn)備做一個試試看!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1