一、項(xiàng)目介紹
溫度檢測(cè)是工業(yè)自動(dòng)化、生產(chǎn)線等眾多領(lǐng)域中常見的應(yīng)用場(chǎng)景之一,能及時(shí)準(zhǔn)確地監(jiān)測(cè)溫度對(duì)于保障生產(chǎn)安全和提高生產(chǎn)效率有著非常重要的作用。而在現(xiàn)代的電子制造行業(yè)中,使用單片機(jī)和傳感器等電子元器件進(jìn)行溫度檢測(cè)已經(jīng)成為了一個(gè)比較成熟的技術(shù)方案。
本項(xiàng)目選擇STC89C52單片機(jī)和DS18B20數(shù)字溫度傳感器,通過讀取傳感器輸出的溫度值,經(jīng)過計(jì)算和處理后,并將結(jié)果顯示在數(shù)碼管上,實(shí)現(xiàn)環(huán)境溫度的實(shí)時(shí)監(jiān)測(cè)和顯示。其中,STC89C52單片機(jī)為主控芯片,負(fù)責(zé)接收和處理數(shù)字溫度傳感器的數(shù)據(jù),并通過數(shù)碼管將溫度值進(jìn)行顯示。
二、整體設(shè)計(jì)
【1】設(shè)計(jì)思路
使用 STC89C52 單片機(jī)和 DS18B20 數(shù)字溫度傳感器,通過 I/O 口進(jìn)行連接,讀取傳感器輸出的溫度值。通過計(jì)算和處理后,將溫度值在數(shù)碼管上進(jìn)行顯示。其中,STC89C52 單片機(jī)為主控芯片,負(fù)責(zé)接收和處理數(shù)字溫度傳感器的數(shù)據(jù),并通過數(shù)碼管將溫度值進(jìn)行顯示。
【2】硬件連接
硬件方面,需要使用 STC89C52 單片機(jī)和 DS18B20 數(shù)字溫度傳感器。其中,STC89C52 單片機(jī)通過 P1 口連接4位數(shù)碼管的動(dòng)態(tài)掃描信號(hào)線,并與 DS18B20 傳感器的 DQ 線相連。DS18B20需要使用一個(gè)2.2K歐姆上拉電阻和一個(gè)10K歐姆下拉電阻。
【3】軟件設(shè)計(jì)
在軟件方面,主要進(jìn)行以下操作:
(1)初始化函數(shù)
初始化串行總線,設(shè)置為推挽輸出,并將數(shù)碼管段選端口初始化為高電平輸出,數(shù)碼管位選端口初始化為低電平輸出。
(2)讀取溫度值函數(shù)
通過發(fā)送讀取命令,從 DS18B20 數(shù)字溫度傳感器中讀取溫度值。
(3)溫度值計(jì)算函數(shù)
根據(jù) DS18B20 數(shù)字溫度傳感器的溫度值計(jì)算方法,將讀取到的數(shù)值進(jìn)行轉(zhuǎn)換,得到實(shí)際溫度值。
(4)數(shù)碼管顯示函數(shù)
將溫度值分離出整數(shù)和小數(shù)部分,然后經(jīng)過數(shù)碼管驅(qū)動(dòng)程序,通過數(shù)碼管進(jìn)行顯示。
三、具體代碼實(shí)現(xiàn)
【1】DS18B20溫度讀取
DS18B20 是一種數(shù)字溫度傳感器,采用單總線接口進(jìn)行通訊。它可以在較長(zhǎng)的距離內(nèi)實(shí)現(xiàn)溫度值的準(zhǔn)確測(cè)量,并且不需要調(diào)零或校準(zhǔn),被廣泛應(yīng)用于各種計(jì)算機(jī)控制系統(tǒng)、電子設(shè)備和溫度控制應(yīng)用中。其分辨率為 12 位,溫度范圍為 -55 度 Celsius 到 +125 度 Celsius。
下面代碼實(shí)現(xiàn)的功能是:讀取DS18B20溫度再通過串口打印出來(lái)。
#include < reg51.h >
?
#define uchar unsigned char
#define uint unsigned int
?
sbit DQ = P1^0; // DS18B20 數(shù)字溫度傳感器數(shù)據(jù)線連接到 P1.0 引腳
?
// DS18B20 數(shù)據(jù)傳輸函數(shù)
void DS18B20_WriteByte(uchar dat);
uchar DS18B20_ReadByte();
void DS18B20_Start();
void DS18B20_End();
void DS18B20_Delay(uint i);
?
// 初始化函數(shù)
void init();
?
// 串口初始化函數(shù)
void uart_init();
?
// 串口發(fā)送函數(shù)
void send_string(char *s);
?
void main()
{
uchar temp_h, temp_l;
uint temp;
?
init();
uart_init(); // 串口初始化
?
while(1)
{
DS18B20_Start(); // 啟動(dòng)傳輸
DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
DS18B20_WriteByte(0x44); // 發(fā)送溫度轉(zhuǎn)換指令
DS18B20_End(); // 結(jié)束傳輸
?
DS18B20_Start(); // 啟動(dòng)傳輸
DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
DS18B20_WriteByte(0xBE); // 發(fā)送讀取指令
?
// 讀取溫度值
temp_l = DS18B20_ReadByte(); // 讀取低位溫度值
temp_h = DS18B20_ReadByte(); // 讀取高位溫度值
?
// 計(jì)算溫度值
temp = (temp_h < < 8) + temp_l;
temp = (float)temp / 16;
send_string("The temperature is: ");
send_string(temp);
send_string("
");
?
DS18B20_End(); // 結(jié)束傳輸
}
}
?
// DS18B20 數(shù)據(jù)傳輸函數(shù)
void DS18B20_WriteByte(uchar dat)
{
uchar i;
?
for (i = 0; i < 8; i++)
{
DQ = 0; // 寫時(shí)序開始
DQ = dat & 0x01; // 寫數(shù)據(jù)
DS18B20_Delay(1); // 延時(shí) 1us
DQ = 1; // 寫時(shí)序結(jié)束
dat > >= 1;
}
}
?
uchar DS18B20_ReadByte()
{
uchar i, dat = 0;
?
for (i = 0; i < 8; i++)
{
DQ = 0; // 讀時(shí)序開始
DS18B20_Delay(1); // 延時(shí) 1us
dat > >= 1;
if(DQ)
dat |= 0x80;
DS18B20_Delay(5); // 延時(shí) 5us