本文是關(guān)于DS18B20溫度傳感器的一個(gè)擴(kuò)展實(shí)驗(yàn)。
本擴(kuò)展實(shí)驗(yàn)實(shí)現(xiàn)的功能:利用DS18B20設(shè)計(jì)一個(gè)智能溫度控制系統(tǒng),具有溫度上下限值設(shè)定。當(dāng)溫度高于上限值時(shí),電機(jī)開(kāi)啟,同時(shí)蜂鳴器報(bào)警;當(dāng)溫度低于下限值時(shí)繼電器工作加熱,同時(shí)蜂鳴器報(bào)警,當(dāng)溫度處于上下限間正常工作。
首先系統(tǒng)運(yùn)行后,可以通過(guò)按鍵設(shè)置溫度上下限,當(dāng)按下開(kāi)始運(yùn)行按鍵后溫控系統(tǒng)開(kāi)始工作。默認(rèn)溫度上下限為23~25°C。溫控系統(tǒng)開(kāi)始運(yùn)行后會(huì)在數(shù)碼管中顯示當(dāng)前溫度。
使用到的硬件資源有:
- 獨(dú)立按鍵;
- 蜂鳴器+ULN2003;
- 直流電機(jī);
- 繼電器;
- 共陰極數(shù)碼管+74HC128+74HC245;
- DS18B20溫度傳感器;
一、相關(guān)元件介紹
當(dāng)按鍵按下時(shí),按鍵兩端管腳電平一致,按鍵處理時(shí)需要延時(shí)消抖+二次確認(rèn)。
要驅(qū)動(dòng)蜂鳴器發(fā)聲,分為有源蜂鳴器和無(wú)源蜂鳴器。對(duì)于有源蜂鳴器控制其中一端管腳為高電平或低電平即可發(fā)聲;對(duì)于無(wú)源蜂鳴器,需要一定頻率的脈沖才可發(fā)聲。驅(qū)動(dòng)蜂鳴器需要比較大的電流,使用ULN2003芯片實(shí)現(xiàn)放大電流的功能。本實(shí)驗(yàn)使用有源蜂鳴器。
要驅(qū)動(dòng)直流電機(jī)轉(zhuǎn)動(dòng),在其一端管腳輸入高電平,另一端管腳輸入低電平,使直流電機(jī)有電流通過(guò)即可轉(zhuǎn)動(dòng),高低電平在不同位置,僅控制轉(zhuǎn)動(dòng)的方向。要驅(qū)動(dòng)直流電機(jī)也需要比較大的電流,使用ULN2003芯片實(shí)現(xiàn)放大電流的功能。
使用一個(gè)PNP三極管驅(qū)動(dòng)繼電器,添加一個(gè)二極管用于保護(hù)繼電器。
使用74HC138芯片控制數(shù)碼管的位選,74HC245控制數(shù)碼管的段選。
DS1302溫度傳感器是單總線(xiàn)通信,不需要外圍元件。具有可編程的分辨率,內(nèi)含64位的ROM(64位的序列號(hào),識(shí)別當(dāng)前使用的芯片)、一個(gè)包含9字節(jié)的高速暫存器RAM和一個(gè)非易失性可電擦除EEPROM。
不考慮64位ROM序列號(hào),DS1302讀取溫度過(guò)程:初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送溫度轉(zhuǎn)換命令44H→延時(shí)→初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送讀RAM命令BEH→連續(xù)讀出數(shù)據(jù)。
設(shè)置溫度上下限過(guò)程:初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送48H命令將RAM2、3字節(jié)的內(nèi)容復(fù)制到EEPROM中→延時(shí)→初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送4EH命令將溫度限值寫(xiě)入RAM→發(fā)送連個(gè)字節(jié)的數(shù)據(jù)。
二、實(shí)驗(yàn)分析
本實(shí)驗(yàn)實(shí)現(xiàn)的是一個(gè)溫度控制系統(tǒng),當(dāng)溫度超過(guò)設(shè)定范圍時(shí)觸發(fā)一定操作。溫度超過(guò)上限時(shí),電機(jī)開(kāi)啟同時(shí)蜂鳴器報(bào)警;溫度低于下限時(shí),繼電器工作同時(shí)蜂鳴器報(bào)警;溫度處于上下限之間時(shí),系統(tǒng)正常工作。系統(tǒng)通過(guò)按鍵調(diào)節(jié)上限、下限和工作開(kāi)始或停止。
本系統(tǒng)的需求包括:
- 按鍵控制系統(tǒng)的開(kāi)始和停止;
- 按鍵調(diào)節(jié)上限和下限;
- 溫度超過(guò)范圍報(bào)警,溫度在范圍內(nèi)正常工作;
- 調(diào)節(jié)溫度上下限時(shí)對(duì)應(yīng)的上下限溫度會(huì)顯示在數(shù)碼管中;
- 系統(tǒng)工作時(shí)的溫度實(shí)時(shí)顯示在數(shù)碼管中;
三、proteus原理圖設(shè)計(jì)
proteus仿真原理圖如下。P3.0~P3.3口控制獨(dú)立按鍵K1 ~ K4,P3.0 ~ 03.3口為低電平時(shí)表示按鍵按下。K1向上調(diào)溫度上限,K2向下調(diào)溫度下限,按K3確定溫度的上下限,按K4 溫度控制系統(tǒng)開(kāi)始工作。P3.7口作為溫度傳感器DS18B20的輸入/輸出。
通過(guò)ULN2003芯片起到放大電流的作用,用來(lái)控制蜂鳴器、繼電器和直流電機(jī)。P1.0控制直流電機(jī),P1.0為高電平時(shí)直流電機(jī)工作,為低電平時(shí)直流電機(jī)不工作。P1.5控制蜂鳴器,P1.5為低電平是蜂鳴器不發(fā)聲,為高電平時(shí)蜂鳴器發(fā)聲。P1.1口控制繼電器,P1.1為低電平時(shí)繼電器工作,為高電平時(shí)繼電器不工作。

P0口通過(guò)74HC245控制數(shù)碼管的段選,P2.2~P2.4通過(guò)74HC138控制數(shù)碼管的位選。P0口為高電平時(shí),對(duì)應(yīng)數(shù)碼管的段亮。

四、軟件設(shè)計(jì)
按鍵函數(shù)處理如下:
void DataPros()
{
int temp=curTmp*100;
if(temp<0)
{
display[0]=0x40; // -
}
else
{
display[0]=0x00;
}
display[1]=smg[temp%10000/1000];
display[2]=smg[temp%1000/100]|0x80; // |0x80顯示小數(shù)點(diǎn)
display[3]=smg[temp%100/10];
display[4]=smg[temp%10/1];
display[5]=0x39;
}
// 按鍵處理函數(shù)
void KeyPros()
{
u8 i;
// K1上調(diào)溫度上限
if(0==K1)
{
delay1ms(10);
if(0 == K1)
{
tmpH=tmpH+1;
if(tmpH>125)
tmpH=125;
curTmp=tmpH;
DataPros();
}
while(!K1);
}
// K2下調(diào)溫度下限
if(0==K2)
{
delay1ms(10);
if(0 == K2)
{
tmpL=tmpL-1;
if(tmpL<-55)
tmpL=-55;
curTmp=tmpL;
DataPros();
}
while(!K2);
}
// 按K4,系統(tǒng)開(kāi)始運(yùn)行,讀取當(dāng)前溫度,判斷是否超過(guò)溫度范圍
if(0==K4)
{
delay1ms(10);
if(0==K4)
{
enRead=~enRead;
if(0==enRead)
{
for(i=0;i<8;i++)
{
display[i]=0;
}
}
}
while(!K4);
}
}
溫度處理函數(shù)如下:
// 溫度處理函數(shù)
void TempPros(int temp)
{
float tp;
if(temp<0)
{
display[0]=0x40; // -
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
display[0]=0x00;
tp=temp;
temp=tp*0.0625*100+0.5;
}
// 如果溫度超過(guò)上限,蜂鳴器發(fā)聲,電機(jī)轉(zhuǎn)動(dòng)
if((tp*0.0625)>tmpH)
{
BEEP=1;
MOTOR=1;
RELAY=1;
}
else if((tp*0.0625)<tmpL) // 如果溫度低于下限,蜂鳴器發(fā)聲,繼電器工作
{
BEEP=1;
MOTOR=0;
RELAY=0;
}
else
{
BEEP=0;
MOTOR=0;
RELAY=1;
}
display[1]=smg[temp%10000/1000];
display[2]=smg[temp%1000/100]|0x80; // |0x80顯示小數(shù)點(diǎn)
display[3]=smg[temp%100/10];
display[4]=smg[temp%10/1];
display[5]=0x39;
}
主函數(shù):
void main()
{
enRead=0;
BEEP=0;
MOTOR=0;
RELAY=1;
while(1)
{
if(0!=enRead)
TempPros(DS18B20ReadTemp()); // 系統(tǒng)運(yùn)行時(shí)默認(rèn)數(shù)碼管不顯示,當(dāng)按了K4時(shí)顯示實(shí)時(shí)溫度
KeyPros();
DigDisplay();
}
}
仿真結(jié)果:
