最近因需要買了一個電熱水瓶,使用中發現,水溫根本上沒有達到沸騰,里面溫控器就跳開了,而且水溫稍一下降,溫控器又很快閉合,再次進入煮水狀態,這樣水不斷處于冷卻-加熱-冷卻狀態,這樣不但浪費電,長期飲用此水,對身體也是有害的。剛好最近在學單片機編程,于是打算自己寫個程序,用單片機來控制水溫,可以達到十分精確的沸騰溫度。說干就干,馬上拆開電熱水瓶,發現里面電路極其簡單,只是用個KSD301溫控器來控制水溫,仔細觀察發現電源還直接加到另一組加熱絲,測量其阻值有600歐左右,粗略計算達到80W,也就是說,在溫控器跳開后,此加熱絲仍耗電80W來保持水溫,這樣是很浪費電的。于是把原電路拆掉,接通電源到主加熱絲,加入1/3水,直接通電加熱到水沸騰,用溫度計測量底部原溫控器感溫點,溫度有96度,一直沸騰下去,還是96度,也就是說,只要水沸騰,此處溫度就是96度了。于是,根據此數據寫了一個溫控程序,設定下限溫度50度,上限溫度96度,并且具備提示功能,就是水要是沸騰了,熱水瓶會”滴“一聲提醒我們水已經煮好,這個就是單片機的優勢,可以實現智能控制!上面我還采用三個數碼管直接顯示水溫,在水溫達到設定時,繼電器跳開,常閉觸點接通副加熱器進行恒溫加熱,不過這次不是連續通電,而是加熱3秒,停止1秒,并且是半波交流電,這樣耗電是很低的,又可以進行保溫,同時使熱水瓶耗電降到最低,真正環保!好了,下面附上C程序,監于時間關系,我就先不傳上電路圖了,其實電路倒是 簡單,不會很復雜!單片機采用AT89C2051,水溫傳感用DS18B20,用DS18B20成本稍高,但程序容易設計,而且也比較準確!
#include <reg2051.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit GW=P3^0;
sbit SW=P3^1;
sbit BW=P3^2;
sbit DQ=P3^3;
sbit JDQ=P3^4;
sbit BAW=P3^5;
sbit FMQ=P3^7;
bit K;
code uchar NUM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar temp_value;
uchar sec;
uchar TH=96,TL=50;
void delay(uchar a)
{
while(a--);
}
void INIT()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
}
void init_DS18B20()
{
uchar b=0;
DQ=1;
delay(8);
DQ=0;
delay(100);
DQ=1;
delay(14);
b=DQ;
delay(20);
}
uchar read()
{
uint i, dat=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_();
dat>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ)
dat|=0x80;
delay(12);
}
DQ=1;
return(dat);
}
void write(uchar dat)
{
uchar d=0;
for(d=8;d>0;d--)
{
DQ=1;
_nop_();_nop_();
DQ=0;
delay(1);
DQ=dat&0x01;
delay(12);
dat=dat/2;
}
DQ=1;
delay(2);
}
void ReadTemp()
{
uint a=0;
uint b=0;
init_DS18B20();
write(0xCC);
write(0x44);
delay(100);
init_DS18B20();
write(0xCC);
write(0xBE);
delay(100);
a=read();
b=read();
temp_value=((b<<8)|a)*0.0625;
}
void display (uchar num0,uchar num1,uchar num2)
{
P1=NUM[num0];
GW=0;
delay(200);
GW=1;
P1=NUM[num1];
SW=0;
delay(200);
SW=1;
P1=NUM[num2];
BW=0;
delay(200);
BW=1;
}
void wenkong()
{
if(temp_value<TL)
{
JDQ=1;
K=0;
}
if(temp_value>=TH)
{
JDQ=0;
}
}
main()
{
uchar a,b,c,t;
INIT();
K=0;
if(sec==0)
FMQ=0;
BZ: if(sec>=1)
FMQ=1;
if(temp_value>=TH&K==0)
{
sec=0;
FMQ=0;
if(sec==3)
FMQ=1;
K=!K;
}
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0x3c;
TL0=0xb0;
t++;
}
if(t==20)
{
t=0;
sec++;
BAW=0;
}
if(sec==4)
{
sec=0;
BAW=1;
}
ReadTemp();
a=temp_value%10;
b=temp_value/10%10;
c=temp_value/100%10;
display(a,b,c);
wenkong();
goto BZ;
}
}
