基于51单片机的DS18B20数字温度报警器:可调上下限

51单片机数字温度报警器_DS18B20可调上下限

(仿真+程序+原理图)

原理图:Altium Designer

仿真版本:proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0009

目录标题

  • 51单片机数字温度报警器_DS18B20可调上下限
  • 主要功能
  • 操作说明
  • 仿真图
  • 原理图
  • 程序设计
  • 主函数
  • 外部中断函数
  • DS18B20驱动
  • 资料清单
  • 主要功能

    1、实时温度测量及显示,超出温度范围声光报警,上下限温度可通过按键设定等功能;

    2、温度测量范围0到99.9摄氏度,精度为0.1摄氏度;

    3、可设置上下限报警温度,默认上限报警温度为38℃、默认下限报警温度为5℃(通过程序可以更改上下限值);

    4、报警值可设置范围:最低上限报警值等于当前下限报警值,最高下限报警值等于当前上限报警值。将下限报警值调为0时为关闭下限报警功能。

    操作说明

    1、开机:打开电源,机器进入初始化状态,此时数码管显示 – – – -;片刻即开始显示当前温度。

    2、查看当前上下限温度范围:按下【S1】键(左边键),数码管闪烁显示Hxxx,H表示上限温度,再次按下【S1】键,数码管闪烁显示Lxxx, L表示下限温度。再按【S1】键时退出设置,数码管显示当前实时温度。

    3、重新设定上下限温度范围:按下【S1】键一次,数码管闪烁显示Hxxx时,此时是设定上限温度,按【S3】键加温度,【S2】键减温度。再按下【S1】键一次,此时是设定下限温度,数码管闪烁显示Lxxx时,按【S3】键加温度,【S2】键减温度。再按下【S1】键一次,设置成功并退出设置。

    4、报警:当检测到当前实时温度高于上限温度值,或者低于下限温度值,系统会自动发出报警,报警为红灯一直闪烁且蜂鸣器随着灯的频率响。除非重设上下限温度范围,否则报警一直持续。

    仿真图

    img

    原理图

    img

    程序设计

    img

    主函数

    void main(void)
    {
        uint z;
     InitTimer();    //初始化定时器
     EA=1;      //全局中断开关
     TR0=1;
     ET0=1;      //开启定时器0
     IT0=1;        
     IT1=1;
     check_wendu();
     check_wendu();
     for(z=0;z<300;z++)
     {
      Disp_init();        
      }
     while(1)
      {
      if(SET==0)
      {
       Delay(2000);
       do{}while(SET==0);
       set_st++;x=0;shanshuo_st=1;
       if(set_st>2)set_st=0;
      }
      if(set_st==0)
      {
       EX0=0;    //关闭外部中断0
       EX1=0;    //关闭外部中断1
        check_wendu();
          Disp_Temperature();
       Alarm();   //报警检测
      }
      else if(set_st==1)
      {
       BEEP=1;    //关闭蜂鸣器
       ALAM=1;
       EX0=1;    //开启外部中断0
       EX1=1;    //开启外部中断1
       if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
       if(shanshuo_st) {Disp_alarm(shangxian);}
      }
      else if(set_st==2)
      {
       BEEP=1;    //关闭蜂鸣器
       ALAM=1;
       EX0=1;    //开启外部中断0
       EX1=1;    //开启外部中断1
       if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
       if(shanshuo_st) {Disp_alarm(xiaxian);}
      }
        }
    }
    

    外部中断函数

    /*****外部中断0服务程序*****/
    void int0(void) interrupt 0
    {
     
     EX0=0;      //关外部中断0
     if(DEC==0&&set_st==1)
     {
      	do{
    		Disp_alarm(shangxian);
    	}
     	while(DEC==0);
      	shangxian--;
      	if(shangxian<xiaxian)shangxian=xiaxian;
     }
     else if(DEC==0&&set_st==2)
     {
      	do{
    		Disp_alarm(xiaxian);
    	}
     	while(DEC==0);
     	xiaxian--;
      	if(xiaxian<0)xiaxian=0;
     }
    }
    /*****外部中断1服务程序*****/
    void int1(void) interrupt 2
    {
     EX1=0;      //关外部中断1
     if(ADD==0&&set_st==1)
     {
     	do{
    		Disp_alarm(shangxian);
    	}
     	while(ADD==0);
      	shangxian++;
      	if(shangxian>99)shangxian=99;
     }
     else if(ADD==0&&set_st==2)
     {
      	do{
    		Disp_alarm(xiaxian);
    	}
     	while(ADD==0);
      	xiaxian++;
      	if(xiaxian>shangxian)xiaxian=shangxian;
     }  
    }
    

    DS18B20驱动

    程序流程图

    image-20220903000421492

    unsigned int ReadTemperature(void)
    {
      unsigned char a=0;
      unsigned char b=0;
      unsigned int t=0;
      float tt=0;
      Init_DS18B20();
      WriteOneChar(0xCC);  //跳过读序号列号的操作
      WriteOneChar(0x44);  //启动温度转换
      Init_DS18B20();
      WriteOneChar(0xCC);  //跳过读序号列号的操作
      WriteOneChar(0xBE);  //读取温度寄存器
      a=ReadOneChar();     //读低8位
      b=ReadOneChar();    //读高8位
      t=b;				   //高8位转移到t
      t<<=8;			   //t数据左移8位
      t=t|a;			   //将t和a按位或,得到一个16位的数
      tt=t*0.0625;		   //将t乘以0.0625得到实际温度值(温度传感器设置12位精度,最小分辨率是0.0625)
      t= tt*10+0.5;     //放大10倍(将小数点后一位显示出来)输出并四舍五入
      return(t);		   //返回温度值
    }
    

    资料清单

    img

    资料下载链接

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于51单片机的DS18B20数字温度报警器:可调上下限

    发表评论