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