找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9936|回复: 12
收起左侧

ds18b20温度报警器单片机源代码

  [复制链接]
ID:188744 发表于 2017-4-12 10:55 | 显示全部楼层 |阅读模式
ds18b20  温度液晶显示
0.png

单片机源代码:
  1. //------------------------------------------------------
  2. //用数码管与DS18B20设计温度报警器
  3. //------------------------------------------------------
  4. //本例将报警温度设为高:40度 低:-3度,当DS18B20感知到温度达到此临界值时
  5. //系统发出报警声
  6. #include <REG52.H>
  7. #include <intrins.h>
  8. #include "delay.h"
  9. #include "DS18B20.h"

  10. uchar display_digit[4]={0,0,0,0};                  //待显示的各温度数位
  11. uchar LCD_display[16]="                ";                  //LCD显示的温度值
  12. uchar LCD_alarm_display[16]="H:      L:      ";          //显示报警温度
  13. bit HI_Alarm=0,LO_Alarm=0;                 //高低温报警标志
  14. bit DS18B20_IS_OK;                        //传感器正常标志

  15. //温度小数位对照表
  16. uchar code df_table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
  17. //报警温度上下限,为进行正负数比较,此处注意设为char类型
  18. //取值范围为-128~+127,DS18B20支持范围为-50~+125
  19. char Alarm_temp_HL[4]={30,-3,0,0};//报警温度预设及存储

  20. uchar currentT=0;                                                  //当前读取的温度整数部分
  21. uchar temp_value[]={0x00,0x00};                          //从DS18B20读取的温度值
  22. //初始化DS18B20
  23. uchar init_DS18B20()
  24. {
  25.         uchar status;
  26.         DQ=1; delay(8);
  27.         DQ=0; delay(90);
  28.         DQ=1; delay(8);
  29.         status=DQ;
  30.         delay(100);
  31.         DQ=1;
  32.         return status;          //初始化成功时返回0
  33. }

  34. //读一字节
  35. uchar readonebyte()
  36. {
  37.         uchar i,dat=0;
  38.         DQ=1; _nop_();
  39.         for(i=0;i<8;i++)
  40.         {
  41.            DQ=0;dat>>=1;
  42.            DQ=1;_nop_();_nop_();//拉高,延时进行采样 单总线是进行与的
  43.            if(DQ) dat|=0x80;  //如果DQ是1,把1存到dat里
  44.            delay(30);DQ=1;
  45.         }
  46.         return dat;
  47. }

  48. //写一字节
  49. void writeonebyte(uchar dat)
  50. {
  51.         uchar i;
  52.         for(i=0;i<8;i++)
  53.         {
  54.                 DQ=0;DQ=dat&0x01; //先取最低位,先读的也是最低位
  55.                 delay(5);DQ=1;dat>>=1;
  56.         }
  57. }

  58. //读取温度值
  59. void read_temp()
  60. {
  61.         if(init_DS18B20()==1)        //DS18B20故障
  62.                 DS18B20_IS_OK=0;
  63.         else
  64.         {
  65.                 writeonebyte(0xcc);          //跳过序列号
  66.                 writeonebyte(0x44);          //启动温度转换
  67.                 init_DS18B20();
  68.                 writeonebyte(0xcc);          //跳过序列号
  69.                 writeonebyte(0xbe);          //读取温度寄存器
  70.                 temp_value[0]=readonebyte(); //        温度低8位
  71.                 temp_value[1]=readonebyte(); //        温度高8位
  72.                 Alarm_temp_HL[2]=readonebyte(); //报警温度TH
  73.                 Alarm_temp_HL[3]=readonebyte(); //报警温度TL
  74.                 DS18B20_IS_OK=1;
  75.         }       
  76. }

  77. //设置DS18B20温度报警值
  78. void set_Alarm_temp()
  79. {
  80.         init_DS18B20();
  81.         writeonebyte(0xcc);          //跳过序列号
  82.         writeonebyte(0x4e);          //将设定的温度报警值写入DS18B20
  83.         writeonebyte(Alarm_temp_HL[0]);  //写TH
  84.     writeonebyte(Alarm_temp_HL[1]);  //写TL
  85.     writeonebyte(0x7f);                                //12位精度
  86.         init_DS18B20();
  87.         writeonebyte(0xcc);          //跳过序列号
  88.         writeonebyte(0x48);          //温度报警值存入DS18B20
  89. }

  90. //在液晶上显示温度处理
  91. void chuli_temp()
  92. {
  93. //------------------显示温度处理-------------------------
  94.         uchar ng=0;           //负数标识
  95.         uchar t=150;                 //延时值
  96.         char signed_current_temp;                //注意类型为char
  97.         //如果为负数则取反加1,并设置负号标识及负号显示位置
  98.         if((temp_value[1]&0xf8)==0xf8)
  99.         {
  100.                 temp_value[1]=~temp_value[1];
  101.                 temp_value[0]=~temp_value[0]+1;
  102.                 if(temp_value[0]==0x00) temp_value[1]++;
  103.                 ng=1;
  104.        
  105.         }
  106.   //查表得到温度小数部分
  107.   display_digit[0]=df_table[temp_value[0]&0x0f];
  108.   //获取温度整数部分(无符号)
  109.   currentT=((temp_value[0]&0xf0)>>4)|((temp_value[1]&0x07)<<4);
  110.   //有符号的当前温度值,注意定义为char,其值可为-128~+127
  111.   signed_current_temp=ng?-currentT:currentT;
  112.   //高低温报警标志设置(与定义为char类型的Alarm_temp_HL比较,这样可区分正负比较)
  113.   HI_Alarm=signed_current_temp>=Alarm_temp_HL[2]? 1 : 0;
  114.   LO_Alarm=signed_current_temp<=Alarm_temp_HL[3]? 1 : 0;
  115.   //将整数部分分解为三位待显示数字
  116.   display_digit[3]=currentT/100;
  117.   display_digit[2]=currentT%100/10;
  118.   display_digit[1]=currentT%10;
  119.   //LCD显示数据
  120.   LCD_display[2]=display_digit[3]+'0';          //bai
  121.   LCD_display[3]=display_digit[2]+'0';          //shi
  122.   LCD_display[4]=display_digit[1]+'0';          //ge
  123.   LCD_display[5]='.';
  124.   LCD_display[6]=display_digit[0]+'0';          //xiaoshu
  125.   LCD_display[7]=0xdf;                                 //。
  126.   LCD_display[8]=0x43;                                 // C

  127.   if(display_digit[3]==0)                          
  128.           {
  129.                     LCD_display[2]=' ';                        //高位为0则不显示               
  130.                   if(display_digit[2]==0)
  131.                   {
  132.                           LCD_display[3]=' ';
  133.                   }
  134.           }
  135.         //负号显示在恰当位置
  136.         if(ng)
  137.                   {
  138.                           if(LCD_display[3]==' ')
  139.                                 LCD_display[3]='-';
  140.                         else if(LCD_display[2]==' ')
  141.                                 LCD_display[2]='-';
  142.                         else LCD_display[1]='-';
  143.                   }
  144. //------------------------------------------------------

  145. }

  146. void chuli_alarm_temp()
  147. {
  148. //---------------------报警温度处理---------------------
  149.    uchar ng;
  150.    //由于Alarm_temp_HL类型为char 故可以直接进行正负比较
  151.    //高温报警值
  152.    ng=0;
  153.    if(Alarm_temp_HL[2]<0)
  154.    {
  155.               Alarm_temp_HL[2]=~Alarm_temp_HL[2]+1;
  156.            ng=1;
  157.    }
  158.    //分解高温各数位到待显示数组中
  159.    LCD_alarm_display[3]=Alarm_temp_HL[2]/100+'0';
  160.    LCD_alarm_display[4]=Alarm_temp_HL[2]%100/10+'0';
  161.    LCD_alarm_display[5]=Alarm_temp_HL[2]%10+'0';
  162.    //屏蔽高位不为0的
  163.    if(LCD_alarm_display[3]=='0') LCD_alarm_display[3]=' ';
  164.    if(LCD_alarm_display[3]==' ' && LCD_alarm_display[4]=='0')
  165.        LCD_alarm_display[4]=' ';
  166.         //'-' 显示
  167.    if(ng)
  168.    {
  169.                    if(LCD_alarm_display[4]==' ') LCD_alarm_display[4]='-';
  170.                 else
  171.                 if(LCD_alarm_display[3]==' ') LCD_alarm_display[3]='-';
  172.                 else LCD_alarm_display[2]='-';
  173.    }
  174.    //低温报警值
  175.    
  176.    

  177. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

完整代码下载:
ds18b20液晶显示.zip (63.44 KB, 下载次数: 175)

评分

参与人数 1黑币 +3 收起 理由
XINB + 3 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:280132 发表于 2018-5-10 20:19 | 显示全部楼层
好帖,顶一个
回复

使用道具 举报

ID:359622 发表于 2018-6-27 15:29 | 显示全部楼层
好帖,顶一个
回复

使用道具 举报

ID:609429 发表于 2019-9-9 11:46 | 显示全部楼层
谢谢,找这个来参考一下
回复

使用道具 举报

ID:606251 发表于 2019-9-9 12:39 | 显示全部楼层
非常感谢!
回复

使用道具 举报

ID:491435 发表于 2019-9-10 11:25 | 显示全部楼层
很好很强大
回复

使用道具 举报

ID:609917 发表于 2019-9-10 11:37 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:617456 发表于 2019-9-28 09:28 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:734832 发表于 2020-4-26 13:38 | 显示全部楼层
绝世好帖,谢谢,解决了我很多疑惑的地方
回复

使用道具 举报

ID:786925 发表于 2020-6-22 17:50 | 显示全部楼层
绝世好贴!点赞+1
回复

使用道具 举报

ID:340765 发表于 2021-3-16 15:26 | 显示全部楼层
谢谢,找这个来参考一下
回复

使用道具 举报

ID:28992 发表于 2021-3-17 04:44 | 显示全部楼层
great job, thank you so much.
回复

使用道具 举报

ID:1070572 发表于 2023-4-8 22:20 | 显示全部楼层
需要源代码下载学习!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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