新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 自制高精度控制电热水瓶

自制高精度控制电热水瓶

作者:时间:2016-11-29来源:网络收藏
最近因需要买了一个电热水瓶,使用中发现,水温根本上没有达到沸腾,里面温控器就跳开了,而且水温稍一下降,温控器又很快闭合,再次进入煮水状态,这样水不断处于冷却-加热-冷却状态,这样不但浪费电,长期饮用此水,对身体也是有害的。刚好最近在学单片机编程,于是打算自己写个程序,用单片机来控制水温,可以达到十分精确的沸腾温度。说干就干,马上拆开电热水瓶,发现里面电路极其简单,只是用个KSD301温控器来控制水温,仔细观察发现电源还直接加到另一组加热丝,测量其阻值有600欧左右,粗略计算达到80W,也就是说,在温控器跳开后,此加热丝仍耗电80W来保持水温,这样是很浪费电的。于是把原电路拆掉,接通电源到主加热丝,加入1/3水,直接通电加热到水沸腾,用温度计测量底部原温控器感温点,温度有96度,一直沸腾下去,还是96度,也就是说,只要水沸腾,此处温度就是96度了。于是,根据此数据写了一个温控程序,设定下限温度50度,上限温度96度,并且具备提示功能,就是水要是沸腾了,热水瓶会”滴“一声提醒我们水已经煮好,这个就是单片机的优势,可以实现智能控制!上面我还采用三个数码管直接显示水温,在水温达到设定时,继电器跳开,常闭触点接通副加热器进行恒温加热,不过这次不是连续通电,而是加热3秒,停止1秒,并且是半波交流电,这样耗电是很低的,又可以进行保温,同时使热水瓶耗电降到最低,真正环保啊!好了,下面附上C程序,监于时间关系,我就先不传上电路图了,其实电路倒是 简单,不会很复杂!单片机采用AT89C2051,水温传感用DS18B20,用DS18B20成本稍高,但程序容易设计,而且也比较准确!
#include #include #define uchar unsigned char#define uint unsigned intsbit 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=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;}}


评论


技术专区

关闭