久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9740|回復: 8
打印 上一主題 下一主題
收起左側

51單片機學習實踐:用NTC電阻測溫并顯示在TM1637數碼管 附程序

  [復制鏈接]
跳轉到指定樓層
樓主
STC15單片機
實驗名稱:使用NTC電阻測量溫度
實驗內容:
        使用NTC電阻測量溫度并顯示在數碼管上
        讀取DS18B20模塊測量溫度作為參考
實驗器材:
        STC15W408AS_DIP16 x1
        DS18B20  x1
        TM1637數碼管 x1
        1%精度 熱敏電阻NTC-MF52-103/3435 10K 3435±1 x1
        金屬膜電阻 1/4W 1% 五色環 10千歐 10K x1

在STC15單片機上使用NTC(10K)電阻測量溫度的基本方法:
        電壓-->電阻-->溫度
1、先有一個準確且穩定的參考電壓,外部可以用TL431A,內部可以使用STC15系列芯片自帶的Bang Gap電壓;
2、如果用Bang Gap基準電壓,則需要使用第九通道讀取Bang Gap電壓相對于當前MCU供電電壓VDD的ADC讀數,然后計算出MCU供電電壓VDD;
3、有了Bang Gap電壓,再讀取NTC電阻電壓的ADC讀數,就可以計算出NTC電阻當前電壓;
4、有了NTC電阻電壓,MCU供電電壓VDD,就可以得到參考電阻(10k)的電壓,就可以計算出NTC電阻當前的阻值;
5、有了NTC電阻當前的阻值,查找溫度與NTC電阻阻值對應關系表,就可以得到溫度值;

實驗心得:
1、使用Bang Gap基準電壓,必須使用芯片內部IRC時鐘,不能使用外部晶振;
2、下載HEX時,需要勾選"在程序區的結束處添加重要測試參數"選項,才可在程序中讀取Bang Gap基準電壓;
3、溫度與NTC電阻阻值對應關系表,可用二分法查找提高速度;
4、查表得到的溫度精度只到整數位,可以用相鄰阻值區間估算小數位以提高準確度;
5、STC15W408AS的代碼空間僅8k,存不下字體數據,不適合使用液晶屏顯示輸出;
6、芯片的Band Gap基準電壓bdg_voltage可以視為常量,加電后讀取一次即可;

TM1637數碼管顯示效果如下:


下載HEX時,需要勾選"在程序區的結束處添加重要測試參數"選項,才可在程序中讀取Bang Gap基準電壓;
使用Bang Gap基準電壓,必須使用芯片內部IRC時鐘,不能使用外部晶振;


通過 串口助手 可以觀察 NTC電阻和DS18B20測試的溫度數值對比




  1. //主函數
  2. void main(void)
  3. {
  4.         uint8 pdata uart_cmd_buf[64] = {0};

  5.         //設置STC15W408AS單片機端口為標準模式
  6.         Config_Port();

  7.         //串口初始化,波特率9600
  8.         UART_Config_1(9600);
  9.         
  10.         //定時器0設置,1ms循環
  11.         Timer0Init();

  12.         //ADC功能初始化
  13.         ADC_Init();

  14.         //啟動DS18B20
  15.         DS18B20_Start();

  16.         // 事件處理循環
  17.         while(1)
  18.         {        
  19.                 UART_Cmd_Check(&uart_cmd_buf, sizeof(uart_cmd_buf)-1);
  20.                
  21.         if (timer_flag_10s)  //每隔10s執行以下分支
  22.         {
  23.                         printf("\r\n>timer_count %06u seconds.\r\n", 10*++timer_count);
  24.             timer_flag_10s = 0;

  25.                         NTC_Update_Show();
  26.                         DS18B20_Update_Show();
  27.                 }
  28.                
  29.         }   
  30. }
復制代碼
  1. void NTC_Update_Show(void)
  2. {
  3.         int16 ntc_t = 0;
  4.         uint8 a, b, c;

  5.         ntc_t = NTC_ReadT();

  6.         sprintf(sbuf, "%4.1f", (float)ntc_t/10);

  7.         printf(">>>NTC_T   : %s c\r\n", sbuf);

  8.         //TM1637數碼管顯示測試
  9.         if(' ' == sbuf[0]) a = 22;
  10.         else if('-' == sbuf[0]) a = 21;
  11.         else a = sbuf[0] - '0';
  12.         b = sbuf[1] - '0';
  13.         c = sbuf[3] - '0';

  14.         // 使用TM1637數碼管模塊顯示NTC溫度,最后一位顯示字母c表示℃
  15.         TM1637_Display(a, b, c, 12);
  16. }
復制代碼
  1. //溫度與NTC電阻阻值對應關系表
  2. //MF52 10K3435 溫度特性表
  3. uint16 code ntc10k_tab[] = {

  4. // 阻值(Ω),溫度
  5. // 190556, /* -40 */
  6. // 183413, /* -39 */
  7. // 175674, /* -38 */
  8. // 167647, /* -37 */
  9. // 159565, /* -36 */
  10. // 151598, /* -35 */
  11. // 143862, /* -34 */
  12. // 136436, /* -33 */
  13. // 129364, /* -32 */
  14. // 122668, /* -31 */
  15. // 116352, /* -30 */
  16. // 110410, /* -29 */
  17. // 104827, /* -28 */
  18. // 99585, /* -27 */
  19. // 94661, /* -26 */
  20. // 90033, /* -25 */
  21. // 85678, /* -24 */
  22. // 81575, /* -23 */
  23. // 77703, /* -22 */
  24. // 74044, /* -21 */
  25. // 70581, /* -20 */
  26. // 67299, /* -19 */
  27. // 64183, /* -18 */
  28. // 61223, /* -17 */
  29. // 58408, /* -16 */
  30. // 55728, /* -15 */
  31. // 53177, /* -14 */
  32. // 50746, /* -13 */
  33. // 48429, /* -12 */
  34. // 46222, /* -11 */
  35. //44120, /* -10 */
  36. 42118, /* -9 */
  37. 40212, /* -8 */
  38. 38399, /* -7 */
  39. 36675, /* -6 */
  40. 35036, /* -5 */
  41. 33480, /* -4 */
  42. 32004, /* -3 */
  43. 30603, /* -2 */
  44. 29275, /* -1 */
  45. 28017, /* 0 */
  46. 26826, /* 1 */
  47. 25697, /* 2 */
  48. 24629, /* 3 */
  49. 23618, /* 4 */
  50. 22660, /* 5 */
  51. 21752, /* 6 */
  52. 20892, /* 7 */
  53. 20075, /* 8 */
  54. 19299, /* 9 */
  55. 18560, /* 10 */
  56. 18482, /* 11 */
  57. 18149, /* 12 */
  58. 17632, /* 13 */
  59. 16992, /* 14 */
  60. 16280, /* 15 */
  61. 15535, /* 16 */
  62. 14787, /* 17 */
  63. 14055, /* 18 */
  64. 13354, /* 19 */
  65. 12690, /* 20 */
  66. 12068, /* 21 */
  67. 11490, /* 22 */
  68. 10954, /* 23 */
  69. 10458, /* 24 */
  70. 10000, /* 25 */
  71. 9576, /* 26 */
  72. 9184, /* 27 */
  73. 8819, /* 28 */
  74. 8478, /* 29 */
  75. 8160, /* 30 */
  76. 7861, /* 31 */
  77. 7579, /* 32 */
  78. 7311, /* 33 */
  79. 7056, /* 34 */
  80. 6813, /* 35 */
  81. 6581, /* 36 */
  82. 6357, /* 37 */
  83. 6142, /* 38 */
  84. 5934, /* 39 */
  85. 5734, /* 40 */
  86. 5541, /* 41 */
  87. 5353, /* 42 */
  88. 5173, /* 43 */
  89. 4998, /* 44 */
  90. 4829, /* 45 */
  91. 4665, /* 46 */
  92. 4507, /* 47 */
  93. 4355, /* 48 */
  94. 4208, /* 49 */
  95. 4065, /* 50 */
  96. 3927, /* 51 */
  97. 3794, /* 52 */
  98. 3664, /* 53 */
  99. 3538, /* 54 */
  100. 3415, /* 55 */
  101. 3294, /* 56 */
  102. 3175, /* 57 */
  103. 3058, /* 58 */
  104. 2941, /* 59 */
  105. 2825, /* 60 */
  106. 2776, /* 61 */
  107. 2718, /* 62 */
  108. 2652, /* 63 */
  109. 2582, /* 64 */
  110. 2508, /* 65 */
  111. 2432, /* 66 */
  112. 2356, /* 67 */
  113. 2280, /* 68 */
  114. 2207, /* 69 */
  115. 2135, /* 70 */
  116. 2066, /* 71 */
  117. 2000, /* 72 */
  118. 1938, /* 73 */
  119. 1879, /* 74 */
  120. 1823, /* 75 */
  121. 1770, /* 76 */
  122. 1720, /* 77 */
  123. 1673, /* 78 */
  124. 1628, /* 79 */
  125. 1586, /* 80 */
  126. 1546, /* 81 */
  127. 1508, /* 82 */
  128. 1471, /* 83 */
  129. 1435, /* 84 */
  130. 1401, /* 85 */
  131. 1367, /* 86 */
  132. 1334, /* 87 */
  133. 1301, /* 88 */
  134. 1268, /* 89 */
  135. 1236, /* 90 */
  136. 1204, /* 91 */
  137. 1171, /* 92 */
  138. 1139, /* 93 */
  139. 1107, /* 94 */
  140. 1074, /* 95 */
  141. 1042, /* 96 */
  142. 1010, /* 97 */
  143. 979, /* 98 */
  144. 948, /* 99 */
  145. // 918, /* 100 */
  146. // 889, /* 101 */
  147. // 861, /* 102 */
  148. // 835, /* 103 */
  149. // 810, /* 104 */
  150. // 787, /* 105 */
  151. // 767, /* 106 */
  152. // 749, /* 107 */
  153. // 733, /* 108 */
  154. // 721, /* 109 */
  155. // 713, /* 110 */
  156. };
復制代碼
  1. int8 NTC_bSearch(uint16 *tab, uint8 tab_size, int16 val)
  2. {
  3.     uint8 mid        = 0;
  4.     uint8 left        = 0;
  5.         uint8 right        = tab_size - 1;

  6.         if(val > tab[0]) return -1; // 溫度下限
  7.         else if(val < tab[tab_size - 1]) return -2; // 溫度上限

  8.     while(left <= right)
  9.         {
  10.         mid = (right + left) / 2;
  11.         if(val == tab[mid])
  12.             return mid;
  13.         else if (val > tab[mid])
  14.             right = mid - 1;
  15.         else if (val < tab[mid])
  16.             left = mid + 1;
  17.         }

  18.     return mid;
  19. }

  20. /*
  21. 根據ADC電壓值計算NTC10K電阻值
  22. r_ref為1%精度 10k電阻阻值,如 9963 Ω
  23. adc_voltage是讀取到的NTC10K電壓
  24. vdd_voltage是讀取到的系統電壓
  25. */
  26. uint16 NTC_ReadR(uint16 r_ref)
  27. {
  28.     //計算ADC通道的電阻值(歐姆),參考分壓電阻值r_ref歐姆
  29.         return r_ref * adc_voltage / (vdd_voltage - adc_voltage);
  30. }

  31. int16 NTC_ReadT(void)
  32. {
  33.         uint16 ntc_r = 0;
  34.         uint16 ref_r = 0;
  35.         int16  ntc_t = 0;
  36.         uint8 idx  = 0;
  37.         int16 dec  = 0;

  38.         ADC_ReadBandGapVoltage();
  39.         if(DEBUG_MODE) printf(">>>NTC_ReadT: bdg_voltage = %5.2f mV\r\n", (float)bdg_voltage);

  40.         ADC_ReadCh9Val();
  41.         if(DEBUG_MODE) printf(">>>NTC_ReadT: adc_ch9_val = %u\r\n", adc_ch9_val);

  42.         //指定ADC端口P1.4讀取NTC電阻電壓
  43.         ADC_ReadChxVoltage(4);
  44.         if(DEBUG_MODE) printf(">>>NTC_ReadT: adc_voltage = %5.2f mV\r\n", adc_voltage);

  45.         ADC_ReadVddVoltage();
  46.         if(DEBUG_MODE) printf(">>>NTC_ReadT: vdd_voltage = %5.2f mV\r\n", vdd_voltage);
  47.         
  48.         ntc_r = NTC_ReadR(NTC_R10K_REF);
  49.         if(DEBUG_MODE) printf(">>>NTC_ReadT: ntc_r = %u ohm\r\n", ntc_r);

  50.         idx = NTC_bSearch(ntc10k_tab, ARRAY_SIZE(ntc10k_tab), ntc_r);

  51.         if(-1 == idx)                 return -99;
  52.         else if(-2 == idx)        return 999;
  53.         
  54.         if(DEBUG_MODE) printf(">>>NTC_bSearch: ntc10k_tab[%bu] = %d ohm\r\n", idx, ntc10k_tab[idx]);

  55.         if(ntc_r != ntc10k_tab[idx])
  56.         {
  57.                 // 使用相鄰阻值區間估算溫度值小數部分,四舍五入

  58.                 if(ntc_r > ntc10k_tab[idx] && idx > 0)
  59.                 {
  60.                         dec = 100 * (ntc_r - ntc10k_tab[idx])/(ntc10k_tab[idx-1] - ntc10k_tab[idx]);
  61.                         //if(DEBUG_MODE) printf(">>>NTC_ReadT: dec = %d = 100 * (%d)/(%d)\r\n", dec, (ntc_r - ntc10k_tab[idx]), (ntc10k_tab[idx-1] - ntc10k_tab[idx]));
  62.                 }
  63.                 else if(ntc_r < ntc10k_tab[idx] && idx < ARRAY_SIZE(ntc10k_tab))
  64.                 {
  65.                         dec = 100 * (ntc10k_tab[idx] - ntc_r)/(ntc10k_tab[idx] - ntc10k_tab[idx+1]);
  66.                         //if(DEBUG_MODE) printf(">>>NTC_ReadT: dec = %d = 100 * (%d)/(%d)\r\n", dec, (ntc10k_tab[idx] - ntc_r), (ntc10k_tab[idx] - ntc10k_tab[idx+1]));
  67.                 }
  68.                 if(5 < dec % 10) dec += 10;
  69.                 dec /= 10;

  70.                 if(ntc_r > ntc10k_tab[idx])
  71.                 {
  72.                         dec *= -1;
  73.                 }
  74.         }

  75.         if(DEBUG_MODE) printf(">>>NTC_ReadT:   int = %4.1f c\r\n", (float)(idx-9));
  76.         if(DEBUG_MODE) printf(">>>NTC_ReadT:   dec = %2.1f c\r\n", (float)dec/10);

  77.         ntc_t = 10*(idx-9) + dec;

  78.         //if(DEBUG_MODE) printf(">>>NTC_ReadT: ntc_t = %4.1f c\r\n", (float)ntc_t/10);

  79.         return ntc_t;
  80. }

復制代碼
完整代碼如下:



uart_ntc10k_STC15W408AS.7z (425.15 KB, 下載次數: 295)



評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏19 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:65956 發表于 2020-11-7 08:38 | 只看該作者
下載參考一下,謝謝分享
回復

使用道具 舉報

板凳
ID:328014 發表于 2020-11-7 16:37 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:856401 發表于 2020-12-17 01:48 | 只看該作者
單片機高手
回復

使用道具 舉報

5#
ID:856401 發表于 2021-1-10 11:12 | 只看該作者
感謝樓主分享,我也要做一個
回復

使用道具 舉報

6#
ID:366464 發表于 2021-1-30 20:14 | 只看該作者
老芯片,新光彩!
回復

使用道具 舉報

7#
ID:704837 發表于 2022-5-19 19:19 | 只看該作者
一看就發現錯誤的計算,return r_ref * adc_voltage / (vdd_voltage - adc_voltage);(我個人判斷)
回復

使用道具 舉報

8#
ID:344646 發表于 2022-11-18 13:51 | 只看該作者
看看1637怎么驅動顯示
回復

使用道具 舉報

9#
ID:1112603 發表于 2024-3-25 14:20 | 只看該作者
下載學習單片機測溫程序
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲二区精品 | 亚洲天堂男人的天堂 | 中文在线一区二区 | 成人在线不卡 | 日韩久久精品视频 | 一级黄色录像毛片 | 91热在线| 欧美精品一区二区三区蜜臀 | 国产精品亚洲第一 | 日韩国产欧美一区 | 国产在线中文字幕 | 羞羞视频在线免费 | 亚洲一区视频在线播放 | 五月激情婷婷网 | 欧美成人免费在线 | 国产精品久久久久久久久久不蜜臀 | 青青久草 | 81精品国产乱码久久久久久 | 欧美国产日韩一区 | 一级黄a| 国产精品久久午夜夜伦鲁鲁 | 国产不卡在线播放 | 精品一二 | 国产日韩精品在线 | 免费观看的av毛片的网站 | 色999日韩 | 99久久久久久久 | 欧美一级久久 | 成人精品网 | 久久久久国产精品一区三寸 | 精品一二区 | 久久午夜精品福利一区二区 | 国产成人精品午夜视频免费 | 在线免费黄色小视频 | 日本精品视频在线观看 | 亚洲视频一区在线观看 | 国产欧美一区二区三区日本久久久 | 日韩一区二区免费视频 | 国产精品污www一区二区三区 | 在线观看黄视频 | 蜜桃特黄a∨片免费观看 |