找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4741|回复: 0
收起左侧

基于51单片机DS18B20温度报警器代码

[复制链接]
ID:302883 发表于 2021-1-18 10:49 | 显示全部楼层 |阅读模式
这个是我学习单片机制作的,代码硬件参考多位作者,修修改改而成。代码如有侵犯,请联系本人,立即删除。本作品仅供参考,学习。不喜勿喷,退出即可。

主要功能:

1.        基本工作量:电源部分、单片机最小系统、编程电路、温度采集;
2.        显示部分(显示温度值,保留一位小数)
3.        串口通信(向上位机发送温度值)
4.        继电器控制(超过一定温度值,继电器闭合或者断开)
5.        蜂鸣器报警(超过一定温度值,继电器闭合或者断开)

单片机源程序如下:
  1. #include <reg52.h>

  2. #include "alarm.h"

  3. void main()
  4. {
  5.         do
  6.   {
  7.                 temp=Temper();
  8.   }
  9.   while(temp==850);                  //因为DS18B20上电之后会读出来850,但不是温度值,所以等待读出温度值   
  10.         delay(1000);
  11.         H=byte_read(0x2000);
  12.         L=byte_read(0x2200);
  13.         if((H>99)||(L>99)||(L>=H))     //读EEROM里面的数据
  14.   {
  15.                 H=35;
  16.                 L=16;                      //如果数据不对,赋予初始值
  17.   }  
  18.         TMOD=0x20|0x01;
  19.         TH0=(65536-10000)/256;
  20.         TL0=(65536-10000)%256;
  21.         EA=1;
  22.         ET0=1;
  23.   TR0=1;                         //设置定时器与中断
  24.         SerialInit();
  25.   while(1)   
  26.         {  
  27.           key();
  28.           alarm();
  29.                 Send_data();
  30.         }
  31. }
复制代码
  1. #include "alarm.h"
  2. uchar datas[4]={0,0,0,0};
  3. uchar ms;                 //定时器0计数
  4. char H,L;          //用于设置上下限度  上下限度与要比较的数据类型最好相同
  5. uchar flag;        //状态
  6. int temp;        //存储读出来的温度,与H,L上下限度数据类型相同
  7. uchar rtemp,sflag;

  8. void delay(uint T)
  9. {
  10.   while(T--);
  11. }

  12. void display()
  13. {           
  14.   if(flag==0&&temp>=0)          //温度为正数时执行
  15.         {
  16.                 if(temp>999) Nixietube(ss[temp/1000%10],ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
  17.                 if(temp>99)  Nixietube(0xff,ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
  18.                 if(temp<99&&temp/100%10<=0)  Nixietube(0xff,0xff,ss1[temp/10%10],ss[temp%10]);
  19.   }
  20.   if(flag==0&&temp<0)          //温度为负数时
  21.         {
  22.                 if(temp*-1/100%10<=0) Nixietube(0xff,ss1[12],ss1[temp*-1/10%10],ss[temp*-1%10]);
  23.                 if(temp*-1/100%10>0)  Nixietube(ss1[12],ss[temp*-1/100%10],ss1[temp*-1/10%10],ss[temp*-1%10]);
  24.         }
  25.   if(flag==1)                 //flag==0显示温度  =1 显示上限   =2 显示下限
  26.         {
  27.                 if(H>99)          Nixietube(ss1[11],ss[H/100],ss[H%100/10],ss[H%10]);   //温度范围是125~-55 ,当上限值大于99时执行  
  28.                 if(H>=10&&H<=99)  Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]);            //当上限值大于12小于99时执行  不显示最高位
  29.                 if(H<10&&H>=0)    Nixietube(ss1[11],0xff,0xff,ss[H%10]);                //不显示百位 十位
  30.                 if(H<0&&H>=-9)    Nixietube(ss1[11],0xff,ss1[12],ss[H*-1%10]);          //设置的为负数且介于0~-9之间时执行  不显示十位
  31.     if(H<0&&H<-9)     Nixietube(ss1[11],ss1[12],ss[H*-1%100/10],ss[H*-1%10]);         //最低可以到55                   
  32.   }               
  33.         if(flag==2)            //同上                                                
  34.         {
  35.                 if(L>99)          Nixietube(ss1[10],ss[L/100],ss[L%100/10],ss[L%10]);
  36.                 if(L>=10&&L<=99)  Nixietube(ss1[10],0xff,ss[L/10],ss[L%10]);
  37.                 if(L<10&&L>=0)    Nixietube(ss1[10],0xff,0xff,ss[L%10]);
  38.                 if(L<0&&L>=-9)  Nixietube(ss1[10],0xff,ss1[12],ss[L*-1%10]);
  39.     if(L<0&&L<-9)  Nixietube(ss1[10],ss1[12],ss[L*-1%100/10],ss[L*-1%10]);                          
  40.   }
  41. }

  42. void key()                              //按键处理
  43. {
  44.        
  45. if(!key1)                               //设置上限
  46. {
  47.    delay(500);
  48.    if(!key1)
  49.         {
  50.       while(!key1);
  51.           if(flag==1)
  52.                   {
  53.          if(H<125)H++;
  54.                  SectorErase(0x2000);          //每修改一次上下限数据就写进EEROM
  55.                  byte_write(0x2000,H);
  56.         }
  57.           else if        (flag==2)
  58.                 {
  59.           if(L<H-1) L++;                //原则是下限不超过上限
  60.                   SectorErase(0x2200);
  61.                   byte_write(0x2200,L);
  62.         }       
  63.     }       
  64. }

  65. if(!key2)                            //设置下限
  66. {
  67.    delay(500);
  68.          if(!key2)
  69.          {
  70.       while(!key2);
  71.             if(flag==1)
  72.                   {
  73.                   if(H>L+1)  H--;             //原则上限不低于下限
  74.                   SectorErase(0x2000);        //每修改一次上下限数据就写进EEROM
  75.                   byte_write(0x2000,H);
  76.         }
  77.                         else if        (flag==2)
  78.                         {
  79.                                 if(L>-55)L--;
  80.                                 SectorErase(0x2200);
  81.                                 byte_write(0x2200,L);
  82.                         }       
  83.    }
  84. }
  85. if(!key3)                         //设置上限下限切换按键
  86.         {
  87.          delay(1000);
  88.          if(!key3)
  89.        {
  90.                 while(!key3);
  91.         flag=(flag+1)%3;                       
  92.        }
  93.   }
  94. }
  95. void alarm()                          //报警
  96. {
  97.         if(temp/10>=H||temp/10<=L)         //超过上下限蜂鸣器报警 ,正常的LED灯关闭
  98.   {
  99.                 beep_1=0;
  100.   }
  101.         else
  102.         {
  103.           beep_1=1;
  104.   }                               //正常情况下,蜂鸣器关闭  
  105.         if(temp/10>=H)                    //上限,当测得的值,大于等于设定值得时候,
  106.         {
  107.           led_0=0;        
  108.         }
  109.         else
  110.   {
  111.     led_0=1;
  112.   }
  113.                
  114.         if(temp/10<=L)                        //下限 当实际值小于等于下限值时
  115.   {
  116.                 led_2=0;     
  117.   }
  118.         else
  119.   {
  120.                 led_2=1;
  121.   }       
  122. }
  123. //*************************************************
  124. void TIMER_1() interrupt 1
  125. {
  126.         TH0=(65536-10000)/256;
  127.         TL0=(65536-10000)%256;             //一次定时10MS   十进制65536-50000=15536   折合十六进制3cb0  高位3c低位b0   
  128.         ms++;
  129.         display();                                                    // 完全消影可以开启这个,屏蔽主函数大循环里的显示函数
  130.   if(ms>100)                            //数据一秒刷新一次
  131.         {
  132.           ms=0;
  133.           temp=Temper();                   //读温度
  134.         }         
  135.   if(ms%5==0)                  
  136.         {
  137.                 if(beep_1==0)                      //蜂鸣器设置
  138.           {
  139.                         beep=!beep;
  140.           }
  141.           else
  142.     {
  143.                         beep=1;
  144.           }
  145.   }  
  146.         if(ms%7==0)                  
  147.         {
  148.                 if(beep_1==0)                      //蜂鸣器设置
  149.           {
  150.                         relay=!relay;
  151.           }
  152.           else
  153.     {
  154.                         relay = 1;
  155.           }
  156.   }
  157. }

  158. void SerialInit()
  159. {
  160.         TMOD=0x20|0x01;  //工作模式2
  161.         TH1=0xfd;
  162.         TL1=0xfd;
  163.         TR1=1;      //启动定时器1
  164.         SM0=0;
  165.         SM1=1;
  166.         REN=1;      //允许接收
  167.         PCON=0x00;  //关闭倍频
  168.         ES=1;       //开串口中断
  169.         EA=1;       //开总中断
  170. }

  171. void SerialService() interrupt 4
  172. {

  173.         if(RI==1)
  174.         {
  175.                 RI = 0;       
  176.                 sflag = 1;
  177.         }
  178. }
  179. void Send_data()
  180. {
  181.         datas[0] = temp%10000/1000;
  182.         datas[1] = temp%1000/100;
  183.         datas[2] = temp%100/10;
  184.         datas[3] = temp%10;

  185.         if(sflag==1)
  186.         {
  187.                 ES = 0; //发送期间关闭串口中断
  188.                 sflag = 0;
  189.                 if(temp<0)
  190.                 {
  191.                         SBUF = '-';
  192.                         while(!TI);
  193.                   TI = 0;       
  194.                 }
  195.                 else
  196.                 {
  197.                         SBUF = '+';
  198.                         while(!TI);
  199.                         TI = 0;       
  200.                 }

  201.                 SBUF = '0'+datas[0];
  202.                 while(!TI);
  203.                 TI = 0;
  204.                 SBUF = '0'+datas[1];
  205.                 while(!TI);
  206.                 TI = 0;               
  207.                 SBUF = '0'+datas[2];
  208.                 while(!TI);
  209.                 TI = 0;               
  210.                 SBUF = '.';
  211.                 while(!TI);
  212.                 TI = 0;
  213.                 SBUF = '0'+datas[3];
  214.                 while(!TI);
  215.                 TI = 0;       
  216.                 ES = 1;
  217.         }
  218. }
复制代码

所有资料51hei提供下载:
DS18B20.rar (70.83 KB, 下载次数: 50)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表