最近因需要買(mǎi)了一個(gè)電熱水瓶,使用中發(fā)現(xiàn),水溫根本上沒(méi)有達(dá)到沸騰,里面溫控器就跳開(kāi)了,而且水溫稍一下降,溫控器又很快閉合,再次進(jìn)入煮水狀態(tài),這樣水不斷處于冷卻-加熱-冷卻狀態(tài),這樣不但浪費(fèi)電,長(zhǎng)期飲用此水,對(duì)身體也是有害的。剛好最近在學(xué)單片機(jī)編程,于是打算自己寫(xiě)個(gè)程序,用單片機(jī)來(lái)控制水溫,可以達(dá)到十分精確的沸騰溫度。說(shuō)干就干,馬上拆開(kāi)電熱水瓶,發(fā)現(xiàn)里面電路極其簡(jiǎn)單,只是用個(gè)KSD301溫控器來(lái)控制水溫,仔細(xì)觀察發(fā)現(xiàn)電源還直接加到另一組加熱絲,測(cè)量其阻值有600歐左右,粗略計(jì)算達(dá)到80W,也就是說(shuō),在溫控器跳開(kāi)后,此加熱絲仍耗電80W來(lái)保持水溫,這樣是很浪費(fèi)電的。于是把原電路拆掉,接通電源到主加熱絲,加入1/3水,直接通電加熱到水沸騰,用溫度計(jì)測(cè)量底部原溫控器感溫點(diǎn),溫度有96度,一直沸騰下去,還是96度,也就是說(shuō),只要水沸騰,此處溫度就是96度了。于是,根據(jù)此數(shù)據(jù)寫(xiě)了一個(gè)溫控程序,設(shè)定下限溫度50度,上限溫度96度,并且具備提示功能,就是水要是沸騰了,熱水瓶會(huì)”滴“一聲提醒我們水已經(jīng)煮好,這個(gè)就是單片機(jī)的優(yōu)勢(shì),可以實(shí)現(xiàn)智能控制!上面我還采用三個(gè)數(shù)碼管直接顯示水溫,在水溫達(dá)到設(shè)定時(shí),繼電器跳開(kāi),常閉觸點(diǎn)接通副加熱器進(jìn)行恒溫加熱,不過(guò)這次不是連續(xù)通電,而是加熱3秒,停止1秒,并且是半波交流電,這樣耗電是很低的,又可以進(jìn)行保溫,同時(shí)使熱水瓶耗電降到最低,真正環(huán)保啊!好了,下面附上C程序,監(jiān)于時(shí)間關(guān)系,我就先不傳上電路圖了,其實(shí)電路倒是 簡(jiǎn)單,不會(huì)很復(fù)雜!單片機(jī)采用AT89C2051,水溫傳感用DS18B20,用DS18B20成本稍高,但程序容易設(shè)計(jì),而且也比較準(zhǔn)確!
#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; } }