一、項目介紹
當前文章介紹基于51單片機的熱敏電阻測溫系統的設計過程,用于實時監測環境溫度,并在溫度超過預設閾值時進行報警。由于采用的是熱敏電阻測溫技術,無需外置溫度傳感器,使得系統具有結構簡單、成本較低等優點。
主控芯片采用STC89C52,具有良好的穩定性和可靠性,適應于工業控制等領域的應用需要。ADC采集模塊采用PCF8591模塊,可方便地實現對熱敏電阻溫度數據的轉換和采集,提高了系統的準確度和實用性。
系統通過4位數碼管顯示出溫度值,同時通過按鍵設置溫度上限閥值,當溫度超過閥值時,會通過蜂鳴器報警,提醒用戶注意環境溫度的變化情況。
在項目中主要是用到了熱敏電阻和PCF8591模塊。
(1)熱敏電阻介紹
熱敏電阻(Thermistor)是一種基于材料的電阻元件,其電阻值隨溫度的變化而發生相應的變化。通常情況下,熱敏電阻的電阻值隨溫度升高而降低,反之則隨溫度降低而升高,這種特性被稱為負溫度系數(NTC)或正溫度系數(PTC)。
熱敏電阻的工作原理是基于材料的溫度敏感性質。在熱敏電阻中,存在許多導電粒子,當溫度升高時,導電粒子與材料中的離子激發程度增強,導致導電粒子的數量變多,因此電阻值降低;反之,當溫度降低時,導電粒子的數量變少,電阻值增加。
(2)PCF8591
PCF8591是一款4通道、8位模數轉換器(ADC)和1通道、8位數模轉換器(DAC)的集成電路芯片。可以通過I2C總線與微控制器進行通信,實現模擬信號的輸入和輸出。
PCF8591的輸入電壓范圍為0V~VCC(通常為5V),可以通過外部電阻進行放大或縮小。它還有一個內部參考電壓源,可以通過軟件控制選擇使用。
PCF8591的輸出電壓范圍也是0V~VCC,可以用于控制模擬信號的輸出,比如控制電機的轉速、LED的亮度等。
在熱敏電阻測溫系統中,使用PCF8591模塊來采集熱敏電阻的電壓信號,并將其轉換為數字信號,進而計算出溫度值。
二、設計思路
2.1 系統結構
系統采用單片機作為主控芯片,熱敏電阻用于測量環境溫度,PCF8591模塊采集熱敏電阻的溫度數據并將其轉換為正常溫度值,通過數碼管進行顯示。同時,系統設置上限閥值,當溫度超過該值時,系統會通過蜂鳴器報警。
2.2 硬件設計
(1)主控芯片
本系統采用STC89C52單片機作為主控芯片,具有強大的計算能力、穩定的性能和較低的功耗,支持多種外設接口,適合于工業控制等領域的應用需求。
(2)溫度傳感器
本系統采用熱敏電阻作為溫度傳感器,其結構簡單、價格便宜,且無需額外的電源供應,可直接通過PC8591模塊的輸入端口進行檢測。
(3)ADC采集模塊
系統采用PCF8591模塊進行ADC采集,具有4路模擬輸入通道和一個模擬輸出通道,采樣精度高達8位,能夠滿足本系統對溫度信號的準確采集需求。
(4)數碼管顯示模塊
系統采用4位共陽數碼管進行數據顯示,其顯示范圍為-999~+9999,可滿足本系統對溫度數據的實時顯示需求。
(5)蜂鳴器報警模塊
系統采用蜂鳴器進行報警提示,當溫度超過預設閾值時,蜂鳴器會發出持續聲響,提醒用戶注意環境溫度的變化情況。
(6)按鍵模塊
按鍵模塊,方便用戶進行閥值的設置和調整操作。
2.3 軟件設計
(1)溫度采集與轉換
系統使用ADC采集熱敏電阻的溫度信號,并將采集到的數字信號轉換成溫度值進行顯示。轉換公式為: T=(adc_value/255.0)*330,其中adc_value為AD轉換器輸出的數字值,330是熱敏電阻的參考電阻值。
(2)溫度上限閥值設置
系統通過按鍵實現溫度上限閥值的設置和調整操作,用戶可以根據自己的需求進行設定。
(3)報警功能設計
系統在采集到溫度超過預設閾值時,蜂鳴器會發出聲響進行提醒,并且LED指示燈會亮起。
2.4 總體流程
(1)初始化各個模塊,包括單片機、PCF8591、數碼管、蜂鳴器和按鍵等。
(2)采集熱敏電阻的溫度信號,并將數字信號轉換為溫度值。
(3)將溫度值通過數碼管進行顯示。
(4)檢測當前溫度是否超過預設閾值,若超過,則觸發報警并點亮LED指示燈。
(5)用戶可以通過按鍵設置溫度上限閥值,系統會保存設置的閾值并進行下一次溫度比較。
三、代碼實現
以下是基于51單片機設計的熱敏電阻測溫系統的實現代碼。
#include < reg52.h >
#include < intrins.h >
?
typedef unsigned char u8;
typedef unsigned int u16;
?
#define PCF8591_address_write 0x90
#define PCF8591_address_read 0x91
?
sbit SCLK = P1^0; //PCF8591模塊時鐘線
sbit DOUT = P1^1; //PCF8591模塊數據線
sbit DIN = P1^2; //PCF8591模塊數據線
sbit CS = P1^3; //PCF8591模塊片選線
?
sbit LATCH1 = P3^4; //鎖存器1
sbit LATCH2 = P3^5; //鎖存器2
?
sbit KEY1 = P2^0; //按鍵1
sbit KEY2 = P2^1; //按鍵2
?
sbit BUZZ = P2^3; //蜂鳴器
?
u16 ADC_value; //采集到的ADC值
float temperature; //計算得到的溫度值
?
u8 table[] = { //共陽數碼管段碼表
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xbf, //-
};
?
void delay(u16 i){
while(i--);
}
?
void delay_ms(u16 ms){
u16 i, j;
for(i=0; i< ms; i++){
for(j=0; j< 110; j++);
}
}
?
void write_PCF8591(u8 data){
u8 i;
DIN = 1;
SCLK = 0;
CS = 0;
for(i=0; i< 8; i++){
DOUT = (data & 0x80) > > 7;
data < <= 1;
SCLK = 1;
SCLK = 0;
}
CS = 1;
}
?
u16 read_ADC(){
u16 value;
CS = 0;
DIN = 1;
SCLK = 0;
DIN = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCLK = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
value = P1;
SCLK = 0;
value < <= 8;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCLK = 1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
value |= P1;
CS = 1;
return value;
}
?
void display(u8 addr, u8 dat){
LATCH1 = 0;
LATCH2 = 0;
P0 = addr;
LATCH1 = 1;
LATCH1 = 0;
P0 = table[dat];
LATCH2 = 1;
LATCH2 = 0;
}
?
void main(){
u8 set_value = 40; //溫度上限閥值
u8 temp;
write_PCF8591(0x40);
while(1){
ADC_value = read_ADC