STM32使用HAL库驱动DS18B20

1、STM32CubeMx配置IO口

在这里插入图片描述
因为DS18B20是单总线,数据接收发送都是这根线,所以单片机配置为开漏上拉输出。

2、定时器配置

因为DS18B20对时序要求比较严格,建议用定时器延时获得微秒延时函数。
在这里插入图片描述
总线为48M,分频48,获得1us定时时基。

3、头文件

#ifndef __DS18B20_H
#define __DS18B20_H

#include "main.h"

// 定义DS18B20相关命令
#define DS18B20_CMD_SKIP_ROM        0xCC
#define DS18B20_CMD_CONVERT_T       0x44
#define DS18B20_CMD_READ_SCRATCHPAD 0xBE

void DS18B20_Init(void);
uint8_t DS18B20_Reset(void);
void DS18B20_StartConv(void);
float DS18B20_GetTemp(void);

#endif

4、C文件

#include "ds18b20.h"
#include "tim.h"

#define DS18B20_Set(x) 		HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, (GPIO_PinState)(x))
#define DS18B20_Get()	 	HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin)

void DS18B20_WriteByte(uint8_t byte);
uint8_t DS18B20_ReadByte(void);


/*****************************************************************************
* 说明:DS18B20的微秒延时函数
* 输入:_usTime时间
* 输出:无
*****************************************************************************/
static void DS18B20_DelayUs(uint16_t _usTime)
{
	__HAL_TIM_SetCounter(&htim1,0);
	__HAL_TIM_ENABLE(&htim1);
	while(__HAL_TIM_GetCounter(&htim1) < _usTime);
	__HAL_TIM_DISABLE(&htim1);
}

/*****************************************************************************
* 说明:复位并检测DS18B20的存在
* 主机和DS18B20做任何通讯前都需要对其初始化。
* 初始化期间,总线控制器拉低总线并保持480us以上挂在总线上的器件将被复位,
* 然后释放总线,等到15-60us,此时18B20将返回一个60-240us之间的低电平存在信号。
* 输入:无
* 输出:1=存在,0=不存在
*****************************************************************************/
uint8_t DS18B20_Reset(void)
{
    uint8_t presence = 0;
    // 拉低总线
    DS18B20_Set(0);
    DS18B20_DelayUs(600);
    
    // 释放总线
    DS18B20_Set(1);
    DS18B20_DelayUs(60);
    
    // 检测DS18B20响应
    presence = DS18B20_Get();
    DS18B20_DelayUs(240);
    
    return !presence;
}

/*****************************************************************************
* 说明:复位DS18B20

* 输入:无
* 输出:无
*****************************************************************************/
void DS18B20_Init(void)
{
    // 复位DS18B20
    DS18B20_Reset();
    
    // 发送跳过ROM命令
    DS18B20_WriteByte(DS18B20_CMD_SKIP_ROM);
}



/*****************************************************************************
* 说明:发送一个字节给DS18B20
* 1.总线控制器要产生一个写时序,必须将总线拉低最少1us,
* 2.产生写0时序时总线必须保持低电平60~120us之间,然后释放总线,
* 3.产生写1时序时在总线产生写时序后的15us内允许把总线拉高。
* 4.注意:2次写周期之间至少间隔1us
* 输入:无
* 输出:无
*****************************************************************************/
void DS18B20_WriteByte(uint8_t byte)
{
    for (uint8_t i = 0; i < 8; i++)
    {
        // 发送低位
        DS18B20_Set(0);
        DS18B20_DelayUs(2);
        
        // 发送高位,根据byte的第i位来决定
        if (byte & (1 << i))
        {
            DS18B20_Set(1);
        }
        
        DS18B20_DelayUs(60);
        
        // 释放总线
        DS18B20_Set(1);
    }
}
 

/*****************************************************************************
* 说明:从DS18B20读取一个字节
* 1.总线控制器要产生一个读时序,必须将总线拉低至少1us,
* 2.然后释放总线,在读信号开始后15us内总线控制器采样总线数据,读一位数据至少保持在60us以上。
* 3.注意:2次读周期之间至少间隔1us
* 输入:无
* 输出:无
*****************************************************************************/
uint8_t DS18B20_ReadByte(void)
{
    uint8_t byte = 0;
    
    for (uint8_t i = 0; i < 8; i++)
    {
        // 发送低位
        DS18B20_Set(0);
        DS18B20_DelayUs(2);
        
        // 释放总线
        DS18B20_Set(1);
        DS18B20_DelayUs(8);
        
        // 读取高位数据
        if (DS18B20_Get())
        {
            byte |= (1 << i);
        }
        
        DS18B20_DelayUs(50);
    }
    
    return byte;
}

/*****************************************************************************
* 说明:启动DS18B20转换
* 输入:无
* 输出:无
*****************************************************************************/
void DS18B20_StartConv(void)
{
	DS18B20_Init();
    // 发送温度转换命令
    DS18B20_WriteByte(DS18B20_CMD_CONVERT_T);	
}

/*****************************************************************************
* 说明:读取DS18B20温度
* 1.温度精度及转换时间表
--------------------------------------
R1	R0	精度	最大转换时间	温度LSB
--------------------------------------
0	0	9bit	93.75ms			0.5℃
0	1	10bit	187.5ms			0.25℃
1	0	11bit	375ms			0.125℃
1	1	12bit	750ms			0.0625℃
--------------------------------------
* 输入:无
* 输出:浮点型温度数据
*****************************************************************************/
float DS18B20_GetTemp(void)
{
    
    // 复位DS18B20并跳过ROM
    DS18B20_Init();
    
    // 发送读取寄存器命令
    DS18B20_WriteByte(DS18B20_CMD_READ_SCRATCHPAD);
    
    // 读取温度数据
    uint8_t tempLow = DS18B20_ReadByte();
    uint8_t tempHigh = DS18B20_ReadByte();
    
    // 计算温度值
    int16_t temp = (tempHigh << 8) | tempLow;
    float temperature = (float)temp / 16.0f;/*0.0625℃*/
    
    return temperature;
}


5、使用方法

使用“void DS18B20_StartConv(void)”函数启动转换,因为转换时间需要750ms(12Bit精度),所以隔1秒后,使用“float DS18B20_GetTemp(void)”函数获取温度。
在这里插入图片描述

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32HAL库可以用来驱动DS18B20温度传感器DS18B20是一种数字温度传感器,可以通过一根数据线进行通信。以下是使用STM32HAL库驱动DS18B20的步骤: 1. 配置GPIO口为输出模式,并将数据线拉低一段时间(至少480us)。 2. 将数据线拉高,等待一段时间(至少60us)。 3. 配置GPIO口为输入模式,并等待DS18B20的响应信号(15-60us内拉低数据线)。 4. DS18B20发送数据,STM32HAL库读取数据并进行解析,得到温度值。 5. 关闭总线,将GPIO口配置为输出模式,将数据线拉高。 以上是使用STM32HAL库驱动DS18B20的基本步骤,具体实现可以参考STM32HAL库的相关文档和示例代码。 ### 回答2: DS18B20是一种数字温度传感器,可通过OneWire总线进行通信。使用STM32HAL库中提供的函数可以轻松地驱动DS18B20。 首先,需要在STM32上设置GPIO端口为输出模式,初始化OneWire总线。使用HAL_GPIO_WritePin函数将总线线置为低电平,以开始通信。在总线线为低电平时,发送指令之前应等待至少480微秒。可以使用HAL_Delay函数来实现这个等待。 然后,发送读温度指令,该指令由8个比特组成,其中第一个比特为复位信号,后面的7个比特为功能码0x44。使用HAL_GPIO_WritePin函数将总线线拉到高电平,然后使用HAL_GPIO_ReadPin函数读取总线线的状态。 在发送读温度指令后,DS18B20将在约750毫秒内测量并转换温度,并将其存储在其内部RAM中。可以使用相同的OneWire总线来读取温度数据。 读取温度数据的过程是读取68个比特的数据。先发送读取ROM地址指令(0x33),然后读取DS18B20的ROM信息。发送读取温度数据指令(0x44)后,读取16位数据,其中低8位为温度数据的整数部分,高8位为小数部分。 使用STM32HAL库中提供的函数和上述步骤,可以轻松地驱动DS18B20,并从中读取温度数据。当然,代码中应包含错误处理,以确保温度测量过程不会出现问题。 ### 回答3: STM32HAL库是针对STM32系列微控制器的一套开发库,其中包含了各种外设的驱动库,包括DS18B20驱动库。DS18B20是一种数字温度传感器,采用1-Wire串行总线进行通信。在使用STM32HAL库驱动DS18B20时,需要进行以下步骤: 1. 确定DS18B20连接到STM32的引脚:DS18B20使用单线通信方式,其中引脚包括VDD、GND和DQ(数据线)。DQ需要连接到STM32 GPIO引脚上。 2. 配置STM32 GPIO引脚:使用HAL库的GPIO_Init()函数配置STM32的GPIO引脚,使其能够与DS18B20进行通信。设置引脚为输出模式,并将其电平拉高。 3. 发送复位脉冲并读取DS18B20的ROM码:复位脉冲是指在数据总线上产生一个低电平脉冲,用于初始化传感器的状态。复位脉冲需要保持至少480微秒,并在复位结束后读取DS18B20的ROM码。 4. 配置DS18B20的分辨率和触发温度转换:DS18B20的分辨率可以设置为9、10、11或12位,并且DS18B20可以通过读写调节配置寄存器的方式来实现其分辨率设置和触发转换。 5. 发送温度转换指令并读取结果:在触发温度转换之前需要发送一个片选脉冲,然后将指令字节发送到DS18B20。温度转换需要一定的时间,可以使用DS18B20芯片内部的计时功能来检测转换是否完成,并读取温度值。 总之,使用STM32HAL库驱动DS18B20需要通过合适的GPIO端口进行传输,进行各种参数的设置,并调用HAL库的相关函数来操作DS18B20,最终将温度值反馈到STM32中。通过熟练掌握DS18B20的规格说明书和STM32HAL库的API手册,可以很好地完成这项任务。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值