标题:
小白想请问大佬一个关于DS18B20温度传感器的单片机程序问题
[打印本页]
作者:
gaoky
时间:
2020-2-15 16:49
标题:
小白想请问大佬一个关于DS18B20温度传感器的单片机程序问题
我已经用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;
}
}
作者:
wulin
时间:
2020-2-15 21:21
修改了部分语句,未必符合楼主需求,就算提供一个思路。
void DS18B20_Read_Celsius_Drive()
{
static xdata u16 count=0;//为了利用状态机进行复位
// float num;//定义一个浮点数的变量
u16 temp;
u8 TempH,TempL;
bit negative;//负数标志
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();
temp=Value_High<<8|Value_Low;
if(temp&0x8000)
{
negative=1; //负号标志
temp=~temp; //取反加1
temp +=1;
}
else negative=0; //正数
TempH=temp>>4; //分解出整数
TempL=temp&0x0F; //分解出小数
TempL=TempL*6/10; //保留一位小数
if(negative==1)
DS18B20_Read_Buffer[0]=0x40;//显示负号
else if(TempH/100==0)//小于100
DS18B20_Read_Buffer[0]=0; //百位消隐
else
DS18B20_Read_Buffer[0]=smgdu[TempH/100]; //显示百位温度
if((TempH/100==0)&&((TempH%100)/10==0))
DS18B20_Read_Buffer[1]=0; //十位消隐
else
DS18B20_Read_Buffer[1]=smgdu[(TempH%100)/10]; //显示十位温度
DS18B20_Read_Buffer[2]=smgdu[(TempH%100)%10]|0x80;//显示个位温度,带小数点
DS18B20_Read_Buffer[3]=smgdu[TempL]; //显示小数温度1位
if(TempH>=preset && negative==0)//温度超过正预设值,LED灯亮
led=0;
else led=1;
// 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;
}
}
复制代码
作者:
gaoky
时间:
2020-2-16 09:16
wulin 发表于 2020-2-15 21:21
修改了部分语句,未必符合楼主需求,就算提供一个思路。
谢谢大佬,学习到了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1