单片机ds18b20温度计怎么判断正负(单片机ds18b20温度计实验报告)

背景

在单片机控制中,常常需要测量一些物理量,如温度、湿度等,而这些物理量并不是常常处于正值。因此,如何准确区分正负变得非常重要。针对温度测量,我们使用ds18b20温度计,下面将详细介绍如何通过ds18b20温度计来判断温度的正负。

ds18b20温度计介绍

ds18b20是一种数字式温度传感器。它可以使用一根3线或4线串行总线与单片机或其他数字芯片连接。ds18b20的精度高,价格也不贵,广泛应用于各种工业自动化和电子产品中。

ds18b20测量的温度范围为-55℃~125℃,输出的温度值为16位二进制补码,高8位为整数位,低8位为小数位,最高位表示正负。因此,当最高位为1时,温度为负数,当最高位为0时,温度为正数。

判断ds18b20测量结果的正负

当ds18b20采集的温度值为二进制补码形式时,如何准确区分正负的温度值呢?下面,我们将介绍两种判断ds18b20温度计测量结果的正负的方法。

方法一:利用位运算符号实现

由于温度值为16位二进制补码,因此我们可以通过位运算符号来判断最高位是否为1,以此来判断温度的正负。

代码示例:

单片机ds18b20温度计怎么判断正负(单片机ds18b20温度计实验报告)

```c
uint16_t temperature;
int8_t temp_int;
uint8_t temp_dec;

temperature = ds18b20ReadTemp(); // 读取ds18b20的温度值
if(temperature & 0x8000) // 当温度值最高位为1时,温度为负数
{
temp_int = -(int8_t)((~temperature + 1) >> 8); // 将温度值转换为有符号数(整数位),并赋值给temp_int
temp_dec = ((~temperature + 1) & 0xff) * 625 / 1000; // 将温度值转换为有符号数(小数位),并赋值给temp_dec
}
else // 当温度值最高位为0时,温度为正数
{
temp_int = temperature >> 8; // 将温度值转换为有符号数(整数位),并赋值给temp_int
temp_dec = (temperature & 0xff) * 625 / 1000; // 将温度值转换为有符号数(小数位),并赋值给temp_dec
}
```

方法二:利用int16_t数据类型实现

当温度值最高位为1时,温度为负数,最高位为0时,温度为正数,因此我们可以使用int16_t数据类型来存储温度值,使用int8_t数据类型来存储整数位和小数位。当温度为正数时,温度值直接存储在int16_t类型变量中,整数位为温度值除以256的商,小数位为温度值除以256的余数。当温度为负数时,先将温度值取反,再加1,然后再存储在int16_t类型变量中,整数位和小数位的计算方式与正数相同,然后再将整数位和小数位分别取反加1,得到温度的值。

代码示例:

```c
int16_t temperature;
int8_t temp_int;
uint8_t temp_dec;

temperature = ds18b20ReadTemp(); // 读取ds18b20的温度值
if(temperature < 0) // 当温度为负数时
{
temperature = ~(temperature - 1); // 将温度值取反加1
temp_int = (int8_t)(temperature / 256); // 计算温度整数位
temp_dec = ((temperature % 256) * 625 / 1000); // 计算温度小数位
temp_int = ~temp_int + 1; // 将整数位取反加1,得到真正的负数
temp_dec = ~temp_dec + 1; // 将小数位取反加1,得到真正的负数
}
else // 当温度为正数时
{
temp_int = (int8_t)(temperature / 256); // 计算温度整数位
temp_dec = ((temperature % 256) * 625 / 1000); // 计算温度小数位
}
```

总结

通过以上两种方法,我们可以准确判断ds18b20温度计测量值的正负,从而对温度值进行后续处理。在实际的单片机开发过程中,应根据实际情况选择合适的方法,提高代码的可读性和执行效率。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/mcu977-2.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年4月26日 上午3:26
下一篇 2023年4月26日 上午3:26

猜你喜欢