基于51单片机的超声波智能热水器设计

描述

 

 

功能

本设计采用51单片机+DS18B20温度传感器+数码管显示+继电器+功能按键组成。DS18B20温度传感器检测水温并将水温信息转换成电信号传送给单片机,单片机将得到的数据进行处理、显示与控制。上电后数码管显示当前的水温温度,通过按键可设置水温值,当检测到的水温低于设置的水温值时,继电器吸合接通外部加热装置,使水温达到设定水温值。当水温值超过设定水温值时,继电器断开,停止加热。温度检测精确到0.1度。并具有掉电保存功能,数据保存在单片机内部EEPOM中,按键还具有连加、减功能。

原理图

 

继电器

 

PCB图

 

继电器

 

程序源码

 

#include            //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义  变量范围0~255
#define uint  unsigned int   //无符号整型 宏定义  变量范围0~65535
#include 


sbit dq   = P1^5;  //18b20 IO口的定义
sbit beep = P1^4;   //蜂鸣器IO口定义


uint temperature ;  //
bit flag_300ms ;


bit flag_lj_en;     //按键连加使能
bit flag_lj_3_en;   //按键连3次连加后使能  加的数就越大了 
uchar key_time,key_value;      //用做连加的中间变量
bit key_500ms  ;


sbit relay1 = P1^6;  //加热继电器IO口定义
sbit relay2 = P1^3;  //加水继电器IO口定义


uchar code table_num[]="0123456789abcdefg";


sbit rs=P1^0;   //寄存器选择信号 H:数据寄存器    L:指令寄存器
sbit rw=P1^1;   //寄存器选择信号 H:数据寄存器    L:指令寄存器
sbit e =P1^2;   //片选信号   下降沿触发






/****************主函数***************/
void main()
{  
  beep = 0;                    //开机叫一声   
  delay_1ms(150);
  P0 = P1 = P2 = P3 = 0xff;
  init_1602();                    //1602初始化
  time_init();                    //初始化定时器 
  while(1)
  {
    if(flag_300ms == 1)          //300ms 处理一次温度程序
    {  
      flag_300ms = 0;  
      temperature = read_temp();  //先读出温度的值
      shuiwei_dis() ;   //水位显示
      send_wave();  //测距离函数
      clock_h_l();            //报警函数
      write_sfm3_18B20(1,8,temperature);
      dingshi_dis();  //定时控制
      if(distance > 10 + sw_jz)  //说明水位出错
      {
        beep = 1;
        write_string(2,8,"--.-m");      
      }else 
      {
        if(sw_jz >= distance)
        {
          shuiwei = sw_jz - distance;    //计算出液位
        }else 
          shuiwei = 0;  
        write_sfm3(2,8,shuiwei);          
      }  
    }
    key();          //按键程序
     key_with();          //设置报警温度  
   }
}


/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{  
  static uchar value;
  TH0 = 0x3c;
  TL0 = 0xb0;     // 50ms
  value ++;   
  if(value % 6 == 0)
  {
    flag_300ms = 1;     //300ms
    value = 0;
  }
  if(flag_lj_en == 1)     //按下按键使能
  {
    key_time ++;
    if(key_time >= 10) //500ms
    {
      key_time = 0;
      key_500ms = 1; //500ms
      key_value ++;
      if(key_value > 3)
      {
        key_value = 10;
        flag_lj_3_en = 1; //3次后1.5秒连加大些
      }            
    }
  }
}

 

元器件清单

 

继电器

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分