STM32使用HAL库驱动DS18B20

news2024/11/15 19:39:04

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)”函数获取温度。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mall脚手架总结(二) —— SpringData操作Elasticsearch

前言 万字长文带你弄清楚SpringData中的Elasticsearch操作以及在脚手架里接口的结构关系&#xff01;经过前面鉴证授权的整合&#xff0c;荔枝开始熟悉项目的学习的方法了&#xff0c;虽然脚手架中的内容比较简单&#xff0c;但是把边角的知识点全部扫到还是比较花时间的尤其是…

panads操作excel

panads简介 pandas是基于Numpy创建的Python包&#xff0c;内置了大量标准函数&#xff0c;能够高效地解决数据分析数据处理和分析任务&#xff0c;pandas支持多种文件的操作&#xff0c;比如Excel&#xff0c;csv&#xff0c;json&#xff0c;txt 文件等&#xff0c;读取文件之…

Rust 中的 Pin UnPin Async Await 实现机制

原文地址 为了保证概念的严谨性&#xff0c;翻译时保留了英文原文。 In this post, we explore cooperative multitasking and the async/await feature of Rust. We take a detailed look at how async/await works in Rust, including the design of the Future trait, the…

算法学习笔记2023.1

为什么要学算法 因为算法无处不在 算法可以性能优化 c 面试问题 #include<iostream> using namespace std;void selectSort( int arr[], int n){for(int i 0; i < n; i){int minIndex i;for(int j i1 ; j < n ; j){if(arr[j] < arr[minIndex])minIndex j…

Docker修改阿里源

在一次安装rtmp推流服务时&#xff0c;总是无法下载源&#xff0c;估计是国外资源下载超时照成的&#xff0c;于是想到修改为国内源。 docker pull alfg/nginx-rtmp Using default tag: latest latest: Pulling from alfg/nginx-rtmp 530afca65e2e: Retrying in 7 seconds c20…

把短信验证码储存在Redis

校验短信验证码 接着上一篇博客https://blog.csdn.net/qq_42981638/article/details/94656441&#xff0c;成功实现可以发送短信验证码之后&#xff0c;一般可以把验证码存放在redis中&#xff0c;并且设置存放时间&#xff0c;一般短信验证码都是1分钟或者90s过期&#xff0c;…

2VGen-XL高清视频生成视频大模型

https://modelscope.cn/models/damo/Video-to-Video/files https://modelscope.cn/models?nameVideo-to-Video&page1

vue2+elementUI,vue3+elementPlus解决form中的下拉列表回写显示id,不显示label

三个问题&#xff1a; 问题1&#xff1a;vue2elementui中form下的下拉列表回写&#xff0c;赋值之后会出现更改不了值的情况 问题2&#xff1a;表单中绑定的值是v-model‘form.father.son’ 这种多级响应不了&#xff0c;把这种多级改成单级 v-model‘form.son’ 就不会出现值…

剖析伦敦银最新价格走势图

国际金融市场瞬息万变&#xff0c;伦敦银的价格走势会受到诸多因素的影响&#xff0c;比如重要经济数据的公布&#xff0c;国际间的政治博弈&#xff0c;突发的政经大事&#xff0c;都可以令白银价格的走势&#xff0c;在短时间内暴涨暴跌的情况。 要在伦敦银市场实现良好的收益…

绝地求生玩家必读:掌握干货,保障交易安全,一站式解决你的需求!

绝地求生作为热门游戏&#xff0c;吸引了大批玩家的参与。然而&#xff0c;由于游戏账号交易存在一些风险&#xff0c;很多玩家为了保障自己的利益&#xff0c;开始寻找一种安全、便捷的交易方式。幸运的是&#xff0c;现在有了一个专门为游戏账号二手交易服务的网站——闲游盒…

RNN/LSTM学习记录

一.RNN 什么是循环神经网络&#xff1a; 循环神经网络&#xff0c;从名字上理解“循环”&#xff0c;即为构成一个往复的结构&#xff0c;它有着这样的特点&#xff0c;对时序特征的数据十分敏感&#xff0c;能够挖掘出数据中的书序信息以及语义信息。 什么是序列特性呢&…

Python+Tkinter 图形化界面基础篇:添加图形和图像

PythonTkinter 图形化界面基础篇&#xff1a;添加图形和图像 引言添加图形元素步骤1&#xff1a;导入 Tkinter 步骤2&#xff1a;创建主窗口步骤3&#xff1a;创建 Canvas 步骤4&#xff1a;绘制图形 绘制线条 绘制矩形 绘制椭圆 绘制多边形 步骤5&#xff1a;启动主事件循环 显…

学信息系统项目管理师第4版系列23_成本管理

1. 项目成本失控的原因 1.1. 对工程项目认识不足 1.1.1. 对信息系统工程成本控制的特点认识不足 1.1.2. 工程项目的规模不合理 1.1.3. 工程项目设计及实施人员缺乏成本意识 1.1.4. 对项目成本的使用缺乏责任感 1.2. 组织制度不健全 1.2.1. 制度不完善 1.2.2. 责任不落实…

【考研408常用数据结构】C/C++实现代码汇总

文章目录 前言数组多维数组的原理、作用稀疏数组 链表单向链表的增删改查的具体实现思路约瑟夫环问题&#xff08;可不学&#xff09;双向链表 树二叉搜索树中序线索二叉树哈夫曼树的编码与译码红黑树B树B树 堆顺序与链式结构队列实现优先队列排序算法&#xff08;重点&#xf…

信创办公–基于WPS的EXCEL最佳实践系列 (单元格与行列)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;单元格与行列&#xff09; 目录 应用背景操作步骤1、插入和删除行和列2、合并单元格3、调整行高与列宽4、隐藏行与列5、修改单元格对齐和缩进6、更改字体7、使用格式刷8、设置单元格内的文本自动换行9、应用单元格样式10、插…

【力扣】智力题+排序+距离和:2731. 移动机器人

【力扣】智力题排序距离和&#xff1a;2731. 移动机器人 文章目录 【力扣】智力题排序距离和&#xff1a;2731. 移动机器人1. 题目介绍2. 思路3. 解题代码4. Danger参考 1. 题目介绍 有一些机器人分布在一条无限长的数轴上&#xff0c;他们初始坐标用一个下标从 0 开始的整数数…

windows部署django服务器

windows部署django服务器 1、安装IIS1.1 控制面板-----程序----程序和功能----启用或关闭windows功能1.2安装IIS服务器&#xff0c;完成后&#xff0c;重新进入&#xff0c;把CGI安装进系统 2、安装python与虚拟环境2.1 安装python2.2 安装virtualenv虚拟环境2.3 创建一个虚拟环…

关于谷歌浏览器设置打开时页面不起作用的解决方法

背景 1、由于我前面不知道怎么操作的&#xff0c;导致我在设置新建标签页和打开软件时默认打开网页的时候&#xff0c;都不起作用&#xff0c;每次都默认打开谷歌&#xff0c;结果&#xff0c;没有梯子&#xff0c;谷歌还看不了 解决方法 这里我的解决方式有点粗暴&#xff0…

StreamingLLM输入、输出无限长的小记

本文中&#xff1a; 最多400万token上下文、推理提速22倍&#xff0c;StreamingLLM火了&#xff0c;已获GitHub 2.5K星 提到了StreamingLLM可以提供给模型无限输入、无限输出的能力&#xff0c;大概解读一下这个概念 可以实现&#xff1a; 可以支持无限输入&#xff0c;但原理…

沪深300期权一个点多少钱?

经中国证监会批准&#xff0c;深圳证券交易所于2019年12月23日上市嘉实沪深300ETF期权合约品种。该产品是以沪深300为标的物的嘉实沪深300ETF交易型指数基金为标的衍生的标准化合约&#xff0c;下文介绍沪深300期权一个点多少钱?本文来自&#xff1a;期权酱 一、沪深300期权涨…