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