GD32F470_ DS18B20温度传感器模块移植
DS18B20温度传感器
DS18B20数字温度传感器提供9位至12位精度的温度测量,并具有非易失性用户可编程上下触发点报警功能。DS18B20通过单总线通信,根据定义,只需要一条数据线(和地线)即可与单片机通信。此外,DS18B20可以直接从数据线获得电源(“寄生电源”),消除了每个DS18B20都有一个唯一的64位串行代码,这允许多个DS18B20在同一条总线上工作。因此,使用一个微处理器来实现是很简单的。
控制分布在大面积上的许多ds18b20。可以从此功能中受益的应用包括HVAC环境控制,建筑物,设备或机械内部的温度监测系统以及过程监测和控制系统。
2.14.1 模块来源
采购链接:
DS18B20 测温模块 温度传感器模块 DS18B20开发板
资料下载链接:
https://pan.baidu.com/s/1L83uG8So6k1NG_QznraoFQ
2.14.2 规格参数
工作电压:3-5.5V
工作电流:750nA~1.5mA
测量分辨率:9位到12位可编程分辨率
温度量程: -55 ~ +125 ℃
测量精度:±0.5 ℃
通信协议:单总线
管脚数量:3 Pin(2.54mm间距排针)
工作电流:750nA~1.5mA
测量分辨率:9位到12位可编程分辨率
温度量程: -55 ~ +125 ℃
测量精度:±0.5 ℃
通信协议:单总线
管脚数量:3 Pin(2.54mm间距排针)
2.14.3 移植过程
我们的目标是在梁山派GD32F470上能够实现读取温度的功能。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
2.14.3.1 查看资料
时序说明
初始化:
- 将总线拉低,保存低电平至少480us。
- 转为输入模式,总线被上拉电阻拉高大约15~60us。
- 如果初始化成功则会产生一个由DS18B20所返回的低电平“0”,持续时间大约60~240us。
- DS18B20释放总线,将总线拉高。
读时序: - 将数据线拉低至少1us。
- 将数据线转为输入模式,DS18B20开始采集数据,大约15us。
- 18B20要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。
注意:所有读时隙必须至少需要60us,且在两次独立的时隙之间至少需要1us的恢复时间。
写时序:
- 数据线先置低电平“0”,延时15us。
- 按从低位到高位的顺序发送数据(一次只发送一位)。
- 延时60us。
- 拉高数据线“1”。
- 穿越火线1~4步骤,直到发送完整的字节。
- 拉高数据线,释放总线。
寄存器说明
0XCC
主机可以使用此命令同时对总线上的所有设备进行寻址,而无需发送其他的任何地址。 DS18B20通过发出0XCC命令,然后是温度转换命令[44h]来执行同步温度转换。注意,只有在总线上有一个从设备时,Read Scratchpad [BEh]命令才能跟随Skip ROM命令。在这种情况下,通过允许主服务器从从服务器读取而不发送设备的64位ROM代码可以节省时间。如果总线上有多个从设备,那么Skip ROM命令后跟Read Scratchpad命令将导致数据冲突,因为多个设备将尝试传输数据同时进行。
0X44
该命令为启动单次温度转换。转换后,产生的温度数据存储在地址为【BEh】的2字节温度寄存器中。
0XBE
该命令允许主机读取温度寄存器上的内容。数据传输从低位开始,直到读取第9个字节(bit8=CRC)。如果只需要温度数据,主机可以在任何时候发出复位以终止读取。
温度换算
温度传感器的分辨率我们可配置为9、10、11或12位,分别对应于0.5°C、0.25°C、 0.125°C和0.0625°C的增量。开机时的默认分辨率是12位。我们不进行修改,因为分辨率越高就越精准。
例如数据手册中的示例,如当前当前的温度是+25.0625℃,寄存器读出的高8位数据为0000 0001,低8位数据为1001 0001。将其整合得到16位数据:0000 0001 1001 0001。再转换为10进制数据为401。将读取到的数据乘以分辨率即可得到实际温度。
401 * 0.0625 = 25.0625℃
2.14.3.2 引脚选择
该模块有3个引脚,具体引脚连接见 表2.14.3.2 各引脚连接。
DS18B20 | 立创·梁山派 |
---|---|
VCC | 5V |
DQ | PB0 |
GND | GND |
2.14.3.3 移植至工程
移植步骤中的导入.c和.h文件与上一节相同,只是将.c和.h文件更改为bsp_ds18b20.c与bsp_ds18b20.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_ds18b20.c中,编写如下代码。
/********************************************************************************* 文 件 名: bsp_ds18b20.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2023年04月23日* 功能介绍: ******************************************************************************* 注意事项:
*********************************************************************************/#include "bsp_ds18b20.h"
#include "bsp_usart.h"
#include "stdio.h"
#include "systick.h"/******************************************************************* 函 数 名 称:bsp_ds18b20_GPIO_Init* 函 数 说 明:MLX90614的引脚初始化* 函 数 形 参:无* 函 数 返 回:1未检测到器件 0检测到器件* 作 者:LC* 备 注:无
******************************************************************/
char DS18B20_GPIO_Init(void)
{unsigned char ret = 255;/* 使能时钟 */rcu_periph_clock_enable(RCU_DQ);/* 配置DQ为输出模式 */gpio_mode_set(PORT_DQ,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_DQ);/* 配置为推挽输出 50MHZ */gpio_output_options_set(PORT_DQ,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_DQ);ret = DS18B20_Check();//检测器件是否存在return ret;
}/******************************************************************* 函 数 名 称:DS18B20_Read_Byte* 函 数 说 明:从DS18B20读取一个字节* 函 数 形 参:无* 函 数 返 回:读取到的字节数据* 作 者:LC* 备 注:无
******************************************************************/
uint8_t DS18B20_Read_Byte(void)
{ uint8_t i=0,dat=0;for (i=0;i<8;i++) {DQ_OUT();//设置为输入模式DQ(0); //拉低delay_us(2);DQ(1); //释放总线DQ_IN();//设置为输入模式delay_us(12);dat>>=1;if( DQ_GET() ){dat=dat|0x80;}delay_us(50); } return dat;
}/******************************************************************* 函 数 名 称:DS18B20_Write_Byte* 函 数 说 明:写一个字节到DS18B20* 函 数 形 参:dat:要写入的字节* 函 数 返 回:无* 作 者:LC* 备 注:无
******************************************************************/
void DS18B20_Write_Byte(uint8_t dat)
{ uint8_t i;uint8_t testb;DQ_OUT();//设置输出模式for (i=0;i<8;i++) {if ( (dat&0x01) ) //写1{DQ(0);delay_us(2); DQ(1);delay_us(60); }else //写0{DQ(0);//拉低60usdelay_us(60); DQ(1);//释放总线delay_us(2); }dat=dat>>1;//传输下一位}
}/******************************************************************* 函 数 名 称:DS18B20_Check* 函 数 说 明:检测DS18B20是否存在* 函 数 形 参:无* 函 数 返 回:1:未检测到DS18B20的存在 0:存在* 作 者:LC* 备 注:无
******************************************************************/
uint8_t DS18B20_Check(void)
{ uint8_t timeout=0;//复位DS18B20DQ_OUT(); //设置为输出模式DQ(0); //拉低DQdelay_us(750); //拉低750usDQ(1); //拉高DQ delay_us(15); //15us //设置为输入模式 DQ_IN();//等待拉低,拉低说明有应答while ( DQ_GET() &&timeout<200){timeout++;//超时判断delay_us(1);};//设备未应答if(timeout>=200)return 1;else timeout=0;//等待18B20释放总线while ( !DQ_GET() &&timeout<240){timeout++;//超时判断delay_us(1);};//释放总线失败if(timeout>=240)return 1; return 0;
}/******************************************************************* 函 数 名 称:DS18B20_Start* 函 数 说 明:DS18B20开始温度转换* 函 数 形 参:无* 函 数 返 回:无* 作 者:LC* 备 注:无
******************************************************************/
void DS18B20_Start(void)
{ DS18B20_Check(); //查询是否有设备应答DS18B20_Write_Byte(0xcc); //对总线上所有设备进行寻址DS18B20_Write_Byte(0x44); //启动温度转换
} /******************************************************************* 函 数 名 称:DS18B20_GetTemperture* 函 数 说 明:从ds18b20得到温度值* 函 数 形 参:无* 函 数 返 回:温度数据* 作 者:LC* 备 注:无
******************************************************************/
float DS18B20_GetTemperture(void)
{uint16_t temp;uint8_t dataL=0,dataH=0;float value;DS18B20_Start(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);//对总线上所有设备进行寻址DS18B20_Write_Byte(0xbe);// 读取数据命令 dataL=DS18B20_Read_Byte(); //LSB dataH=DS18B20_Read_Byte(); //MSB temp=(dataH<<8)+dataL;//整合数据if(dataH&0X80)//高位为1,说明是负温度{temp=(~temp)+1;value=temp*(-0.0625);}else{value=temp*0.0625; }return value;
}
在文件bsp_ds18b20.h中,编写如下代码。
#ifndef _BSP_DS18B20_H_
#define _BSP_DS18B20_H_#include "gd32f4xx.h"//端口移植
#define RCU_DQ RCU_GPIOB
#define PORT_DQ GPIOB
#define GPIO_DQ GPIO_PIN_8//设置DQ输出模式
#define DQ_OUT() gpio_mode_set(PORT_DQ,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_DQ)
//设置DQ输入模式
#define DQ_IN() gpio_mode_set(PORT_DQ,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_DQ)
//获取DQ引脚的电平变化
#define DQ_GET() gpio_input_bit_get(PORT_DQ,GPIO_DQ)
//DQ输出
#define DQ(x) gpio_bit_write(PORT_DQ,GPIO_DQ, (x?SET:RESET))void DS18B20_Reset(void);
uint8_t DS18B20_Check(void);
char DS18B20_GPIO_Init(void);
void DS18B20_Start(void);
float DS18B20_GetTemperture(void);
#endif
2.14.4 移植验证
在自己工程中的main主函数中,编写如下。
/********************************************************************************* 文 件 名: main.c* 版 本 号: 初版* 修改作者: LC* 修改日期: 2022年04月19日* 功能介绍: ******************************************************************************* 注意事项:
*********************************************************************************/#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "sys.h"
#include "bsp_usart.h"
#include "bsp_ds18b20.h"/************************************************
函数名称 : main
功 能 : 主函数
参 数 : 无
返 回 值 : 无
作 者 : LC
*************************************************/
int main(void)
{nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); // 优先级分组systick_config(); // 滴答定时器初始化usart_gpio_config(115200U); // 串口0初始化DS18B20_GPIO_Init();while(1) {printf("temperature = %.2f\r\n", DS18B20_GetTemperture() );delay_1ms(1000);}
}
移植现象:输出当前检测到的温度。
移植成功示例,见文件2.14.4-1 。
相关文章:

GD32F470_ DS18B20温度传感器模块移植
DS18B20温度传感器 DS18B20数字温度传感器提供9位至12位精度的温度测量,并具有非易失性用户可编程上下触发点报警功能。DS18B20通过单总线通信,根据定义,只需要一条数据线(和地线)即可与单片机通信。此外,DS18B20可以直接从数据线…...

【JAVASE】带你了解instanceof和equals的魅力
✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 1.instanceof instanceof 是 Java 的保留关键字。它的作用是测试…...

【Linux】进程控制详解
目录 前言 进程创建 认识fork 写时拷贝 再谈fork 进程终止 进程退出码 用代码来终止进程 常见的进程终止的方式 exit _exit 进程等待 进程等待的必要性 进程等待的方式 wait waitpid 详解status参数 详解option参数 前言 本文适合有一点基础的人看的&#…...
Mysql 高性能的sql优化方案和建议
优化MySQL的性能是一项复杂而关键的任务,它可以通过多种方式来实现。下面是一些SQL优化的方案和建议: 索引优化: 确保经常查询的列都有索引。但不要过度索引,因为它可能会增加写入操作的开销。使用组合索引来覆盖多个查询条件。…...

鸿蒙实战开发:【实现应用悬浮窗】
如果你要做的是系统级别的悬浮窗,就需要判断是否具备悬浮窗权限。然而这又不是一个标准的动态权限,你需要兼容各种奇葩机型的悬浮窗权限判断。 fun checkPermission(context: Context): Boolean if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)…...
应用开发:python解析斗鱼弹幕
解决问题 互动弹幕,关注提问 ,ai回答 技术 python playwright 调用接口 https://github.com/broven/DouYudanmu/blob/master/douyu.py 演示 放弃 这个根本不是研究方向 定位错误 你浪费下午时间,定位错误 这个跟本不是你的方向。 4个小时看斗…...

【面试经典150 | 动态规划】交错字符串
文章目录 写在前面Tag题目来源解题思路方法一:动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行…...
设计模式(17):中介者模式
核心: 如果一个系统中对象之间的联系呈现网状结构,对象之间存在大量多对多关系,导致关系及其复杂,这些对象称为“同事对象”。我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网…...

echart 折线图或散点图当横坐标为小数位时,若想显示整数该如何处理?
如图当前是这样的: 横坐标刻度目前是小数位,如果直接将小数位取整则会失去精度,所以我们要做的是刻度即是整数,又能显示小数位对应的数值; 思路就是直接手动设置刻度:设置xAxis的min,max,splitNumber,同时不…...

一套C#自主版权+应用案例的手麻系统源码
手术麻醉信息管理系统源码,自主版权应用案例的手麻系统源码 手术麻醉信息管理系统包含了患者从预约申请手术到术前、术中、术后的流程控制。手术麻醉信息管理系统主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配,…...

31.2k star, 免费开源的白板绘图工具 tldraw
31.2k star, 免费开源的白板绘图工具 tldraw 分类 开源分享 项目名: tldraw -- 无限画布白板 Github 开源地址: https://github.com/tldraw/tldraw 在线测试地址: tldraw 文档地址: tldraw SDK tldraw 是一款开源免费的无限画布白板&…...

Redis开源协议调整,我们怎么办?
2024年3月20日, Redis官方宣布,从 Redis 7.4版本开始,Redis将获得源可用许可证 ( RSALv2 ) 和服务器端公共许可证 ( SSPLv1 ) 的双重许可,时间点恰逢刚刚完成最新一轮融资,宣布的时机耐人寻味。 Redis协议调整,对云计算…...
干了三年外包。。。忘了什么是CICD。。。
干了三年外包。。。忘了什么是CICD。。。 CI/CD(持续集成与持续交付) 是一种软件开发实践,它可以帮助我们更快地交付高质量的软件产品。CI/CD的核心思想是将软件开发过程中的各个阶段自动化,从而减少人工干预,提高开发效率和产品质量。本文将…...
【LeetCode】454. 四数相加 II
目录 题目 思路 代码 题目 题目链接:. - 力扣(LeetCode) 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1…...
搜索(DFS BFS)
DFS 常规DFS: 二叉树前序,中序,后序遍历-CSDN博客 void postorderTraversal(root)初始化一个空列表 arrfind访问总树(root,arr)return arrvoid find(temp, arr)if temp 为空return // 调用顺序由前中后序决定find递归访问左子树find递归访问右子树arr加入当前节点…...
koc和kol是什么意思?
一、koc和kol是什么意思? koc和kol是专业术语。KOC是关键意见消费者的意思,是Key Opinion Consumer的缩写;KOL是关键意见领袖的意思,是Key Opinion Leader的缩写。 1、关键意见领袖kol “关键意见领袖”通俗地讲是达人。这些人…...

基于vscode Arduino插件开发Arduino项目
基于vscode Arduino插件开发arduino项目 插件配置问题记录1. 指定编译输出文件夹2. 编译下载时不输出详细信息3. 输出端口信息乱码4. 通过串口输出中文,vscode对应的串口助手上会显示乱码(未解决) 插件配置 环境:Arduino插件版本…...

AI 驱动强大是视频转换处理软件
由 AI 驱动的视频工具包。 增强、转换、录制和编辑视频AI 驱动的顶级视频工具包。 不论是老旧、低质、噪声或模糊的影片/图像,都能升级至 4K,稳定抖动的影片,提升帧率至 120/240fps,并能以全面 GPU 加速进行转换、压缩、录制和编辑…...

Python+requests+Pytest+logging+allure+pymysql框架详解
一、框架目录结构 1)tools目录用来放公共方法存储,如发送接口以及读取测试数据的方法,响应断言 数据库断言 前置sql等方法;2)datas目录用例存储接口用例的测试数据,我是用excel来存储的数据,文件数据 图片数据等;3)testcases目录用来存放测试用例,一个python文件对应…...
菜鸟笔记-Numpy函数-full/random.randint/random.choice
full函数 numpy.full 是 NumPy 库中的一个函数,它用于创建一个具有指定形状、数据类型和填充值的数组。此函数非常有用,因为它允许你快速生成一个具有相同值的数组,而无需手动设置每个元素。 1函数介绍 numpy.full(shape, fill_value, dty…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...