DS18B20测量温度

这篇具有很好参考价值的文章主要介绍了DS18B20测量温度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、DS18B20读取温度步骤

一般在使用DS18B20时会按照以下步骤进行温度转换并读取:
1、主机发送复位脉冲
2、DS18B20响应
3、发送0xCC命令跳过ROM命令
4、发送功能命令
5、发送功能命令0x44启动温度转换
6、判断温度转换是否完成(为读取1Bit数据为1表示完成)
7、下一个初始化序列开始读取温度
8、然后按照序号1、2、3、4的顺序执行一遍,发送功能命令0xBE
9、读取温度
DS18B20测量温度

DS18B20测量温度

二、初始化复位时序

DS18B20测量温度

/** 
 * @brief 开始时序
 * @param OneWire_TypeDef *pOneWire
 * @retval: 
 */
static uint8_t OneWire_StartPulse(OneWire_TypeDef * const pOneWire)
{
    HAL_GPIO_SetOutput(&pOneWire->DIO);//产生复位时序 >480us
    HAL_GPIO_Low(&pOneWire->DIO);
    Delay_us(500);
    HAL_GPIO_SetInput(&pOneWire->DIO);//等待读取应答信号 等待时间15us~60us
    for (uint8_t i = 0; i <= 60; i++)
    {
        if (HAL_GPIO_Read(&pOneWire->DIO) == 0)
        {
            break;
        }
        if(i == 60)
        {
            return 1;
        }
        Delay_us(1);
    }
    for (uint8_t i = 0; i <= 240; i++)//等待DS18B20释放总线 应答时间60us~240us
    {
        if (HAL_GPIO_Read(&pOneWire->DIO) == 1)
        {
            break;
        }
        if(i == 240)
        {
            return 2;
        }
        Delay_us(1);
    }
    return 0;
}

2.发送一个字节

从图中可以看到发送逻辑0为拉低总线60~120us,逻辑1为拉低总线后拉高总线整个时序要大于60us。
DS18B20测量温度

/** 
 * @brief 发送一个字节数据
 * @param OneWire_TypeDef *pOneWire
 * @param uint8_t dat
 * @retval: 
 */
static void OneWire_SendByte(OneWire_TypeDef * const pOneWire, uint8_t dat)
{
    HAL_GPIO_SetOutput(&pOneWire->DIO);
    for (uint8_t i = 0; i < 8; i++)
    {
        HAL_GPIO_Low(&pOneWire->DIO);
        Delay_us(10);
        if (dat & 0x01)//发送1 时序为拉低1us~15us 然后释放总线,时序大于60us
        {
            HAL_GPIO_High(&pOneWire->DIO);
            Delay_us(60);
        }
        else//发送0 时序是拉低60us~120us 然后释放总线要大于1us,时序大于60us
        {
            Delay_us(60);
            HAL_GPIO_High(&pOneWire->DIO);
            Delay_us(5);
        }
        dat >>= 1;
    }    
}

二、读取数据

DS18B20测量温度

1、读取一个Bit

从图中可以看到主机拉低总线1~15us后释放总线,然后主机读取总线数据。

/** 
 * @brief 接收一个位数据
 * @param OneWire_TypeDef *pOneWire
 * @retval: 
 */
static uint8_t OneWire_ReadBit(OneWire_TypeDef * const pOneWire)
{
    uint8_t Bit = 0;
    HAL_GPIO_SetOutput(&pOneWire->DIO);//读取时序 主机将总线拉低1~15us,然后释放总线,在15us后读取数据,时序大于60us
    HAL_GPIO_Low(&pOneWire->DIO);
    Delay_us(5);
    HAL_GPIO_SetInput(&pOneWire->DIO);
    Delay_us(10);
    Bit = HAL_GPIO_Read(&pOneWire->DIO);
    Delay_us(60);
    return Bit;
}

2、读取一个字节

读取一个字节数据将读一个Bit循环8次就可以了。文章来源地址https://www.toymoban.com/news/detail-400292.html

/** 
 * @brief 从OneWire读取一个字节 
 * @param OneWire_TypeDef *pOneWire
 * @retval: 
 */
static uint8_t OneWire_ReadByte(OneWire_TypeDef * const pOneWire)
{
    uint8_t dat = 0;
    for (uint8_t i = 0; i < 8; i++)
    {
        dat >>= 1;
        dat |= OneWire_ReadBit(pOneWire);
    }
    return dat;
}

三、启动温度转换

/** 
 * @brief 启动一个温度转换
 * @param DS18B20_TypeDef *pDS18B20
 * @retval 0:成功 1:失败
 */
uint8_t DS18B20_Convert(DS18B20_TypeDef * const pDS18B20)
{
    uint8_t result = 0;
    result = OneWire_StartPulse(&pDS18B20->DQ);
    if (result)
        return result;
    OneWire_SendByte(&pDS18B20->DQ, 0xCC);//发送跳过ROM命令
    OneWire_SendByte(&pDS18B20->DQ, 0x44);//发送转换命令
    return 0;
}

四、判断转换完成

/** 
 * @brief 检测温度转换是否完成
 * @param DS18B20_TypeDef *pDS18B20
 * @retval 0:转换中 1:转换完成
 */
uint8_t DS18B20_IsConvertFinish(DS18B20_TypeDef * const pDS18B20)
{
    return OneWire_ReadBit(&pDS18B20->DQ);
}

五、读取温度

/** 
 * @brief 读取温度值
 * @param DS18B20_TypeDef *pDS18B20
 * @param float *temperature 温度值
 * @retval 0:成功 1:失败
 */
uint8_t DS18B20_ReadTemperature(DS18B20_TypeDef * const pDS18B20, float *temperature)
{
    uint8_t result = 0;
    uint8_t TL,TM;
    result = OneWire_StartPulse(&pDS18B20->DQ);
    if (result)
        return result;
    OneWire_SendByte(&pDS18B20->DQ, 0xCC);//发送跳过ROM命令
    OneWire_SendByte(&pDS18B20->DQ, 0xBE);//发送读取命令
    TL = OneWire_ReadByte(&pDS18B20->DQ);//读取温度高位
    TM = OneWire_ReadByte(&pDS18B20->DQ);//读取温度低位
    if ((TM & 0xF8) == 0)//正数
    {
        *temperature = ((int16_t)((TM << 8) | TL)) * 0.0625f;
    }
    else//负数
    {
        *temperature = -((~(int16_t)((TM << 8) | TL)) + 1) * 0.0625f;
    }
    return 0;
}

程序地址

到了这里,关于DS18B20测量温度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32读取DS18B20温度,并在OLED上显示

    部分代码来源于网络,侵权删 本文使用硬件:STM32F103C8T6最小系统板、IIC协议0.96寸OLED屏幕显示、DS18B20传感器  实现功能:在OLED上显示出DS18B20采集到的温度,精确到小数点后一位。 DS18B20.c DS18B20.h main.c 实物效果图: 工程文件百度网盘链接:链接:https://pan.baidu.com/s/17QLXeaq2

    2024年02月15日
    浏览(26)
  • STM32CubeMX 读取DS18B20温度传感器数据串口打印显示

    本文要做的所有工作标题基本都包括了,读取温度传感器的温度数值,再通过串口打印到串口助手; 好多博主大神的教程我按步骤做了之后总是出现程序不报错并且检测不到传感器的情况,后来找到原因并且修改后调试正常。 我用的是普中科技的实验板,主控芯片为STM3210

    2024年02月05日
    浏览(63)
  • 通过stm32读取DS18B20并在显示屏上显示温度值(附源码)

    使用stm32f103c8t6的芯片,在OLED显示屏上显示DS18B20的温度值。 DS18B20 数字温度计提供 9 位温度读数,指示器件的温度信息经过单线接口送入 DS18B20 或从 DS18B20 送出, 因此从中央处理器到 DS18B20 仅需连接一条线。 读、写和完成温度变换所需的电源可以由数据线本身提供而不需要外

    2024年02月15日
    浏览(26)
  • 【TB作品】MSP430单片机 Proteus仿真 DS18B20温度 LCD1602显示器 温度读取与显示

    效果图如下: 首先,让我们先来说说DS18B20集成电路。 • DS18B20是一款采用OneWire通讯协议的集成电路,因此只需要一条线就可以与微控制器通讯。它不需要额外的电源,但是也有外部电源输入端口。 • OneWire设备具有64位的ROM代码。如我们之前所说,这64位的前8位是家族代码,中间

    2024年02月08日
    浏览(50)
  • DS18B20与单片机的通信、DS18B20采集温度、MODBUS协议、练习框架

    单总线数字温度计 异步的半双工的串行通信 测量范围从-55℃ ~ +125℃,增量值为0.5℃ 要用DS18B20采集温度,就要实现与单片机之间的通信,因此有两个问题 Bus master active low:主机执行低电平 DS1820 active low:DS18B20执行低电平 Both bus master and DS1820 active low:全都释放低电平 Resis

    2024年04月16日
    浏览(32)
  • 【mcuclub】温度传感器DS18B20

        VCC:外接供电电源输入端。 DQ: 数字信号输入/输出端。 GND:电源地线 为什么接上拉电阻: 因为DS18B20的数据口是漏极开路,如果不接上拉电阻,则只能输出低电平和高阻态,不能输出高电平,因此需要外接上拉电阻,否则无法输出1。DS18B20的工作电流约为1mA,VCC一般为

    2023年04月22日
    浏览(33)
  • DS18B20温度传感器工作原理

    目录 管脚描述 综述 访问DS18B20的事件序列 通信时序 VDD:电源引脚,当采用寄生电源的时候,VDD必须连接到地 DQ:单总线运用的数据输入/输出,当采用寄生电源供电时,同时向设备提供电源 GND:地 ①DS18B20片内的ROM中都存在独一无二的64位编码,在后期通信时,是用此编码进

    2024年02月09日
    浏览(26)
  • DS18B20温度传感器——测试环境温度及代码

    醒醒!,还在睡呢,开始干代码了! 单片机通过OneWire协议与DS18B20通信,最终测出环境温度 OneWire 总线的硬件接口很简单,只需要把 DS18B20 的数据引脚和单片机的一个 IO 口接上      说明:GND接地,DQ单引线用于数据的输入,VDD接电源正极(注意正负极不能接反) 通过编程,

    2024年02月09日
    浏览(56)
  • STM32——DS18B20温度传感器

    一、DS18B20介绍 (一)DS18B20技术性能特征 1、独特的单总线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,大大提高了系统的抗干扰性。 2、测温范围  -55°C~+125°C 3、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只

    2024年01月19日
    浏览(32)
  • Linux下ds18b20驱动开发获取温度

    对ds18b20不了解的可以查看这篇文章,讲解的比较详细的:STM32一线协议-DS18B20温度传感器采样实现 源码是根据上一届学长的,想要参考的可以去拜访一下gitee:代码链接 (1)修改设备树 在路径 linux-imx/arch/arm/boot/dts/ 下修改设备树 igkboard.dts : 主节点: 从节点: 在源码路径下

    2023年04月22日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包