想用DS18B20采集温度,来给检测系统做温度补偿的,准备在-30度至80度内给检测系统的输出值采N个点,对照不同的温度下系统的检测值用二项式拟合修正。
所以现在要得出DS18B20采集温度的负值,据说DS18B20里是用9位表示温度值,负数用补码表示,我要的是得到温度值给系统修正,不用显示出温度值,那我现在直接用DS18B20得出的二进制码作温度值来给系统修正计算行不行??还是先判断是正还是负然后取温度??因为负数用补码表示的值也可以表示一个正数啊
如果DS18B20的温度值寄器是16位的,负数用补码表示,那我定义一个int型变量行吗? 那么负数的补码会不会是这16范围中另一个正数吗?
单片机读DS18B20温度负值补码问题
答案:2 悬赏:0 手机版
解决时间 2021-02-24 22:19
- 提问者网友:练爱
- 2021-02-24 16:38
最佳答案
- 五星知识达人网友:时间的尘埃
- 2021-02-24 18:05
你可需判断低12位就可以了,高位不管
你可以参考一下我的程序,18B20中的负温度是以补码表示的!!!!!!
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);
}
你可以参考一下我的程序,18B20中的负温度是以补码表示的!!!!!!
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);
}
全部回答
- 1楼网友:忘川信使
- 2021-02-24 19:35
1、ds18b20的三个引脚的功能是什么?
答:ds18b20的3个引脚分别为vcc电源正极、gnd电源负极、dq数据端。
2、 ds18b20复位时间是多少?
答:ds18b20复位时间是480us~960us。
3、 如何判断ds18b20工作正常?
答:不存在此功能。
4、单片机如何实现对ds18b20的写0操作?
答:不存在此功能。(你是不是说如何启动读取ds18b20,启动只需让单片机与dq的接口至低电平保持1微妙以上时间)
5、 ds18b20的分辨率为多少位?如何设置分辨率位数?
答:"ds18b20的分辨率为在-55~127摄氏度,分辨率可以进行量化为9、10、11、12位对应一个单位的温度为:0.5摄氏度、0.25摄氏度、0.125摄氏度、0.0625摄氏度。
6、ds18b20的温度数据如何?如何将区分正负温?
答:ds18b20的温度数据的数据为一个16位二进制数。高5位为判断正负位(高5位为1时温度为负、高5位为0时温度为正),对数据处理的方法,由于负数的数据在存储的时候是以补码的形式存储的,所以在显示的时候补码应该相应的转换为原码。
还有什么疑问?可以追问~上面的希望对你有帮助~
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯