本文是關(guān)于DS18B20溫度傳感器的一個擴(kuò)展實(shí)驗(yàn)。
本擴(kuò)展實(shí)驗(yàn)實(shí)現(xiàn)的功能:利用DS18B20設(shè)計(jì)一個智能溫度控制系統(tǒng),具有溫度上下限值設(shè)定怜珍。當(dāng)溫度高于上限值時,電機(jī)開啟凤粗,同時蜂鳴器報(bào)警酥泛;當(dāng)溫度低于下限值時繼電器工作加熱今豆,同時蜂鳴器報(bào)警,當(dāng)溫度處于上下限間正常工作柔袁。
首先系統(tǒng)運(yùn)行后呆躲,可以通過按鍵設(shè)置溫度上下限,當(dāng)按下開始運(yùn)行按鍵后溫控系統(tǒng)開始工作捶索。默認(rèn)溫度上下限為23~25°C插掂。溫控系統(tǒng)開始運(yùn)行后會在數(shù)碼管中顯示當(dāng)前溫度。
使用到的硬件資源有:
- 獨(dú)立按鍵腥例;
- 蜂鳴器+ULN2003辅甥;
- 直流電機(jī);
- 繼電器燎竖;
- 共陰極數(shù)碼管+74HC128+74HC245璃弄;
- DS18B20溫度傳感器;
一构回、相關(guān)元件介紹
當(dāng)按鍵按下時夏块,按鍵兩端管腳電平一致,按鍵處理時需要延時消抖+二次確認(rèn)纤掸。
要驅(qū)動蜂鳴器發(fā)聲脐供,分為有源蜂鳴器和無源蜂鳴器。對于有源蜂鳴器控制其中一端管腳為高電平或低電平即可發(fā)聲茁肠;對于無源蜂鳴器患民,需要一定頻率的脈沖才可發(fā)聲。驅(qū)動蜂鳴器需要比較大的電流垦梆,使用ULN2003芯片實(shí)現(xiàn)放大電流的功能匹颤。本實(shí)驗(yàn)使用有源蜂鳴器。
要驅(qū)動直流電機(jī)轉(zhuǎn)動托猩,在其一端管腳輸入高電平印蓖,另一端管腳輸入低電平,使直流電機(jī)有電流通過即可轉(zhuǎn)動京腥,高低電平在不同位置赦肃,僅控制轉(zhuǎn)動的方向。要驅(qū)動直流電機(jī)也需要比較大的電流公浪,使用ULN2003芯片實(shí)現(xiàn)放大電流的功能他宛。
使用一個PNP三極管驅(qū)動繼電器,添加一個二極管用于保護(hù)繼電器欠气。
使用74HC138芯片控制數(shù)碼管的位選厅各,74HC245控制數(shù)碼管的段選。
DS1302溫度傳感器是單總線通信预柒,不需要外圍元件队塘。具有可編程的分辨率袁梗,內(nèi)含64位的ROM(64位的序列號,識別當(dāng)前使用的芯片)憔古、一個包含9字節(jié)的高速暫存器RAM和一個非易失性可電擦除EEPROM遮怜。
不考慮64位ROM序列號,DS1302讀取溫度過程:初始化→發(fā)送CCH命令跳過ROM→發(fā)送溫度轉(zhuǎn)換命令44H→延時→初始化→發(fā)送CCH命令跳過ROM→發(fā)送讀RAM命令BEH→連續(xù)讀出數(shù)據(jù)鸿市。
設(shè)置溫度上下限過程:初始化→發(fā)送CCH命令跳過ROM→發(fā)送48H命令將RAM2锯梁、3字節(jié)的內(nèi)容復(fù)制到EEPROM中→延時→初始化→發(fā)送CCH命令跳過ROM→發(fā)送4EH命令將溫度限值寫入RAM→發(fā)送連個字節(jié)的數(shù)據(jù)。
二焰情、實(shí)驗(yàn)分析
本實(shí)驗(yàn)實(shí)現(xiàn)的是一個溫度控制系統(tǒng)涝桅,當(dāng)溫度超過設(shè)定范圍時觸發(fā)一定操作。溫度超過上限時烙样,電機(jī)開啟同時蜂鳴器報(bào)警;溫度低于下限時蕊肥,繼電器工作同時蜂鳴器報(bào)警谒获;溫度處于上下限之間時,系統(tǒng)正常工作壁却。系統(tǒng)通過按鍵調(diào)節(jié)上限批狱、下限和工作開始或停止。
本系統(tǒng)的需求包括:
- 按鍵控制系統(tǒng)的開始和停止展东;
- 按鍵調(diào)節(jié)上限和下限赔硫;
- 溫度超過范圍報(bào)警,溫度在范圍內(nèi)正常工作盐肃;
- 調(diào)節(jié)溫度上下限時對應(yīng)的上下限溫度會顯示在數(shù)碼管中爪膊;
- 系統(tǒng)工作時的溫度實(shí)時顯示在數(shù)碼管中;
三砸王、proteus原理圖設(shè)計(jì)
proteus仿真原理圖如下推盛。P3.0~P3.3口控制獨(dú)立按鍵K1 ~ K4,P3.0 ~ 03.3口為低電平時表示按鍵按下谦铃。K1向上調(diào)溫度上限耘成,K2向下調(diào)溫度下限,按K3確定溫度的上下限驹闰,按K4 溫度控制系統(tǒng)開始工作瘪菌。P3.7口作為溫度傳感器DS18B20的輸入/輸出。
通過ULN2003芯片起到放大電流的作用嘹朗,用來控制蜂鳴器师妙、繼電器和直流電機(jī)。P1.0控制直流電機(jī)骡显,P1.0為高電平時直流電機(jī)工作疆栏,為低電平時直流電機(jī)不工作曾掂。P1.5控制蜂鳴器,P1.5為低電平是蜂鳴器不發(fā)聲壁顶,為高電平時蜂鳴器發(fā)聲珠洗。P1.1口控制繼電器,P1.1為低電平時繼電器工作若专,為高電平時繼電器不工作许蓖。
P0口通過74HC245控制數(shù)碼管的段選,P2.2~P2.4通過74HC138控制數(shù)碼管的位選调衰。P0口為高電平時膊爪,對應(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)開始運(yùn)行,讀取當(dāng)前溫度趋箩,判斷是否超過溫度范圍
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;
}
// 如果溫度超過上限赃额,蜂鳴器發(fā)聲,電機(jī)轉(zhuǎn)動
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)行時默認(rèn)數(shù)碼管不顯示,當(dāng)按了K4時顯示實(shí)時溫度
KeyPros();
DigDisplay();
}
}
仿真結(jié)果: