单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 86|回复: 2
打印 上一主题 下一主题
收起左侧

小白想请问大佬一个关于DS18B20温度传感器的单片机程序问题

[复制链接]
跳转到指定楼层
楼主
gaoky 发表于 2020-2-15 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我已经用DS18B20测出了温度的值,想要这个温度低于自己设定的温度后,led灯就闪烁,但是测得的值是整数部分和小数部分,不知道怎么用if语句来写
void DS18B20_Read_Celsius_Drive()
{
        static xdata u16 count=0;//为了利用状态机进行复位
        float num;//定义一个浮点数的变量
        u8 xdata Value_High,Value_Low;//定义两个高低位的变量,用以保存
        count++;
        switch(count)
        {
                case 1: DS18B20_DQ=0;break;//count=1,第一步把DQ拉低
                case 35: DS18B20_DQ=1;break;//根据图显示,然后拉高
                case 60:
                             DS18B20_Write_Reg(0xcc);//开始写入指令
                         DS18B20_Write_Reg(0x44);//同上
                         break;        
                case 4000: DS18B20_DQ=0;break;
                case 4035: DS18B20_DQ=1;break;
                case 4060:
                               DS18B20_Write_Reg(0xcc);
                           DS18B20_Write_Reg(0xbe);//发送指令BE
                           Value_Low=DS18B20_Read_Data();//然后开始读取两次数据,步骤6
                           Value_High=DS18B20_Read_Data();
                           Value_High<<=4;//高字节左移四位,剩下一个蓝三个红
                           Value_High+=(Value_Low&0xf0)>>4;//先将低字节高四位取出来11110000,再右移四位,然后加上高字节的四位
                           DS18B20_Read_Buffer[0]=Value_High;//整数部分已经保存好了
                           num=(Value_Low&0x0f)*0.0625;
                           DS18B20_Read_Buffer[1]=(u8)(num*100);
                           break;
                          
               
                case 8000: count=0;break;
        }               
        
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
沙发
wulin 发表于 2020-2-15 21:21 | 只看该作者
修改了部分语句,未必符合楼主需求,就算提供一个思路。
  1. void DS18B20_Read_Celsius_Drive()
  2. {
  3.         static xdata u16 count=0;//为了利用状态机进行复位
  4. //        float num;//定义一个浮点数的变量
  5.         u16 temp;
  6.         u8 TempH,TempL;
  7.         bit negative;//负数标志
  8.         u8 xdata Value_High,Value_Low;//定义两个高低位的变量,用以保存
  9.         count++;
  10.         switch(count)
  11.         {
  12.                 case 1: DS18B20_DQ=0;break;//count=1,第一步把DQ拉低
  13.                 case 35: DS18B20_DQ=1;break;//根据图显示,然后拉高
  14.                 case 60:
  15.                         DS18B20_Write_Reg(0xcc);//开始写入指令
  16.                         DS18B20_Write_Reg(0x44);//同上
  17.                 break;        
  18.                 case 4000: DS18B20_DQ=0;break;
  19.                 case 4035: DS18B20_DQ=1;break;
  20.                 case 4060:
  21.                         DS18B20_Write_Reg(0xcc);
  22.                         DS18B20_Write_Reg(0xbe);//发送指令BE
  23.                         Value_Low=DS18B20_Read_Data();//然后开始读取两次数据,步骤6
  24.                         Value_High=DS18B20_Read_Data();
  25.                         temp=Value_High<<8|Value_Low;
  26.                         if(temp&0x8000)
  27.                         {
  28.                                 negative=1;                //负号标志
  29.                                 temp=~temp;                //取反加1
  30.                                 temp +=1;
  31.                         }
  32.                         else negative=0;        //正数

  33.                         TempH=temp>>4;                //分解出整数
  34.                         TempL=temp&0x0F;        //分解出小数
  35.                         TempL=TempL*6/10;        //保留一位小数

  36.                         if(negative==1)
  37.                                 DS18B20_Read_Buffer[0]=0x40;//显示负号
  38.                         else if(TempH/100==0)//小于100
  39.                                 DS18B20_Read_Buffer[0]=0;                                                //百位消隐
  40.                         else
  41.                                 DS18B20_Read_Buffer[0]=smgdu[TempH/100]; //显示百位温度
  42.        
  43.                         if((TempH/100==0)&&((TempH%100)/10==0))
  44.                                 DS18B20_Read_Buffer[1]=0;                                                //十位消隐
  45.                         else
  46.                                 DS18B20_Read_Buffer[1]=smgdu[(TempH%100)/10];        //显示十位温度
  47.                         DS18B20_Read_Buffer[2]=smgdu[(TempH%100)%10]|0x80;//显示个位温度,带小数点
  48.                         DS18B20_Read_Buffer[3]=smgdu[TempL];                                        //显示小数温度1位       

  49.                         if(TempH>=preset && negative==0)//温度超过正预设值,LED灯亮
  50.                                 led=0;
  51.                         else led=1;

  52. //                        Value_High<<=4;//高字节左移四位,剩下一个蓝三个红
  53. //                        Value_High+=(Value_Low&0xf0)>>4;//先将低字节高四位取出来11110000,再右移四位,然后加上高字节的四位
  54. //                        DS18B20_Read_Buffer[0]=Value_High;//整数部分已经保存好了
  55. //                        num=(Value_Low&0x0f)*0.0625;
  56. //                        DS18B20_Read_Buffer[1]=(u8)(num*100);
  57.                 break;
  58.                 case 8000: count=0;break;
  59.         }                       
  60. }
复制代码
板凳
 楼主| gaoky 发表于 2020-2-16 09:16 | 只看该作者
wulin 发表于 2020-2-15 21:21
修改了部分语句,未必符合楼主需求,就算提供一个思路。

谢谢大佬,学习到了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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