最近因需要买了一个电热水瓶,使用中发现,水温根本上没有达到沸腾,里面温控器就跳开了,而且水温稍一下降,温控器又很快闭合,再次进入煮水状态,这样水不断处于冷却-加热-冷却状态,这样不但浪费电,长期饮用此水,对身体也是有害的。刚好最近在学单片机编程,于是打算自己写个程序,用单片机来控制水温,可以达到十分精确的沸腾温度。说干就干,马上拆开电热水瓶,发现里面电路极其简单,只是用个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;
}
}
