国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊(cè)
搜索

51單片機(jī)NTC熱敏電阻MF52 10K 3435溫度采集C語(yǔ)言程序 溫度特性表

[復(fù)制鏈接]
樓主
eng 發(fā)表于 2021-6-25 02:43:45 | 只看該作者 |只看大圖 |倒序?yàn)g覽 |閱讀模式
51單片機(jī)NTC熱敏電阻MF52 10K 3435溫度采集C語(yǔ)言程序 溫度特性表 1.png
  1. STC15單片機(jī)
  2. 實(shí)驗(yàn)名稱:使用NTC電阻測(cè)量溫度
  3. 實(shí)驗(yàn)內(nèi)容:
  4.         使用NTC電阻測(cè)量溫度并顯示在數(shù)碼管上
  5.         讀取DS18B20模塊測(cè)量溫度參考比較
  6. 實(shí)驗(yàn)器材:
  7.         STC15W408AS_DIP16 x1
  8.         DS18B20  x1
  9.         TM1637數(shù)碼管 x1
  10.         1%精度 熱敏電阻NTC-MF52-103/3435 10K 3435±1 x1
  11.         金屬膜電阻 1/4W 1% 五色環(huán) 10千歐 10K x1

  12. 在STC15單片機(jī)上使用NTC(10K)電阻測(cè)量溫度的基本方法:
  13.         電壓-->電阻-->溫度
  14. 1、先有一個(gè)準(zhǔn)確且穩(wěn)定的參考電壓,外部可以用TL431A,內(nèi)部可以使用STC15系列芯片自帶的Bang Gap電壓;
  15. 2、如果用Bang Gap基準(zhǔn)電壓,則需要使用第九通道讀取Bang Gap電壓相對(duì)于當(dāng)前MCU供電電壓VDD的ADC讀數(shù),然后計(jì)算出MCU供電電壓VDD;
  16. 3、有了Bang Gap電壓,再讀取NTC電阻電壓的ADC讀數(shù),就可以計(jì)算出NTC電阻當(dāng)前電壓;
  17. 4、有了NTC電阻電壓,MCU供電電壓VDD,就可以得到參考電阻(10k)的電壓,就可以計(jì)算出NTC電阻當(dāng)前的阻值;
  18. 5、有了NTC電阻當(dāng)前的阻值,查找溫度與NTC電阻阻值對(duì)應(yīng)關(guān)系表,就可以得到溫度值;

  19. 實(shí)驗(yàn)心得:
  20. 1、使用Bang Gap基準(zhǔn)電壓,必須使用芯片內(nèi)部IRC時(shí)鐘;
  21. 2、下載HEX時(shí),需要勾選"在程序區(qū)的結(jié)束處添加重要測(cè)試參數(shù)"選項(xiàng),才可在程序中讀取Bang Gap基準(zhǔn)電壓;
  22. 3、溫度與NTC電阻阻值對(duì)應(yīng)關(guān)系表,可用二分法查找提高速度;
  23. 4、查表得到的溫度精度只到整數(shù)位,可以用相鄰阻值區(qū)間估算小數(shù)位以提高準(zhǔn)確度;
  24. 5、STC15W408AS的代碼空間僅8k,存不了字體數(shù)據(jù),不適合使用液晶屏顯示輸出;
  25. 6、芯片的Band Gap基準(zhǔn)電壓bdg_voltage可以視為常量,加電后讀取一次即可;

  26. */

  27. #include "config.h"
  28. #include "delay.h"
  29. #include "ds18b20.h"
  30. #include "adc.h"
  31. #include "ntc.h"
  32. #include "uart.h"
  33. #include "TM1637.h"

  34. bit timer_flag_200ms        = 0;        //200ms定時(shí)觸發(fā)標(biāo)志位
  35. bit timer_flag_1s                = 0;        //1s定時(shí)觸發(fā)標(biāo)志位
  36. bit timer_flag_5s                = 0;        //5s定時(shí)觸發(fā)標(biāo)志位
  37. bit timer_flag_10s                = 0;        //10s定時(shí)觸發(fā)標(biāo)志位

  38. uint16 timer_count = 0;

  39. int8 pdata sbuf[20] = {0};  //字符串緩沖區(qū)

  40. void Timer0Init(void);
  41. void English_Font_test(void);
  42. void UART_Cmd_Handler(uint8 *buf, uint8 len);
  43. void DS18B20_Update_Show(void);
  44. void NTC_Update_Show(void);
  45. uint8 binarySearch(uint16 *nums, uint8 len, int16 target);

  46. //主函數(shù)
  47. void main(void)
  48. {
  49.         uint8 pdata uart_cmd_buf[64] = {0};

  50.         //設(shè)置STC15W408AS單片機(jī)端口為標(biāo)準(zhǔn)模式
  51.         Config_Port();

  52.         //串口初始化,波特率9600
  53.         UART_Config_1(9600);
  54.         
  55.         //定時(shí)器0設(shè)置,1ms循環(huán)
  56.         Timer0Init();

  57.         //ADC功能初始化
  58.         ADC_Init();

  59.         //啟動(dòng)DS18B20
  60.         DS18B20_Start();

  61.         // 事件處理循環(huán)
  62.         while(1)
  63.         {        
  64.                 UART_Cmd_Check(&uart_cmd_buf, sizeof(uart_cmd_buf)-1);
  65.                
  66.         if (timer_flag_10s)  //每隔10s執(zhí)行以下分支
  67.         {
  68.                         printf("\r\n>timer_count %06u seconds.\r\n", 10*++timer_count);
  69.             timer_flag_10s = 0;

  70.                         NTC_Update_Show();
  71.                         DS18B20_Update_Show();
  72.                 }
  73.                
  74.         }   
  75. }

  76. #define T1MS (65536-FOSC/1000)      //1T模式,1ms
  77. //#define T1MS (65536-FOSC/12/1000) //12T模式,1ms

  78. void Timer0Init(void)                //1毫秒@22.1184MHz
  79. {
  80.     AUXR |= 0x80;                   //定時(shí)器0為1T模式
  81. //  AUXR &= 0x7f;                   //定時(shí)器0為12T模式

  82.     TMOD = 0x00;                    //設(shè)置定時(shí)器為模式0(16位自動(dòng)重裝載)
  83.     TL0 = T1MS;                     //初始化計(jì)時(shí)值
  84.     TH0 = T1MS >> 8;
  85.     TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
  86.     ET0 = 1;                        //使能定時(shí)器0中斷
  87.     EA = 1;
  88. }

  89. /* T0中斷服務(wù)函數(shù),實(shí)現(xiàn)系統(tǒng)定時(shí)處理 */
  90. void Timer0_Interrupt_Service() interrupt 1
  91. {
  92.     static uint8 cnt_ms                = 0; // 毫秒計(jì)數(shù)器
  93.     static uint8 cnt_200ms        = 0; // 200毫秒計(jì)數(shù)器
  94.     static uint8 cnt_sec        = 0; // 秒計(jì)數(shù)器
  95.    
  96.     //定時(shí)200ms
  97.     if (++cnt_ms >= 200)
  98.     {
  99.         cnt_ms = 0;
  100.         timer_flag_200ms = 1;
  101.                 cnt_200ms++;
  102.         }

  103.         //定時(shí)1s
  104.         if (cnt_200ms >= 5)
  105.         {
  106.                 cnt_200ms = 0;
  107.                 timer_flag_1s = 1;

  108.                 if(255 > cnt_sec) cnt_sec++;
  109.                 else cnt_sec = 0;

  110.                 //定時(shí)5s
  111.                 if (0 == cnt_sec % 5)
  112.                 {
  113.                         timer_flag_5s = 1;
  114.                 }

  115.                 //定時(shí)10s
  116.                 if (0 == cnt_sec % 10)
  117.                 {
  118.                         timer_flag_10s = 1;
  119.                 }

  120.         }

  121.     UART_Rxd_Monitor(1);  //串口接收監(jiān)控
  122. }

  123. /* 串口動(dòng)作函數(shù),根據(jù)接收到的命令幀執(zhí)行響應(yīng)的動(dòng)作
  124.    buf-接收到的命令幀指針,len-命令幀長(zhǎng)度 */
  125. void UART_Cmd_Handler(uint8 *buf, uint8 len)
  126. {
  127.         printf("\r\n>cmd recv: [%s] (len = %bu)\r\n", buf, len);
  128.         if(0 == strncmp("debug on", buf, 8))
  129.         {
  130.                 DEBUG_MODE = 1;
  131.                 printf(">cmd exec: debug on\r\n");
  132.         }
  133.         else if(0 == strncmp("debug off", buf, 9))
  134.         {
  135.                 DEBUG_MODE = 0;
  136.                 printf(">cmd exec: debug off\r\n");
  137.         }
  138.         else
  139.         {
  140.                 printf(">cmd unrecognized.\r\n");
  141.         }
  142. }


  143. void DS18B20_Update_Show(void)
  144. {
  145.         bit  sign = 0;
  146.         int16 val = 0;
  147.         int8 slen = 0;

  148.         //printf(">>>DS18B20: read...\r\n");

  149.         val = DS18B20_Read();
  150.         
  151.         if(0 > val)
  152.         {
  153.                 val *= -1;
  154.                 sign = 1;
  155.         }
  156.         
  157.         val %= 1000;

  158.         if(sign)
  159.         {
  160.                 sbuf[slen++] = '-';
  161.         }

  162.         //整數(shù)部分轉(zhuǎn)換為字符串
  163.         slen += sprintf(sbuf+slen, "%d.%d c", val / 10, val % 10);

  164.         //添加字符串結(jié)束符
  165.         sbuf[slen++] = '\0';

  166.         printf(">>>DS18B20 : %s\r\n", sbuf);
  167. }

  168. void NTC_Update_Show(void)
  169. {
  170.         int16 ntc_t = 0;
  171.         uint8 a, b, c;

  172.         ntc_t = NTC_ReadT();

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

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

  175.         //TM1637數(shù)碼管顯示測(cè)試
  176.         if(' ' == sbuf[0]) a = 22;
  177.         else if('-' == sbuf[0]) a = 21;
  178.         else a = sbuf[0] - '0';
  179.         b = sbuf[1] - '0';
  180.         c = sbuf[3] - '0';

  181.         // 使用TM1637數(shù)碼管模塊顯示NTC溫度,最后一位顯示字母c表示℃
  182.         TM1637_Display(a, b, c, 12);
  183. }
復(fù)制代碼
完整代碼及資料 uart_ntc10k_STC15W408AS.zip (440.95 KB, 售價(jià): 2 E幣)

51單片機(jī)NTC熱敏電阻MF52 10K 3435溫度采集C語(yǔ)言程序 溫度特性表 2.jpg



您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

手機(jī)版|小黑屋|ELEOK |網(wǎng)站地圖

GMT+8, 2026-5-26 04:10

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復(fù) 返回頂部 返回列表