单片机
返回首页

自制高精度控制电热水瓶

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;
 }
}
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 光控音效发生器电路

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 优化电路板布局的简单方法

  • 如何使用LED驱动器LM3915制作振动计

  • 电谐波图形均衡器示意图

    相关电子头条文章