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 查看资料

时序说明
初始化:

  1. 将总线拉低,保存低电平至少480us。
  2. 转为输入模式,总线被上拉电阻拉高大约15~60us。
  3. 如果初始化成功则会产生一个由DS18B20所返回的低电平“0”,持续时间大约60~240us。
  4. DS18B20释放总线,将总线拉高。
    在这里插入图片描述
    读时序:
  5. 将数据线拉低至少1us。
  6. 将数据线转为输入模式,DS18B20开始采集数据,大约15us。
  7. 18B20要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。
    注意:所有读时隙必须至少需要60us,且在两次独立的时隙之间至少需要1us的恢复时间。

在这里插入图片描述

写时序:

  1. 数据线先置低电平“0”,延时15us。
  2. 按从低位到高位的顺序发送数据(一次只发送一位)。
  3. 延时60us。
  4. 拉高数据线“1”。
  5. 穿越火线1~4步骤,直到发送完整的字节。
  6. 拉高数据线,释放总线。
    在这里插入图片描述

寄存器说明

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立创·梁山派
VCC5V
DQPB0
GNDGND

在这里插入图片描述

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 。

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

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

相关文章

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架&#xff0c;它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发&#xff0c;主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较&#xff0c;帮助你做出决策&#xff1a; Vue 2&#xff1…

docker安装nacos,单例模式(standalone),使用mysql数据库

文章目录 前言安装创建文件夹"假装"安装一下nacos拷贝文件夹删除“假装”安装的nacos容器生成nacos所需的mysql表获取mysql-schema.sql文件创建一个mysql的schema 重新生成新的nacos容器 制作docker-compose.yaml文件查看网站 前言 此处有本人写得简易版本安装&…

log4j 集成 ELK环境搭建

一、前言 1.需要准备一台linux服务器&#xff08;最好是CentOS7&#xff09;,内存至少4g以上&#xff08;三个组件都比较占用内存&#xff09; 2.需要有docker使用经验 3. 三个软件的版本要一致 二、安装ElasticSearch 这里先创建一个网络&#xff1a;因为我们还需要部署k…

品牌定位升级|飞雕开关如何从家庭作坊走上国际之路?

飞雕电器,这个名字在中国开关插座行业中如同一面旗帜,自1987年起就扬帆在电工领域的大海中。它不仅见证了这个行业的起起伏伏,还始终以其创新的姿态站在浪尖之上。 飞雕的产品线丰富多彩,除主营的墙壁开关插座领域外,飞雕电器还涉足了与墙壁开关紧密相关的其它领域,现已推出移…

蓝桥杯第十四届C++C组

目录 三国游戏 填充 翻转 【单调队列优化DP】子矩阵 【快速幂、欧拉函数】互质数的个数 【tire树】异或和之差 【质因数分解】公因数匹配 子树的大小 三国游戏 题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都…

Linux中安装nacos

Linux中安装nacos 一、前言二、准备1、下载2、上传到服务器3、解压 三、配置1、备份配置文件2、导入sql3、修改前4、修改后 四、使用1、启动2、关闭 一、前言 最近国外的docker似乎是出什么问题&#xff0c;试过很多手段都拉不下 nacos 镜像&#xff0c;就打算在服务器装一下 …

能否安全地删除 Mac 资源库中的文件?

在管理Mac电脑存储空间时&#xff0c;用户确实可能考虑对资源库&#xff08;Library&#xff09;文件夹进行清理以释放空间。Mac资源库是一个系统及应用程序存放重要支持文件的地方&#xff0c;其中包括但不限于配置文件、临时文件、缓存、插件、偏好设置、应用程序支持数据等。…

Rustdesk二次编译,新集成AI功能开源Gpt小程序为远程协助助力,全网首发

环境&#xff1a; Rustdesk1.1.9 sciter版 问题描述&#xff1a; Rustdesk二次编译&#xff0c;新集成AI功能开源Gpt小程序为远程协助助力,全网首发 解决方案&#xff1a; Rustdesk二次编译&#xff0c;新集成开源AI功能Gpt小程序&#xff0c;为远程协助助力&#xff0c…

【蓝桥杯嵌入式】六、真题演练(三)-2研究篇:第13届第一场真题

温馨提示&#xff1a; 真题演练分为模拟篇和研究篇。本专栏的主要作用是记录我的备赛过程&#xff0c;我打算先自己做一遍&#xff0c;把遇到的问题和不同之处记录到演练篇&#xff0c;然后再返回来仔细研究一下&#xff0c;找到最佳的解题方法记录到研究篇。题目在&#xff1a…

远程过程调用(远程调用)

远程过程调用&#xff08;远程调用&#xff09; 1、什么是分布式计算 在计算机科学中&#xff0c;分布式计算&#xff08;英语&#xff1a;Distributed computing&#xff09;&#xff0c;又译为分散式运算。这个研究领域&#xff0c;主要研究分布式系统&#xff08;Distribu…

学习周报:文献阅读+Fluent案例+水力学理论学习

目录 摘要 Abstract 文献阅读&#xff1a;物理信息的神经网络与湍流传质的非封闭机制模型相结合 文献摘要 提出问题 提出方案 实验设置 所需方程介绍 雷诺时均方程&#xff08;RANS&#xff09; K-epsilon两方程模型 神经网络框架 DNN部分 损失函数定义 PINN部分…

Francek Chen 的128天创作纪念日

目录 Francek Chen 的128天创作纪念日机缘收获日常成就憧憬 Francek Chen 的128天创作纪念日 Francek Chen 的个人主页 机缘 不知不觉的加入CSDN已有两年时间了&#xff0c;最初我第一次接触CSDN技术社区是在2022年4月的时候&#xff0c;通过学长给我们推荐了几个IT社区平台&a…

【Python】还在用print进行调试,你Out了!!!

1. 引言 Python 中最常用的函数是什么&#xff1f;像在大多数编程语言中&#xff0c;print() 函数是最常用的。我相信大多数开发者都会像我一样&#xff0c;在开发过程中多次使用它将信息进行打印。 当然&#xff0c;没有其他方法可以完全取代print()函数。不过&#xff0c;当…

c++算法学习笔记 (20) 哈希表

1.模拟散列表 // 拉链法 #include <bits/stdc.h> using namespace std; const int N 100003; int h[N]; int e[N], ne[N], idx; // 存链void insert(int x) {int k (x % N N) % N; // 让负数的余数变成正数(若直接加N,则可能溢出)e[idx] x;ne[idx] h[k];h[k] idx;…

传动设计选型

一. 齿轮选型 1齿轮传动概述 齿轮传动首先自然是一对对的&#xff0c;故也叫齿轮副。原理其实大家基本都知道&#xff0c;很多玩具中都会有齿轮传动的身影&#xff0c;比如小时候玩的四驱车。就是两齿轮互相啮合互相推动&#xff0c;然后输出旋转动力或者改变传递动力的方向&…

基于SpringBoot Vue学生信息管理

一、&#x1f4dd;功能介绍 基于SpringBoot Vue学生信息管理 角色&#xff1a;管理员、学生、教师 管理员&#xff1a;管理员进入主页面&#xff0c;主要功能包括对系统首页、个人中心、学生管理、教师管理、公告通知管理、课程类型管理、课程信息管理、选课信息管理、课程成…

使用STM32实现 蓝牙插座

硬件介绍 蓝牙模块HC-01 蓝牙模块&#xff0c;又叫做蓝牙串口模块 串口透传技术&#xff1a;透传即透明传送&#xff0c;是指在数据的传输过程中&#xff0c;通过无线的方式这组数据不发生任何形式的改变&#xff0c;仿佛传输过程是透明的一样&#xff0c;同时保证传输的质量&…

农业地物反演采用卫星影像技术方法

一、引言 随着空间技术的快速发展&#xff0c;卫星影像已经成为一种重要的工具&#xff0c;用于提供全球尺度的数据收集和分析。在农业领域&#xff0c;卫星影像被广泛应用于植物反演&#xff0c;以获取关于作物生长和健康的实时信息。本文旨在全面概述卫星影像在农业植物反演中…

baseline SE SP YI是什么?

SE、SP和YI是评估分类模型性能时常用的几个统计指标&#xff0c;特别是在医学影像处理、疾病诊断等领域&#xff0c;这些指标帮助了解模型对于正负类样本的识别能力。 SE (Sensitivity)&#xff0c;也称为真正率&#xff08;True Positive Rate, TPR&#xff09;或召回率&#…

鸿蒙ArkUI实例:【自定义组件】

组件是 OpenHarmony 页面最小显示单元&#xff0c;一个页面可由多个组件组合而成&#xff0c;也可只由一个组件组合而成&#xff0c;这些组件可以是ArkUI开发框架自带系统组件&#xff0c;比如 Text 、 Button 等&#xff0c;也可以是自定义组件&#xff0c;本节笔者简单介绍一…