单片机读DS18B20温度负值补码问题

想用DS18B20采集温度,来给检测系统做温度补偿的,准备在-30度至80度内给检测系统的输出值采N个点,对照不同的温度下系统的检测值用二项式拟合修正。
所以现在要得出DS18B20采集温度的负值,据说DS18B20里是用9位表示温度值,负数用补码表示,我要的是得到温度值给系统修正,不用显示出温度值,那我现在直接用DS18B20得出的二进制码作温度值来给系统修正计算行不行??还是先判断是正还是负然后取温度??因为负数用补码表示的值也可以表示一个正数啊
如果DS18B20的温度值寄器是16位的,负数用补码表示,那我定义一个int型变量行吗? 那么负数的补码会不会是这16范围中另一个正数吗?

第1个回答  2010-08-31
你可需判断低12位就可以了,高位不管
你可以参考一下我的程序,18B20中的负温度是以补码表示的!!!!!!

/*******DS18B20程序读取温度******/
uchar ReadTemperature(void)
{
uchar a;
uchar b;
uint t=0;

Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar(); //低8位
b=ReadOneChar(); //高8位

t=b;
t<<=8;
t=t|a;
if(t>=2048)//最高位为一说明是个负温
{
t^=0xffff;
dis_buf[0]=17;//在数码管上显示“-”,你可以用一个程序标志位的0,1来表示正温负温
}
else
{
dis_buf[0]=16;
}
t=t>>4;//*0.0625; //数值转换
return((uchar)t);
}

单片机读DS18B20温度负值补码问题
你可以参考一下我的程序,18B20中的负温度是以补码表示的!!!\/***DS18B20程序读取温度***\/ uchar ReadTemperature(void){ uchar a;uchar b;uint t=0;Init_DS18B20();WriteOneChar(0xCC); \/\/跳过读序号列号的操作 WriteOneChar(0xBE); \/\/读取温度寄存器等(共可读9个寄存器) 前两个就是温...

单片机ds18b20温度转换问题
1:接收数据为双字节--先低位,后高位;先低字节,后高字节;2:高字节的前5位若为“0”,则将数据乘以0.0625;即 [t=(D*0.0625)].3:高字节的前5位若为“1”,则将数据先取反,再加一,再乘以0.0625;即 【t=[(~D)+1]*0.0625]】温度是-55~+125 对应的值是 :(-55>>FF92)...

ds18b20用lcd1602显示温度,为什么温度小于0时显示不准确?并且负号也不...
零下的值要做取反加1的处理。程序啥的都没有,负号要进行判断,如果是零度以下,那么取字符库里的负号。void GetTemp(){ uchar n=0,temp;reset(); \/\/×ÜÏ߸´Î»writebyte(0xCC); \/\/ ·¢Skip ROMÃüÁîwritebyte(0xB...

数字温度传感器DS18B20的数据手册理解
数字温度传感器DS18B20是一种能够将外部温度转换为数字信号并存储的设备。在理解DS18B20的数据手册时,有两个关键问题需要回答:数据存储在哪里以及如何读取数据。数据存储在DS18B20的Scratchpad(Sram)中,具体而言,转换的结果被存放在Byte0和Byte1中,Byte0表示低8位,Byte1表示高8位。在进行计算时,高8...

单片机,请教朋友们一个DS18b20传感器负温度的问题.,.
直接把取得的两个字节数据赋给int型的变量,然后乘以0.0625得到的就是带有符号的温度值,然后判断温度值是否小于0,如果小于0那么就用0减去这个int型数据 得到的就是正数

DS18B20温度传感器与单片机间的通信线(延长线)可以多长
50~100m可能有点长,我没有试过那么长,那么长的话信号可能不稳定~~~最好加些信号放大之类的吧,防止衰减·~

DS18B20把高低字节读出来了,怎么转化为实际温度? DS18B20精度是±0.5...
根据你的叙述分析,把高低字节读出来了,用的是12位方式,这时候DS18B20的分辨率是0.0625度,你说DS18B20精度是±0.5度,是错误的,DS18B20精度最高是±1度。转化为实际温度的方法是先判断高字节的D7、D6、D5、D4、D3为,如果为11111,温度为负,如果为00000,温度为正,正温度=采集数据X0....

DS18B20测得温度后,将温度数据转换为十进制数的温度表示,怎么转换为十...
第一个字节低四位存放温度小数部分,高四位存放温度整数低位一部分,第二字节低三位存储整数高位部分,存储温度就用这七位来表示,剩下的高五位表示温度符号,如果为1则表示正,反之为负。正数源码存放,负数补码存放。小数部分转化为十进制,从低低位的最高位开始用电平乘以2的零次方,1次方直到4次方。

ds18b20负数小数怎么换算
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5℃/LSB形式表示。温度值格式如表2.2.1所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制,得到的温度值即为正温度值;当S=1时,测得的温度是零下,DS18B20保存的是温度的补...

...我的DS18B20 部分的程序,求: 怎么读取小数和负数啊,现在只能读取正...
所以1*2负一次方+0*2负2次方...+ 再比如你把它提出来之后,保存在tempdf中,执行if(tempdf>=8)tempdf=5;else tempdf=0;直接用于显示就行啦,至于负数 if((temph&0xf8)!=0x00) \/\/若温度为负的处理,对二进制补码的处理 直接用于数码管显示就行啦,液晶就不知道啦,我不会液晶,妈的累...

相似回答