STM32使用HAL库驱动DS18B20

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

1、STM32CubeMx配置IO口

STM32使用HAL库驱动DS18B20,stm32,嵌入式硬件,单片机
因为DS18B20是单总线,数据接收发送都是这根线,所以单片机配置为开漏上拉输出。

2、定时器配置

因为DS18B20对时序要求比较严格,建议用定时器延时获得微秒延时函数。
STM32使用HAL库驱动DS18B20,stm32,嵌入式硬件,单片机
总线为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)”函数获取温度。
STM32使用HAL库驱动DS18B20,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-726390.html

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

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

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

相关文章

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

    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日
    浏览(8)
  • STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065

    STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065

    STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 Proteus 仿真小实验: STM32 Proteus仿真水箱水塔水位温度控制系统DS18B20 -0065 功能: 硬件组成:STM32F103C8单片机 +LCD1602显示器+ADC220V转3.3V电路+DS18B20温度+多个按键(设置温度和水位)+继电器模拟加热+继电器模拟加水。 1.人工

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

    STM32CubeMX 读取DS18B20温度传感器数据串口打印显示

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

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

    通过stm32读取DS18B20并在显示屏上显示温度值(附源码)

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

    2024年02月15日
    浏览(11)
  • 【基于STM32F103C8T6的DS18b20温度检测系统】

    库函数是ST公司针对STM32系列微控制器提供的一套API,可以方便地实现各种功能。下面是一个基于STM32F103C8T6的温度检测系统的示例,使用了STM32F10x标准库函数。 硬件部分: - STM32F103C8T6微控制器 - 电源模块 - 温度传感器模块 软件部分: - Keil C编译器 - STM32F10x_StdPeriph_Driver库文件

    2024年01月20日
    浏览(10)
  • 【正点原子STM32连载】 第四十二章 DS18B20数字温度传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    【正点原子STM32连载】 第四十二章 DS18B20数字温度传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 本章,我们将介绍STM32F103如何读取外部温度传感器的温度,来得到较为准确的环境温度。我们将学习

    2024年02月04日
    浏览(11)
  • ESP32设备驱动-OLED显示单个或多个DS18B20传感器数据

    在本文中,我们将介绍如何ESP32驱动单个或多个DS18B20传感器,并将DS18B20传感器数据在OLE中显示。 DS18B20 是一种温度传感器,本质上是单线可编程的。 它广泛用于测量存在于硬环境中的化学溶液和物质的温度。 使用此传感器的优势之一是我们只需要 ESP 板上的一个引脚即可传

    2024年02月07日
    浏览(11)
  • 【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20

    【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20

    DS18B20 是 DALLAS 最新单线数字温度传感器,新的\\\"一线器件\\\"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 \\\"一线总线\\\"接口的温度传感器。 DS18B20采用的单总线协议,也就是只需占用主机一个I/O口,无需其他外围电路,直接将

    2024年02月21日
    浏览(10)
  • 单片机驱动多个ds18b20

    单片机驱动多个ds18b20

    目录 1设计内容 2ds18b20介绍 2.1传感器引脚及原理图 2.2寄存器配置 3程序实现 3.1配置初始化 3.2配置寄存器 3.3ROM读取 3.4温度读取 通过51单片机,读取总线上挂载的多个ds18b20的温度信息。 如下图,成功读取到3路温度数据。 DS18B20传感器的引脚及封装图如下: DS18B20一共有三个引脚

    2024年02月21日
    浏览(14)
  • Linux下ds18b20驱动开发获取温度

    Linux下ds18b20驱动开发获取温度

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

    2023年04月22日
    浏览(16)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包