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…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...