專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

自制高精度控制電熱水瓶

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2012年10月26日   【字體:

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

#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;
 }
}
關(guān)閉窗口

相關(guān)文章