普中STM32-PZ6806L开发板(HAL库函数实现-温度传感器DS18B20)

简介

主芯片STM32F103ZET6, 通过引脚PG11 连接DS18B20, 读取DS18B20采集的温度数据;

电路原理图

DS18B20电路图
在这里插入图片描述
DS18B20 与 主芯片连接引脚
在这里插入图片描述

其他知识

DS18B20资料

DS18B20数据手册

DS18B20 简介

单线通讯的温度传感器,
测量温度在-55℃ 到 +125℃,
在-10°C 到 +85°C精度±0.5°C,
9~12bit 可设定分辨率,
默认12bit分辨率,
12bit分辨率下温度转化时间在最长是750ms,
温度值存在DS18B20 ROM中是补码的形式存储, 负值需要 取反 + 1才能得到原码

实现步骤

时序图中设计到的采集数据时有进行us级别的延时, 需要将系统改成us级别或者定义一个TIMER作为us级别的延时器

创建项目

参考 普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

TIM2 实现us级别延时

参考 普中STM32-PZ6806L开发板(HAL库函数实现-TIM2实现us延时)

引脚初始化

默认初始化为输出
在这里插入图片描述

添加用户代码

引脚输入输出变动代码

引脚涉及到 输入 和 输出, 所以我们需要在代码里面实现输入和输出可以切换的方式, 代码如下

	static void SENSOR_DS18B20_SetPinInput(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}static void SENSOR_DS18B20_SetPinOutput(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{GPIO_InitTypeDef  GPIO_InitStruct;GPIO_InitStruct.Pin = GPIO_Pin;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
}
初始化时序代码

在这里插入图片描述

/*SENSOR_DS18B20_Reset :初始化,也是复位, 每次发送指令前的动作0 : 初始化失败1 : 初始化成功
*/
static uint8_t SENSOR_DS18B20_Reset(void)
{uint8_t res = 0;SENSOR_DS18B20_SetPinOutput(DS18B20_PORT, DS18B20_PIN);   // 引脚输出模式HAL_GPIO_WritePin (DS18B20_PORT, DS18B20_PIN, 0);  // 拉低引脚delay_us (480);   // 参考初始化时序图, 延时480usSENSOR_DS18B20_SetPinInput(DS18B20_PORT, DS18B20_PIN);    // set the pin as inputdelay_us (60);    // 15~60us等待DS18B20回复信息, 多等20us避免检测不到if ( !HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN) )res = 1;  // 检测到低电平,  DS18B20有响应else res = 0;delay_us (420); // 等待DS18B20结束响应return res;
}
读写时序代码

在这里插入图片描述

void SENSOR_DS18B20_Write(uint8_t data)
{/*按位写, 根据时序图, 按照写的 高电平的时序 和 低电平的时序进行延时*/for (int i = 0; i < 8; ++i){if ((data & (1<<i))!=0) // 写1{SENSOR_DS18B20_SetPinOutput(DS18B20_PORT, DS18B20_PIN);  HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, 0);  // 拉低delay_us (2);  // 低电平保持时间SENSOR_DS18B20_SetPinInput(DS18B20_PORT, DS18B20_PIN);  // 输入delay_us (60);  // 等待}else // 写0{SENSOR_DS18B20_SetPinOutput(DS18B20_PORT, DS18B20_PIN);HAL_GPIO_WritePin (DS18B20_PORT, DS18B20_PIN, 0);  // 拉低delay_us (60);  // 等待60usSENSOR_DS18B20_SetPinInput(DS18B20_PORT, DS18B20_PIN); // 输入}}
}uint8_t SENSOR_DS18B20_Read (void)
{uint8_t value = 0;for (int i=0;i<8;i++){SENSOR_DS18B20_SetPinOutput(DS18B20_PORT, DS18B20_PIN);HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, 0);  // 拉低delay_us(2);  // 拉低电平等待时间SENSOR_DS18B20_SetPinInput(DS18B20_PORT, DS18B20_PIN);if (HAL_GPIO_ReadPin (DS18B20_PORT, DS18B20_PIN))  {value |= 1<<i;  }delay_us (60);  // DS18B20数据响应时间}return value;
}
获取温度值
float SENSOR_DS18B20_GetTemperature(void)
{uint8_t lsb_byte, msb_byte;uint16_t temp = 0;float value = 0.0;SENSOR_DS18B20_Reset ();HAL_Delay (1);SENSOR_DS18B20_Write (0xCC);  // skip ROMSENSOR_DS18B20_Write (0x44);  // convert tHAL_Delay (800); // 12bit分辨率最长转换时间750msSENSOR_DS18B20_Reset ();HAL_Delay (1);SENSOR_DS18B20_Write (0xCC);  // skip ROMSENSOR_DS18B20_Write (0xBE);  // 读值指令lsb_byte = SENSOR_DS18B20_Read(); // LSBmsb_byte = SENSOR_DS18B20_Read(); // MSBtemp = msb_byte;temp = (temp<<8) + lsb_byte; // 合并if((temp&0xf800)==0xf800) // 符号位判定是否负数{temp=(~temp)+1; // 补码转原码value=temp*(-0.0625); //12bit 增量值}else{value=temp*0.0625;	//12bit 增量值}return value;
}

main.c

int main()
{
...while (1){printf("sensors temp: %f\r\n", SENSOR_DS18B20_GetTemperature());HAL_Delay(2000);}
...
}

共赏

在这里插入图片描述

代码

不需要下载, 基本代码上面都提供了

参考

普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)

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

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

相关文章

平衡二叉树,力扣

目录 前序遍历与后续遍历 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 解题方法分析&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 补充说明…

【每日论文阅读】生成模型篇

联邦多视图合成用于元宇宙 标题: Federated Multi-View Synthesizing for Metaverse 作者: Yiyu Guo; Zhijin Qin; Xiaoming Tao; Geoffrey Ye Li 摘要: 元宇宙有望提供沉浸式娱乐、教育和商务应用。然而&#xff0c;虚拟现实&#xff08;VR&#xff09;在无线网络上的传输是…

【UEFI基础】EDK网络框架(通用函数和数据)

通用函数和数据 DPC DPC全称Deferred Procedure Call。Deferred的意思是“延迟”&#xff0c;这个DPC的作用就是注册函数&#xff0c;然后在之后的某个时刻调用&#xff0c;所以确实是有“延迟”的意思。DPC在UEFI的实现中包括两个部分。一部分是库函数DxeDpcLib&#xff0c;…

Unity中使用四元数乘法表示旋转

四元数乘法旋转的本质是旋转的连续应用。当你执行p * q时&#xff0c;可以理解为首先应用四元数p的旋转&#xff0c;然后再应用四元数q的旋转。 四元数旋转乘法主要分为全局坐标的旋转和局部坐标的旋转. 全局坐标下的旋转&#xff1a; transform.rotationtransform.roation*…

考研复试英语口语问答举例第一弹

考研复试英语口语问答举例第一弹 文章目录 考研复试英语口语问答举例第一弹Question &#xff1a;介绍你的读研兴趣与动机Answer1&#xff1a;&#xff08;医疗与人工智能结合方向&#xff09;Answer2&#xff1a;&#xff08;分布式与网安方向&#xff09;Answer3&#xff1a;…

AUTOSAR规范与ECU软件开发(基础篇)1.2 汽车电子控制系统的基本构成

目录 前言 1、 传感器 2、 电子控制单元(ECU) 3、 执行器 前言 汽车电子控制系统主要由传感器(Sensor) 、 电子控制单元(Electronic Control Unit, ECU) 和执行器(Actuator) 组成(图1.1) ,对被控对象(Controlled Object) 进行控制。

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3,

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出&#xff1a;第0项是0&#xff0c;第1项是第一个1。从第三项开始&#xff0c;每一项都等于前两项之和。 Python 实现斐波那契数列代码如下&#xff1a; 实例(Python 3.0) # -*- coding: UTF-8 -*- # File…

JS和TS的基础语法学习以及babel的基本使用

简介 本文主要介绍了一下js和ts的基础语法,为前端开发zuo JavaScript 更详细的 JavaScript 学习资料&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 简介 定位 : JavaScript 是一种动态语言&#xff0c;它包含类型、运算符、标准内置&#xff08; bu…

数字IC设计——数字电路基本元器件

现代数字集成电路基本由CMOS晶体管构成&#xff0c;而CMOS门电路由PMOS场效应管和NMOS场效应管以对称互补的形式组成&#xff0c;所谓“互补”&#xff0c;即利用互补型MOSFET&#xff0c;即pMOS和nMOS&#xff0c;二者成对出现构成互补电路。 这种电路具有高的电路可靠性和抗干…

Mysql show Profiles详解

1.简介 show profile 和 show profiles 命令用于展示SQL语句的资源使用情况&#xff0c;包括CPU的使用&#xff0c;CPU上下文切换&#xff0c;IO等待&#xff0c;内存使用等&#xff0c;这个命令对于分析某个SQL的性能瓶颈非常有帮助&#xff0c;借助于show profile的输出信息&…

力扣hot100 二叉树的直径

&#x1f468;‍&#x1f3eb; 题目地址 一个节点的最大直径 它左树的深度 它右树的深度 &#x1f60b; AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* Tr…

(基础篇)go常用使用场景三(死锁的场景及处理)

目录 一、通道的发送和接收不匹配 二、没有足够的机会让 goroutine 执行完成 三、资源竞争

[Android]RadioButton控件

RadioButton控件 RadioButton控件是单选按钮控件&#xff0c;它继承自Button控件&#xff0c;可以直接使用Button控件支持的各种属性和方法。 与普通按钮不同的是&#xff0c;RadioButton控件多了一个可以选中的功能&#xff0c;能额外指定一个android&#xff1a;checked属性…

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 &#xff08;一&#xff09;HTML5及其优点 &#xff08;二&#xff09;HTML5在手机上实现视频应用功能的优势 四、手机HTML5…

Micropython的包管理

MicroPython包支持多种管理和安装方式&#xff0c;本文主要mip、mpremote以及手动安装包的方式&#xff0c;另外也会说明下如何发布自己的包。 使用**mip**安装包 mip&#xff08;“mip installs packages”&#xff09;是一个跟Python pip概念类似的工具&#xff0c;但它不使…

【数据结构】循环队列(数组实现)

目录 一、循环队列定义 怎么使一个数组在逻辑上呈“环状”呢&#xff1f; 二、循环队列与顺序队列的差异 1、存储方式: 2、操作方式: 3、空间利用率&#xff1a; 4、循环队列判断队空的方式&#xff1a; 5、循环队列判断队满的方式 完整测试代码及注释&#xff1a; 总…

axure RP9.0安装字体图标库fontawesome

字体图库地址: Font AwesomeThe internets icon library toolkit. Used by millions of designers, devs, & content creators. Open-source. Always free. Always awesome.https://fontawesome.com/v6/download进入后下载想要的版本如我是6.3 下载后得到压缩包,解压之后…

机器学习笔记 - 从2D数据合成3D数据

一、3D 数据简介 人们一致认为,从单一角度合成 3D 数据是人类视觉的一项基本功能,这对计算机视觉算法来说极具挑战性。但随着 LiDAR、RGB-D 相机(RealSense、Kinect)和 3D 扫描仪等 3D 传感器的可用性和价格的提高,3D 采集技术的最新进展取得了巨大飞跃。 与广泛使用的 2D…

数据库中的MVCC--多版本并发控制

一、前言 1、定义&#xff1a;MVCC&#xff08;Multi-Version Concurrency Control&#xff09;&#xff0c;多版本并发控制&#xff0c;主要为了提高数据库 的并发性能。是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式。用于实现提交读和可重 复读这两种隔离级别。 2…

【重点】【单调栈】【循环数组】503.下一个更大元素 II

题目 法1&#xff1a;单调栈循环数组 class Solution {public int[] nextGreaterElements(int[] nums) {int n nums.length;int[] res new int[n];Stack<Integer> stack new Stack<>();for (int i 2 * n - 1; i > 0; --i) { // 循环数组处理!!!while (!st…