[51单片机] 51单片机采集到的DS18B20的温度数据在if里比较大小无效。求助

[复制链接]
3070|20
 楼主| 菜鸟也有春天 发表于 2016-3-7 15:36 | 显示全部楼层 |阅读模式
两个DS18B20温度传感器与单片机连接。

/********************主程序***********************************/
void main()
{
float n,m;
  n=read_temp();
m=read_temp_1();
while(1)
{       
if(m>n)
{Bao_1();}
else
{Bao();}
}
}
******************读取温度值的程序*****************
float read_temp_1()/*读取温度值并转换*/
{uchar a,b;
ds1820rst_1();   
ds1820wr_1(0xcc);//*跳过读序列号*/
ds1820wr_1(0x44);//*启动温度转换*/
ds1820rst_1();   
ds1820wr_1(0xcc);//*跳过读序列号*/
ds1820wr_1(0xbe);//*读取温度*/
a=ds1820rd_1();
b=ds1820rd_1();
tvalue_1=b;
tvalue_1<<=8;
tvalue_1=tvalue_1|a;
    if(tvalue_1<0x0fff)
   tflag=0;
    else
   {tvalue_1=~tvalue_1+1;
    tflag=1;
   }
tvalue_1=tvalue_1*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue_1);
}
********************读取温度值程序********************
float read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst();   
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();   
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
    if(tvalue<0x0fff)
   tflag=0;
    else
   {tvalue=~tvalue+1;
tflag=1;
   }
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
 楼主| 菜鸟也有春天 发表于 2016-3-7 15:41 | 显示全部楼层
:(主程序里的
if(m>n)
{Bao_1();}
else
{Bao();}
不管怎么改变都只执行else后面的语句,改成if(m<n)也是只执行else后面的语句
aguang417589444 发表于 2016-3-7 16:50 | 显示全部楼层
本帖最后由 aguang417589444 于 2016-3-7 16:52 编辑

改成相等呢?为什么不仿真下M,N两个变量的值?:lol
lordma 发表于 2016-3-7 16:51 | 显示全部楼层
你两个m,n数据是浮点型的,这两个温度数据测量时间很短,温度差小数点,不能直接比
 楼主| 菜鸟也有春天 发表于 2016-3-7 17:20 | 显示全部楼层
aguang417589444 发表于 2016-3-7 16:50
改成相等呢?为什么不仿真下M,N两个变量的值?

:'(改成相等或者是>=和<=这种都只执行if后的语句不执行else后面的语句,醉啦
 楼主| 菜鸟也有春天 发表于 2016-3-7 17:22 | 显示全部楼层
lordma 发表于 2016-3-7 16:51
你两个m,n数据是浮点型的,这两个温度数据测量时间很短,温度差小数点,不能直接比 ...

不会啊,我故意在仿真软件里面把传感器的温度调的相差的比较大
aguang417589444 发表于 2016-3-7 17:38 | 显示全部楼层
本帖最后由 aguang417589444 于 2016-3-7 17:39 编辑

首先:tvalue类型应该是unsigned int吧?。然后是计算tvalue=(unsigned int)tvalue*0.625;要是温度采集没有问题   即使后面返回是浮点型的最后结果也应该没有问题。多多仿真下观察变量的值看看是否正确。单步仿真查看问题出在哪一步。你只看结果不对想当然的认为你程序不存在问题是找不出问题的
 楼主| 菜鸟也有春天 发表于 2016-3-7 17:45 | 显示全部楼层
aguang417589444 发表于 2016-3-7 17:38
首先:tvalue类型应该是unsigned int吧?。然后是计算tvalue=(unsigned int)tvalue*0.625;要是温度采集没 ...

主要是我单独显示两个传感器采集的温度数据是正常的,比较之后显示其中一个就不对路了
aguang417589444 发表于 2016-3-7 17:47 | 显示全部楼层
菜鸟也有春天 发表于 2016-3-7 17:45
主要是我单独显示两个传感器采集的温度数据是正常的,比较之后显示其中一个就不对路了 ...

你执行到这里Bao();就停下   看看对不对
 楼主| 菜鸟也有春天 发表于 2016-3-7 17:55 | 显示全部楼层
aguang417589444 发表于 2016-3-7 17:47
你执行到这里Bao();就停下   看看对不对

if(n>m)
{Bao();}
//else
//Bao_1();
}
这样的之后,LCD上显示不出温度数据,也就是Bao();没有执行。
xgliyouquan 发表于 2016-3-7 18:20 | 显示全部楼层
如果找不出原因,就将编译器优化等级设0试试
xuezhonghun 发表于 2016-3-7 21:38 | 显示全部楼层
仔细看看单片机中浮点变量的存储方式,还有DS18B20采到的的测温数据。
whtwhtw 发表于 2016-3-8 08:51 来自手机 | 显示全部楼层
浮点数是什么
whtwhtw 发表于 2016-3-8 08:52 来自手机 | 显示全部楼层
浮点数乘以一个数,比如1000,再比较
Kowalski 发表于 2016-3-8 09:52 | 显示全部楼层
把赋值语句 n=read_temp();m=read_temp_1();放入while大循环的内部,否则仅仅是程序刚开始执行的时候执行一次,然后m,n里面的数值一直就是最初的数值,永远不会改变
robter 发表于 2016-3-8 10:20 | 显示全部楼层
这个还真没有遇到过
zhoupxa 发表于 2016-3-8 10:31 | 显示全部楼层
问题出在浮点数比较上了
建议把浮点数扩大若干倍取整(在精度损失满足要求的前提下)后比较
xizengliu 发表于 2016-3-8 10:49 | 显示全部楼层
ningling_21 发表于 2016-3-8 12:00 | 显示全部楼层

把浮点数转换为整数再比较试试
人民币的幻想 发表于 2016-3-8 12:07 | 显示全部楼层
浮点数据格式的问题,建议先转换为整数再比较。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部