一、項(xiàng)目介紹
數(shù)字溫度計(jì)是一種廣泛應(yīng)用于日常生活和工業(yè)領(lǐng)域中的電子測(cè)量?jī)x器,用于檢測(cè)環(huán)境溫度并將其轉(zhuǎn)換為數(shù)字信號(hào)進(jìn)行顯示。隨著現(xiàn)代科技的發(fā)展,數(shù)字溫度計(jì)逐漸取代了傳統(tǒng)的水銀溫度計(jì)等方式,具有快速響應(yīng)、高精度、便攜式等優(yōu)點(diǎn)。
基于51單片機(jī)設(shè)計(jì)的數(shù)字溫度計(jì)具體應(yīng)用于制造業(yè)中的溫度檢測(cè),例如溫度控制器、烤箱溫度控制、食品加工、工業(yè)爐等領(lǐng)域。通過DS18B20這種數(shù)字溫度傳感器來進(jìn)行溫度采集,使用STC89C52這種常用的單片機(jī)控制芯片,配合4位共陽數(shù)碼管實(shí)現(xiàn)溫度數(shù)據(jù)顯示,并通過按鍵設(shè)置溫度上限閥值,一旦溫度超過閥值,系統(tǒng)會(huì)觸發(fā)蜂鳴器進(jìn)行報(bào)警提示,從而保證了溫度的精準(zhǔn)控制和安全性。
DS18B20是一種數(shù)字溫度傳感器,由Maxim Integrated公司生產(chǎn)。采用1-Wire總線接口,只需要一個(gè)數(shù)據(jù)線就可以同時(shí)實(shí)現(xiàn)數(shù)據(jù)傳輸和供電。主要特點(diǎn)是精度高、響應(yīng)速度快、體積小、價(jià)格低廉,被廣泛應(yīng)用于各種溫度測(cè)量場(chǎng)合。
DS18B20可以測(cè)量的溫度范圍為-55℃~+125℃,精度為±0.5℃(在-10℃~+85℃范圍內(nèi))。內(nèi)部集成了溫度傳感器、A/D轉(zhuǎn)換器和數(shù)字信號(hào)處理電路,可以直接輸出數(shù)字溫度值。
DS18B20的工作原理是利用溫度對(duì)半導(dǎo)體材料電阻值的影響,將溫度轉(zhuǎn)化為電阻值,再通過A/D轉(zhuǎn)換器將電阻值轉(zhuǎn)化為數(shù)字信號(hào)輸出。1-Wire總線接口可以實(shí)現(xiàn)多個(gè)DS18B20傳感器的串聯(lián),只需要一個(gè)控制器就可以同時(shí)讀取多個(gè)傳感器的溫度數(shù)據(jù)。
在熱敏電阻測(cè)溫系統(tǒng)中,可以使用DS18B20傳感器來測(cè)量環(huán)境溫度,并將溫度值傳輸?shù)娇刂破髦羞M(jìn)行處理和顯示。
下面是仿真圖:
二、設(shè)計(jì)思路
2.1 系統(tǒng)架構(gòu)
系統(tǒng)硬件主要由單片機(jī)控制模塊、溫度傳感器模塊、數(shù)碼管顯示模塊、按鍵模塊、蜂鳴器模塊組成。其中單片機(jī)控制模塊采用STC89C52作為主控芯片,通過連接數(shù)碼管、按鍵、蜂鳴器、溫度傳感器等外圍電路實(shí)現(xiàn)溫度檢測(cè)、控制和報(bào)警功能。
2.2 技術(shù)方案
(1)溫度傳感器模塊 本項(xiàng)目采用DS18B20數(shù)字式溫度傳感器進(jìn)行溫度檢測(cè),該傳感器具有精度高、響應(yīng)快、可靠性強(qiáng)等優(yōu)點(diǎn)。通過將其與單片機(jī)進(jìn)行串口通信,實(shí)現(xiàn)溫度數(shù)據(jù)的采集。
(2)數(shù)碼管顯示模塊 本項(xiàng)目采用4位共陽數(shù)碼管進(jìn)行溫度數(shù)據(jù)的顯示,通過設(shè)置單片機(jī)控制IO口實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)掃描和顯示。
(3)按鍵模塊 本項(xiàng)目通過設(shè)置按鍵模塊實(shí)現(xiàn)對(duì)溫度上限閥值的設(shè)定,采用矩陣按鍵實(shí)現(xiàn)多個(gè)按鍵功能。
(4)蜂鳴器模塊 本項(xiàng)目采用蜂鳴器作為報(bào)警提示器,當(dāng)溫度超過上限閥值時(shí),觸發(fā)單片機(jī)控制后,蜂鳴器會(huì)發(fā)出一定頻率的報(bào)警信號(hào)。
2.3 系統(tǒng)實(shí)現(xiàn)流程
(1)主程序初始化:設(shè)置IO口模式、串口配置、定時(shí)器中斷等參數(shù)。
(2)溫度檢測(cè):通過DS18B20進(jìn)行溫度采集,并將采集到的數(shù)據(jù)解析為實(shí)際溫度值。
(3)數(shù)碼管顯示:將溫度值通過數(shù)碼管進(jìn)行數(shù)據(jù)的顯示。
(4)上限閥值設(shè)置:通過按鍵設(shè)置溫度上限閥值,將閥值存儲(chǔ)在單片機(jī)內(nèi)部的EEPROM中。
(5)報(bào)警提示:當(dāng)溫度值超過閥值時(shí),觸發(fā)蜂鳴器發(fā)出報(bào)警信號(hào)。
三、代碼實(shí)現(xiàn)
3.1 4位共陽極數(shù)碼管顯示代碼
下面是控制STC89C52通過P1口控制4位共陽極數(shù)碼管顯示數(shù)字1234的實(shí)現(xiàn)代碼:
#include < reg52.h >
?
// 定義數(shù)碼管端口連接的IO口
sbit Dig1 = P1^0;
sbit Dig2 = P1^1;
sbit Dig3 = P1^2;
sbit Dig4 = P1^3;
?
// 定義數(shù)碼管段碼
unsigned char code SegCode[] = {
0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};
?
void main()
{
unsigned int num = 1234; // 要顯示的數(shù)字
unsigned char i, j, k, l; // 分別表示千位、百位、十位和個(gè)位
?
while (1) {
// 將數(shù)字分解為千位、百位、十位和個(gè)位
i = num / 1000;
j = num % 1000 / 100;
k = num % 100 / 10;
l = num % 10;
?
// 顯示千位
Dig1 = 1;
P0 = SegCode[i];
Dig1 = 0;
?
// 顯示百位
Dig2 = 1;
P0 = SegCode[j];
Dig2 = 0;
?
// 顯示十位
Dig3 = 1;
P0 = SegCode[k];
Dig3 = 0;
?
// 顯示個(gè)位
Dig4 = 1;
P0 = SegCode[l];
Dig4 = 0;
}
}
這段代碼中,定義了數(shù)碼管端口連接的IO口,然后定義了數(shù)碼管段碼。在main
函數(shù)中,將要顯示的數(shù)字1234分解為千位、百位、十位和個(gè)位,并通過控制P1口的四個(gè)IO口,依次顯示出來。這里使用共陽極數(shù)碼管,需要將對(duì)應(yīng)位的IO口置為0才能點(diǎn)亮數(shù)碼管。
3.2 數(shù)字溫度計(jì)實(shí)現(xiàn)代碼
下面是數(shù)字溫度計(jì)完整的代碼。
#include < reg52.h >
?
// 定義溫度傳感器引腳
sbit DQ = P3^7;
// 定義數(shù)碼管引腳
sbit DIG_1 = P2^0;
sbit DIG_2 = P2^1;
sbit DIG_3 = P2^2;
sbit DIG_4 = P2^3;
sbit SEG_A = P1^0;
sbit SEG_B = P1^1;
sbit SEG_C = P1^2;
sbit SEG_D = P1^3;
sbit SEG_E = P1^4;
sbit SEG_F = P1^5;
sbit SEG_G = P1^6;
sbit SEG_DP = P1^7;
// 定義按鍵引腳
sbit KEY_SET = P0^0;
sbit KEY_ADD = P0^1;
sbit KEY_SUB = P0^2;
?
// 定義全局變量
unsigned char code DisplayChar[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xf8, 0x80, 0x90}; // 數(shù)碼管顯示字符編碼
unsigned char TempData[4] = {0, 0, 0, 0}; // 顯示溫度值的數(shù)組
unsigned char SetTemp = 25; // 設(shè)定溫度上限閥值
unsigned char LastKeyStatus = 0x07; // 按鍵狀態(tài)
unsigned char Count = 0; // 數(shù)碼管掃描計(jì)數(shù)器
bit IsAlarm = 0; // 報(bào)警狀態(tài)
?
// 定時(shí)器中斷服務(wù)函數(shù)
void Timer0_ISR() interrupt 1 {
TH0 = 0xfc;
TL0 = 0x67;
?
DIG_1 = DIG_2 = DIG_3 = DIG_4 = 1; // 關(guān)閉所有數(shù)碼管
Count++; // 數(shù)碼管掃描計(jì)數(shù)器加1
?
switch (Count) {
case 1: // 掃描第1位數(shù)碼管
DIG_1 = 0;
P0 = TempData[3];
break;
case 2: // 掃描第2位數(shù)碼管
DIG_2 = 0;
P0 = TempData[2];
break;
case 3: // 掃描第3位數(shù)碼管
DIG_3 = 0;
P0 = TempData[1];
break;
case 4: // 掃描第4位數(shù)碼管
DIG_4 = 0;
P0 = TempData[0];
break;
default:
Count = 0;
break;
}
}
?
// 延時(shí)函數(shù)
void Delay(unsigned int n) {
unsigned int i, j;
?
for(i=0; i< n; i++) {
for(j=0; j< 125; j++);
}
}
?
// 數(shù)字溫度計(jì)初始化函數(shù)
void Init() {
TMOD |= 0x01; // 定時(shí)器0工作在模式1
TH0 = 0xfc; // 定時(shí)器0初始值
TL0 = 0x67;
ET0 = 1; // 允許定時(shí)器0中斷
TR0 = 1