本文作者:豆面

如何将DS18B20温度传感器的输出转换为实际温度值?

豆面 2025-02-04 06:38:48 160
如何将DS18B20温度传感器的输出转换为实际温度值?摘要: 一、DS18B20温度转换原理1、温度转换命令:主设备向DS18B20发送温度转换命令(44h),DS18B20接收到该命令后开始进行温度转换,2、数据存储:温度转换完成后,转换结...

一、DS18B20温度转换原理

1、温度转换命令:主设备向DS18B20发送温度转换命令(44h),DS18B20接收到该命令后开始进行温度转换。

如何将DS18B20温度传感器的输出转换为实际温度值?

2、数据存储:温度转换完成后,转换结果以16位带符号扩展的二进制补码形式存储在高速暂存存储器的温度寄存器中,高字节(MSB)的高5位是符号位,用于标识温度的正负极性;低字节(LSB)的低4位是小数部分。

二、DS18B20温度数据的读取与处理

1、读取温度数据:主设备通过单线接口读取DS18B20暂存器中的温度数据,先发送跳过ROM命令(CCh),再发送读取暂存器命令(BEh),按照从低位到高位的顺序读取温度寄存器中的两个字节数据。

2、数据处理

判断温度正负:根据读取的温度数据的最高位(符号位)判断温度的正负极性,如果符号位为0,则温度为正;如果符号位为1,则温度为负。

计算温度值:对于正温度,将读取的两个字节数据合并成一个16位的整数,然后根据实际的分辨率(如0.0625℃/位)计算出温度值,如果采用默认的12位精度,那么将16位数据右移4位,得到的结果再乘以0.0625即可得到实际温度值,对于负温度,需要先将16位数据取反加1,然后再按照上述方法计算温度值,并加上负号。

三、示例代码及说明

以下是一个简单的示例代码,用于读取和转换DS18B20的温度数据:

#include "reg52.h"
#include "intrins.h"
sbit DQ = P1^0; //定义DS18B20的数据引脚
void delay_us(unsigned int us) //延时函数
{
    while(us);
}
void DS18B20_Init(void) //初始化DS18B20
{
    DQ = 1; //数据线拉高
    delay_us(2);
    DQ = 0; //数据线拉低
    delay_us(500);
    DQ = 1; //数据线拉高
    delay_us(40);
}
void DS18B20_WriteByte(unsigned char dat) //写一个字节到DS18B20
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        DQ = 0; //拉低数据线
        delay_us(1);
        DQ = dat & 0x01; //写入数据位
        delay_us(68);
        DQ = 1; //拉高数据线
        dat >>= 1;
    }
    delay_us(40);
}
unsigned char DS18B20_ReadByte(void) //从DS18B20读取一个字节
{
    unsigned char i, dat = 0;
    for (i = 0; i < 8; i++)
    {
        DQ = 0; //拉低数据线
        delay_us(1);
        DQ = 1; //拉高数据线
        delay_us(10);
        if (DQ)
            dat |= 0x80; //读取数据位
        delay_us(50);
    }
    return dat;
}
void DS18B20_ConvertTemperature(void) //启动温度转换
{
    DS18B20_Init();
    DS18B20_WriteByte(0xcc); //跳过ROM指令
    DS18B20_WriteByte(0x44); //启动温度转换指令
    delay_us(800); //等待温度转换完成
}
float DS18B20_GetTemperature(void) //获取温度值
{
    unsigned char temp_LSB, temp_MSB;
    int temp;
    float temperature;
    DS18B20_Init();
    DS18B20_WriteByte(0xcc); //跳过ROM指令
    DS18B20_WriteByte(0xbe); //读取暂存器指令
    temp_LSB = DS18B20_ReadByte(); //读取低字节
    temp_MSB = DS18B20_ReadByte(); //读取高字节
    temp = (temp_MSB << 8) | temp_LSB; //合并高低字节
    if (temp_MSB & 0x80) //判断是否为负温度
    {
        temp = ~temp + 1; //取反加1
        temperature = ((float)temp / 16.0) * 0.0625; //计算负温度值
    }
    else
    {
        temperature = ((float)temp / 16.0) * 0.0625; //计算正温度值
    }
    return temperature;
}
int main(void)
{
    float temperature;
    DS18B20_ConvertTemperature(); //启动温度转换
    delay_us(750000); //等待温度转换完成
    temperature = DS18B20_GetTemperature(); //获取温度值
    while (1)
    {
        //可以在此处添加其他代码,例如显示温度值等
    }
}

在上述代码中:

DS18B20_Init函数用于初始化DS18B20传感器。

如何将DS18B20温度传感器的输出转换为实际温度值?

DS18B20_WriteByte函数用于向DS18B20写入一个字节的数据。

DS18B20_ReadByte函数用于从DS18B20读取一个字节的数据。

DS18B20_ConvertTemperature函数用于启动温度转换。

DS18B20_GetTemperature函数用于读取和转换温度数据,并返回实际的温度值。

文章版权及转载声明

作者:豆面本文地址:https://www.jerry.net.cn/articals/26863.html发布于 2025-02-04 06:38:48
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司

阅读
分享