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