DS18B20温度传感器的数据为什么乘0.625
时间: 2024-05-27 15:10:23 浏览: 17
DS18B20温度传感器输出的数据是一个16位的二进制补码数,其中高8位为整数部分,低8位为小数部分。而具体温度值需要通过计算来得到。
DS18B20默认输出的温度值精度为0.5℃,如果需要更高精度,可以通过设定寄存器来调整输出精度。当输出精度设置为12位时,温度值的计算公式为:
温度值 = 数据 / 16
由于DS18B20的输出数据是一个16位的二进制补码数,而温度值为整数加上小数部分,因此需要将数据除以16来得到温度值的整数部分。
但是,由于DS18B20支持的精度为0.5℃,因此需要将小数部分乘以0.5,得到温度值的小数部分。而0.5可以表示为1/2,即将小数部分乘以1/2,相当于将小数部分右移一位(除以2)。但是,由于DS18B20的输出数据是一个16位的二进制补码数,右移一位相当于将数据除以2,而0.5在二进制中表示为0.1,因此需要将数据乘以0.1的二进制表示(即0.625)来得到温度值的小数部分。
因此,DS18B20温度传感器的数据需要乘以0.625,才能得到实际的温度值。
相关问题
ds18b20温度传感器代码51
以下是基于51单片机的DS18B20温度传感器代码:
```c
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^4; // DS18B20数据线
uchar code table[]={"0123456789"}; // 数码管显示字符
/* DS18B20初始化 */
void Init_DS18B20()
{
uchar i;
DQ = 1;
_nop_();
_nop_();
_nop_();
_nop_();
DQ = 0;
_nop_();
_nop_();
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
i = DQ;
_nop_();
_nop_();
}
/* DS18B20写一个字节 */
void Write_DS18B20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat&0x01;
_nop_();
_nop_();
_nop_();
_nop_();
DQ = 1;
dat = dat>>1;
}
}
/* DS18B20读一个字节 */
uchar Read_DS18B20()
{
uchar i,dat;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
_nop_();
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
_nop_();
_nop_();
dat |= DQ<<i;
}
return dat;
}
/* DS18B20开始转换 */
void Start_DS18B20()
{
Init_DS18B20();
Write_DS18B20(0xcc); // 跳过ROM操作
Write_DS18B20(0x44); // 开始温度转换
}
/* DS18B20读温度 */
void Read_Temperature()
{
uchar i;
uint temp;
uchar a,b;
Init_DS18B20();
Write_DS18B20(0xcc); // 跳过ROM操作
Write_DS18B20(0xbe); // 读暂存器
a = Read_DS18B20(); // 读温度低8位
b = Read_DS18B20(); // 读温度高8位
temp = b;
temp <<= 8;
temp |= a;
temp = temp*0.625; // 转换为实际温度值,单位为摄氏度
for(i=0;i<4;i++)
{
P0 = 0xff; // 段选位全高
P2 = 0x7f; // 位选位选择第i+1位
P0 = table[temp%10]; // 个位数码管显示
temp /= 10;
Delay(5);
}
}
/* 延时函数 */
void Delay(uint i)
{
while(i--);
}
/* 主函数 */
void main()
{
while(1)
{
Start_DS18B20();
Delay(100);
Read_Temperature();
}
}
```
上述代码通过51单片机控制DS18B20温度传感器进行温度读取,并通过数码管进行显示。需要注意的是,DS18B20的数据线需要接在51单片机的P3.4口。
DS18B20读取温度时为啥value *= 0.625;
DS18B20是一种数字温度传感器,它输出的温度值是一个16位的二进制补码数。这个数需要进行一定的计算才能得到真实的温度值。
具体来说,DS18B20的温度值是一个固定点数,其中整数部分是高8位,小数部分是低8位。而每一位的温度分辨率为0.0625度,也就是说,每增加一位,温度值就会增加0.0625度。
因此在程序中,需要将读到的16位温度值进行转换,使其表示真实的温度值。具体的计算公式为:
```c
float temperature = (float)value * 0.0625;
```
其中value是读到的16位温度值,乘以0.0625之后得到真实的温度值。而在程序中使用的是浮点数,因此可以直接将计算结果赋值给一个float类型的变量。
为了避免浮点数计算带来的误差,有时候也会将乘以0.0625改为乘以0.625,然后再将最终的温度值除以10,这样可以避免浮点数计算带来的误差。具体的计算公式为:
```c
float temperature = (float)value * 0.625 / 10;
```
这就是为什么在读取DS18B20的温度值时,会将value乘以0.625的原因。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)