作业帮 > 综合 > 作业

DS18B20读出温度我想问下面程序返回的temp里面是多少?是二进制么?temp返回给tem能和十进制数比较么?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/10/04 15:44:29
DS18B20读出温度我想问下面程序返回的temp里面是多少?是二进制么?temp返回给tem能和十进制数比较么?
请明白的给解答一下.我考虑好久了~就是想不明白 非常感谢
read_temp()
{
ow_reset(); //总线复位
delay(200);
write_byte(0xcc); //发命令
write_byte(0x44); //发转换命令
ow_reset();
delay(1);
write_byte(0xcc); //发命令
write_byte(0xbe);
temp_data[0]=read_byte(); //读温度值的低字节
temp_data[1]=read_byte(); //读温度值的高字节
temp=temp_data[1];
temp>4; // 取中间八位,即整数部分的值
display[3]=display[4]/100; // 取百位数据暂存
display[1]=display[4]%100; // 取后两位数据暂存
display[2]=display[1]/10; // 取十位数据暂存
display[1]=display[1]%10;
还有这个语句 tt=temp*0.0625; //得到真实十进制温度值
但是在keil里面不能编译为什么?
如果想把测得的转化为十进制数怎么办?(因为要与25℃比较大小的)
DS18B20出来的是一个16位的温度值
记得应该是高5位(可能是4位,具体看看手册)是符号位,是1的话表示负值
低4位是小数位
要得到一个真实的温度值的话,先判断高位是不是为1,是的话,为负值,然后把高位屏蔽
temp = temp & 0xf800
然后右移4位,去掉小数位
temp = temp >> 4;
这时候temp就是一个实际的温度值(只有整数部分),可以直接和25比较了
再问: 谢谢~懂了一些,但是我想要精确点留着小数位怎么办?我原来的想法是都转换成十进制, 还有高5位是符号位,可是不太理解高位屏蔽,temp = temp & 0xf800,这样不是把低字节屏蔽么?能具体给解释解释么~非常感谢~我实在不明白这块
再答: 呃,那个,下午有点晕。。。 应该是temp = temp & 0x07ff 要保留小数也简单呀,不过通常是按整数来取的,bit3是0.1位,bit2是0.01位 在单片机里就不要用浮点数啦 如果你要保留2位小数,那就把值放大100倍 然后判断bit3,为1的话,加上50,为0的话不加。 判断bit2,为1的话,加上25 bit1,bit0类似,如果要保留到bit0的话,那值就放大10000倍就好了。