国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標(biāo)題:
51單片機(jī)NTC熱敏電阻MF52 10K 3435溫度采集C語言程序 溫度特性表
[打印本頁]
作者:
eng
時間:
2021-6-25 02:43
標(biāo)題:
51單片機(jī)NTC熱敏電阻MF52 10K 3435溫度采集C語言程序 溫度特性表
1.png
(28.67 KB)
下載附件
2021-6-25 02:42 上傳
STC15單片機(jī)
實(shí)驗(yàn)名稱:使用NTC電阻測量溫度
實(shí)驗(yàn)內(nèi)容:
使用NTC電阻測量溫度并顯示在數(shù)碼管上
讀取DS18B20模塊測量溫度參考比較
實(shí)驗(yàn)器材:
STC15W408AS_DIP16 x1
DS18B20 x1
TM1637數(shù)碼管 x1
1%精度 熱敏電阻NTC-MF52-103/3435 10K 3435±1 x1
金屬膜電阻 1/4W 1% 五色環(huán) 10千歐 10K x1
在STC15單片機(jī)上使用NTC(10K)電阻測量溫度的基本方法:
電壓-->電阻-->溫度
1、先有一個準(zhǔn)確且穩(wěn)定的參考電壓,外部可以用TL431A,內(nèi)部可以使用STC15系列芯片自帶的Bang Gap電壓;
2、如果用Bang Gap基準(zhǔn)電壓,則需要使用第九通道讀取Bang Gap電壓相對于當(dāng)前MCU供電電壓VDD的ADC讀數(shù),然后計(jì)算出MCU供電電壓VDD;
3、有了Bang Gap電壓,再讀取NTC電阻電壓的ADC讀數(shù),就可以計(jì)算出NTC電阻當(dāng)前電壓;
4、有了NTC電阻電壓,MCU供電電壓VDD,就可以得到參考電阻(10k)的電壓,就可以計(jì)算出NTC電阻當(dāng)前的阻值;
5、有了NTC電阻當(dāng)前的阻值,查找溫度與NTC電阻阻值對應(yīng)關(guān)系表,就可以得到溫度值;
實(shí)驗(yàn)心得:
1、使用Bang Gap基準(zhǔn)電壓,必須使用芯片內(nèi)部IRC時鐘;
2、下載HEX時,需要勾選"在程序區(qū)的結(jié)束處添加重要測試參數(shù)"選項(xiàng),才可在程序中讀取Bang Gap基準(zhǔn)電壓;
3、溫度與NTC電阻阻值對應(yīng)關(guān)系表,可用二分法查找提高速度;
4、查表得到的溫度精度只到整數(shù)位,可以用相鄰阻值區(qū)間估算小數(shù)位以提高準(zhǔn)確度;
5、STC15W408AS的代碼空間僅8k,存不了字體數(shù)據(jù),不適合使用液晶屏顯示輸出;
6、芯片的Band Gap基準(zhǔn)電壓bdg_voltage可以視為常量,加電后讀取一次即可;
*/
#include "config.h"
#include "delay.h"
#include "ds18b20.h"
#include "adc.h"
#include "ntc.h"
#include "uart.h"
#include "TM1637.h"
bit timer_flag_200ms = 0; //200ms定時觸發(fā)標(biāo)志位
bit timer_flag_1s = 0; //1s定時觸發(fā)標(biāo)志位
bit timer_flag_5s = 0; //5s定時觸發(fā)標(biāo)志位
bit timer_flag_10s = 0; //10s定時觸發(fā)標(biāo)志位
uint16 timer_count = 0;
int8 pdata sbuf[20] = {0}; //字符串緩沖區(qū)
void Timer0Init(void);
void English_Font_test(void);
void UART_Cmd_Handler(uint8 *buf, uint8 len);
void DS18B20_Update_Show(void);
void NTC_Update_Show(void);
uint8 binarySearch(uint16 *nums, uint8 len, int16 target);
//主函數(shù)
void main(void)
{
uint8 pdata uart_cmd_buf[64] = {0};
//設(shè)置STC15W408AS單片機(jī)端口為標(biāo)準(zhǔn)模式
Config_Port();
//串口初始化,波特率9600
UART_Config_1(9600);
//定時器0設(shè)置,1ms循環(huán)
Timer0Init();
//ADC功能初始化
ADC_Init();
//啟動DS18B20
DS18B20_Start();
// 事件處理循環(huán)
while(1)
{
UART_Cmd_Check(&uart_cmd_buf, sizeof(uart_cmd_buf)-1);
if (timer_flag_10s) //每隔10s執(zhí)行以下分支
{
printf("\r\n>timer_count %06u seconds.\r\n", 10*++timer_count);
timer_flag_10s = 0;
NTC_Update_Show();
DS18B20_Update_Show();
}
}
}
#define T1MS (65536-FOSC/1000) //1T模式,1ms
//#define T1MS (65536-FOSC/12/1000) //12T模式,1ms
void Timer0Init(void) //1毫秒@22.1184MHz
{
AUXR |= 0x80; //定時器0為1T模式
// AUXR &= 0x7f; //定時器0為12T模式
TMOD = 0x00; //設(shè)置定時器為模式0(16位自動重裝載)
TL0 = T1MS; //初始化計(jì)時值
TH0 = T1MS >> 8;
TR0 = 1; //定時器0開始計(jì)時
ET0 = 1; //使能定時器0中斷
EA = 1;
}
/* T0中斷服務(wù)函數(shù),實(shí)現(xiàn)系統(tǒng)定時處理 */
void Timer0_Interrupt_Service() interrupt 1
{
static uint8 cnt_ms = 0; // 毫秒計(jì)數(shù)器
static uint8 cnt_200ms = 0; // 200毫秒計(jì)數(shù)器
static uint8 cnt_sec = 0; // 秒計(jì)數(shù)器
//定時200ms
if (++cnt_ms >= 200)
{
cnt_ms = 0;
timer_flag_200ms = 1;
cnt_200ms++;
}
//定時1s
if (cnt_200ms >= 5)
{
cnt_200ms = 0;
timer_flag_1s = 1;
if(255 > cnt_sec) cnt_sec++;
else cnt_sec = 0;
//定時5s
if (0 == cnt_sec % 5)
{
timer_flag_5s = 1;
}
//定時10s
if (0 == cnt_sec % 10)
{
timer_flag_10s = 1;
}
}
UART_Rxd_Monitor(1); //串口接收監(jiān)控
}
/* 串口動作函數(shù),根據(jù)接收到的命令幀執(zhí)行響應(yīng)的動作
buf-接收到的命令幀指針,len-命令幀長度 */
void UART_Cmd_Handler(uint8 *buf, uint8 len)
{
printf("\r\n>cmd recv: [%s] (len = %bu)\r\n", buf, len);
if(0 == strncmp("debug on", buf, 8))
{
DEBUG_MODE = 1;
printf(">cmd exec: debug on\r\n");
}
else if(0 == strncmp("debug off", buf, 9))
{
DEBUG_MODE = 0;
printf(">cmd exec: debug off\r\n");
}
else
{
printf(">cmd unrecognized.\r\n");
}
}
void DS18B20_Update_Show(void)
{
bit sign = 0;
int16 val = 0;
int8 slen = 0;
//printf(">>>DS18B20: read...\r\n");
val = DS18B20_Read();
if(0 > val)
{
val *= -1;
sign = 1;
}
val %= 1000;
if(sign)
{
sbuf[slen++] = '-';
}
//整數(shù)部分轉(zhuǎn)換為字符串
slen += sprintf(sbuf+slen, "%d.%d c", val / 10, val % 10);
//添加字符串結(jié)束符
sbuf[slen++] = '\0';
printf(">>>DS18B20 : %s\r\n", sbuf);
}
void NTC_Update_Show(void)
{
int16 ntc_t = 0;
uint8 a, b, c;
ntc_t = NTC_ReadT();
sprintf(sbuf, "%4.1f", (float)ntc_t/10);
printf(">>>NTC_T : %s c\r\n", sbuf);
//TM1637數(shù)碼管顯示測試
if(' ' == sbuf[0]) a = 22;
else if('-' == sbuf[0]) a = 21;
else a = sbuf[0] - '0';
b = sbuf[1] - '0';
c = sbuf[3] - '0';
// 使用TM1637數(shù)碼管模塊顯示NTC溫度,最后一位顯示字母c表示℃
TM1637_Display(a, b, c, 12);
}
復(fù)制代碼
完整代碼及資料
:
uart_ntc10k_STC15W408AS.zip
(440.95 KB, 售價: 2 E幣)
2021-6-25 02:43 上傳
點(diǎn)擊文件名下載附件
售價: 2 E幣
[記錄]
[
購買
]
2.jpg
(23.17 KB)
下載附件
2021-6-25 02:42 上傳
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0