打印
[51单片机]

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

[复制链接]
2461|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两个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数据是浮点型的,这两个温度数据测量时间很短,温度差小数点,不能直接比

使用特权

评论回复
5
菜鸟也有春天|  楼主 | 2016-3-7 17:20 | 只看该作者
aguang417589444 发表于 2016-3-7 16:50
改成相等呢?为什么不仿真下M,N两个变量的值?

:'(改成相等或者是>=和<=这种都只执行if后的语句不执行else后面的语句,醉啦

使用特权

评论回复
6
菜鸟也有春天|  楼主 | 2016-3-7 17:22 | 只看该作者
lordma 发表于 2016-3-7 16:51
你两个m,n数据是浮点型的,这两个温度数据测量时间很短,温度差小数点,不能直接比 ...

不会啊,我故意在仿真软件里面把传感器的温度调的相差的比较大

使用特权

评论回复
7
aguang417589444| | 2016-3-7 17:38 | 只看该作者
本帖最后由 aguang417589444 于 2016-3-7 17:39 编辑

首先:tvalue类型应该是unsigned int吧?。然后是计算tvalue=(unsigned int)tvalue*0.625;要是温度采集没有问题   即使后面返回是浮点型的最后结果也应该没有问题。多多仿真下观察变量的值看看是否正确。单步仿真查看问题出在哪一步。你只看结果不对想当然的认为你程序不存在问题是找不出问题的

使用特权

评论回复
8
菜鸟也有春天|  楼主 | 2016-3-7 17:45 | 只看该作者
aguang417589444 发表于 2016-3-7 17:38
首先:tvalue类型应该是unsigned int吧?。然后是计算tvalue=(unsigned int)tvalue*0.625;要是温度采集没 ...

主要是我单独显示两个传感器采集的温度数据是正常的,比较之后显示其中一个就不对路了

使用特权

评论回复
9
aguang417589444| | 2016-3-7 17:47 | 只看该作者
菜鸟也有春天 发表于 2016-3-7 17:45
主要是我单独显示两个传感器采集的温度数据是正常的,比较之后显示其中一个就不对路了 ...

你执行到这里Bao();就停下   看看对不对

使用特权

评论回复
10
菜鸟也有春天|  楼主 | 2016-3-7 17:55 | 只看该作者
aguang417589444 发表于 2016-3-7 17:47
你执行到这里Bao();就停下   看看对不对

if(n>m)
{Bao();}
//else
//Bao_1();
}
这样的之后,LCD上显示不出温度数据,也就是Bao();没有执行。

使用特权

评论回复
11
xgliyouquan| | 2016-3-7 18:20 | 只看该作者
如果找不出原因,就将编译器优化等级设0试试

使用特权

评论回复
12
xuezhonghun| | 2016-3-7 21:38 | 只看该作者
仔细看看单片机中浮点变量的存储方式,还有DS18B20采到的的测温数据。

使用特权

评论回复
13
whtwhtw| | 2016-3-8 08:51 | 只看该作者
浮点数是什么

使用特权

评论回复
14
whtwhtw| | 2016-3-8 08:52 | 只看该作者
浮点数乘以一个数,比如1000,再比较

使用特权

评论回复
15
Kowalski| | 2016-3-8 09:52 | 只看该作者
把赋值语句 n=read_temp();m=read_temp_1();放入while大循环的内部,否则仅仅是程序刚开始执行的时候执行一次,然后m,n里面的数值一直就是最初的数值,永远不会改变

使用特权

评论回复
16
robter| | 2016-3-8 10:20 | 只看该作者
这个还真没有遇到过

使用特权

评论回复
17
zhoupxa| | 2016-3-8 10:31 | 只看该作者
问题出在浮点数比较上了
建议把浮点数扩大若干倍取整(在精度损失满足要求的前提下)后比较

使用特权

评论回复
18
xizengliu| | 2016-3-8 10:49 | 只看该作者

使用特权

评论回复
19
ningling_21| | 2016-3-8 12:00 | 只看该作者

把浮点数转换为整数再比较试试

使用特权

评论回复
20
人民币的幻想| | 2016-3-8 12:07 | 只看该作者
浮点数据格式的问题,建议先转换为整数再比较。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝