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

news/2024/11/30 5:42:21/

简介

主芯片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.ppmy.cn/news/1290604.html

相关文章

Python----matplotlib库

目录 plt库的字体&#xff1a; plt的操作绘图函数&#xff1a; plt.figure(figsizeNone, facecolorNone): plt.subplot(nrows, ncols, plot_number)&#xff1a; plt.axes(rect)&#xff1a; plt.subplots_adjust(): plt的读取和显示相关函数&#xff1a; plt库的基础图…

运行时错误‘53’文件未找到:MathPage.WLL,安装MathType后Word不能复制粘贴问题的解决

两步解决&#xff1a; 1. 打开Word-->文件-->选项-->信任中心-->信任中心设置-->受信任位置&#xff0c;解决宏问题 添加如下受信任位置&#xff0c; 我的路径&#xff1a;C:\Program Files\Microsoft Office\root\Office16\STARTUP\ 2. 找到MathType下的MathT…

计算机系统基础

C 语言相关内容省略&#xff0c;复习自用&#xff0c;仅供参考~ 概述 冯诺伊曼结构 存储程序工作方式&#xff1a;将事先编好的程序和原始数据送入主存后才能执行程序&#xff0c;程序被启动执行后&#xff0c;计算机能在不需要操作人员干预下自动完成逐条指令取出和执行的任…

ElasticSearch数据同步

文章目录 ElasticSearch数据同步1. 同步调用2. 异步通知3. 监听binlog4. 工作中处理同步的问题 ElasticSearch数据同步 ElasticSearch中酒店数据来自于mysql数据库&#xff0c;因此MySQL数据发生改变时&#xff0c;ElasticSearch也必须跟着改变&#xff0c;这个就是ElasticSear…

61.本地缓存加载与使用实践

文章目录 一、本地缓存理论最佳实践二、Go代码实践&#xff1a;1、本地缓存设计2、本地缓存加载 代码地址&#xff1a;https://gitee.com/lymgoforIT/golang-trick/tree/master/37-load-local-cache 一、本地缓存理论最佳实践 控制缓存大小&#xff1a;根据应用程序的需求和可…

c# 编程点滴--元组

1. 元组 Tuple 是 C# 中表示元组&#xff08;Tuple&#xff09;的数据结构。元组是一个用于存储一组有序元素的数据结构&#xff0c;每个元素可以是不同类型的数据。在 C# 中&#xff0c;元组是值类型&#xff0c;允许存储多个值&#xff0c;并且可以通过索引或者具名字段访问…

力扣hot100 翻转二叉树 递归

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f60b; AC code /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNod…

CCNP课程实验-05-Comprehensive_Experiment

目录 实验条件网络拓朴 基础配置实现IGP需求&#xff1a;1. 根据拓扑所示&#xff0c;配置OSPF和EIGRP2. 在R3上增加一个网段&#xff1a;33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP&#xff0c;并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为666&…