普中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);   // 参考初始化时序图, 延时480us

	SENSOR_DS18B20_SetPinInput(DS18B20_PORT, DS18B20_PIN);    // set the pin as input
	delay_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);  // 等待60us

			SENSOR_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 ROM
	SENSOR_DS18B20_Write (0x44);  // convert t
	HAL_Delay (800); // 12bit分辨率最长转换时间750ms

	SENSOR_DS18B20_Reset ();
	HAL_Delay (1);
	SENSOR_DS18B20_Write (0xCC);  // skip ROM
	SENSOR_DS18B20_Write (0xBE);  // 读值指令
	
	lsb_byte = SENSOR_DS18B20_Read(); // LSB
	msb_byte = SENSOR_DS18B20_Read(); // MSB
	temp = 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引脚实现跑马灯)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 知识点

ping ping 不能带协议&#xff0c;如&#xff1a;ping baidu.com 引入包顺序 分三级&#xff0c;第一级是 Python 的内置库&#xff0c;第二级是第三方库&#xff0c;第三级是自己的代码。每一级用一个空行间隔 运算符 keyError&#xff1a;key不存在 列表推导式 创建字典 字…

华芯微特|MCU之TIMER输入捕获

引言 华芯微特公司SWM系列单片机提供的TIMER个数和功能有些微差别&#xff0c;为了让您更加简单的使用这一功能&#xff0c;下面小编将以SWM190为例&#xff0c;我们今天详细讲解一下TIMER的输入捕获功能。 TIMER输入捕获 一、TIMER定时器之输入捕获功能 我们今天详细讲解一下…

网络安全—SSL安全访问应用

文章目录 网络拓扑部署CA服务器颁发证书开启Web服务安装IIS服务修改Web默认网页 申请Web证书前提准备申请文件生成申请web证书开始安装web证书 客户机访问web默认网站使用HTTP使用HTTPS 为客户机安装浏览器证书 环境&#xff1a;Windows Server 2003 网络拓扑 这里使用NAT还是…

输入输出流

1.输入输出流 输入/输出流类&#xff1a;iostream---------i input&#xff08;输入&#xff09; o output&#xff08;输出&#xff09; stream&#xff1a;流 iostream&#xff1a; istream类&#xff1a;输入流类-------------cin&#xff1a;输入流类的对象 ostream类…

潮玩宇宙大逃杀游戏搭建

潮玩宇宙是当下较火的社交互动平台&#xff0c;它不仅涵盖了各种潮玩商品&#xff0c;还拥有各种游戏玩法&#xff0c;尤其是大逃杀游戏非常火爆&#xff01;本文将介绍大逃杀游戏的开发和发展前景。 大逃杀游戏 大逃杀游戏是当下的一种新型游戏模式&#xff0c;旨在为玩家提供…

python django 生鲜商城管理系统

python django 生鲜商城管理系统,包含用户端和管理端 功能&#xff1a; 用户端&#xff1a;商城主页展示&#xff0c;登录&#xff0c;注册&#xff0c;用户中心&#xff0c;购物车&#xff0c;我的订单&#xff0c;购物车结算 管理端&#xff1a;登录&#xff0c;商品&…

[C#]使用纯opencvsharp部署yolov8-onnx图像分类模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

【设计模式】二十一.行为型模式之状态模式

状态模式 一. 说明 状态模式通常描述一个类不同行为的多个状态变更&#xff0c;对象的行为依赖它的状态&#xff0c;它是一种行为型模式。 状态模式可以用来消除代码中大量的if-else结构&#xff0c;它明确对象是有状态的、对象的不同状态对应的行为不一样、行为之间是可以切…

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息

场景 Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中&#xff1a; Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中-CSDN博客 Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作&#xff1a; Wi…

计算机基础面试题 |08.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

前端框架中的状态管理(State Management)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【算法每日一练]-dfs bfs(保姆级教程 篇8 )#01迷宫 #血色先锋队 #求先序排列 #取数游戏 #数的划分

目录 今日知识点&#xff1a; 使用并查集映射点&#xff0c;构造迷宫的连通块 vis计时数组要同步当回合的处理 递归求先序排列 基于不相邻的取数问题&#xff1a;dfs回溯 n个相同球放入k个相同盒子&#xff1a;dfs的优化分支暴力 01迷宫 血色先锋队 求先序排列 取数游…

【ikbp】数据可视化DataV

天天查询一些数据&#xff0c;希望来一个托拉拽的展示&#xff0c;部署体验一下可视化大屏 快速搭建快速查询实时更新简单易用 启动服务 数据可视化 静态查询 配置数据 过滤数据 分享

计算机网络—网络搭建NAT内外网映射

使用Windows Server 2003 网络拓扑 Router 外网&#xff1a;NAT IP 网段 192.168.17.0/24内网&#xff1a;仅主机模式 IP 172.16.29.4 Client1&#xff1a;仅主机模式 IP 172.16.29.2 网关 172.16.29.1 Client2&#xff1a;仅主机模式 IP 172.16.29.3 网关 172.16.29.1…

数字信号处理期末复习——计算小题(二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

uni-app中实现元素拖动

uni-app中实现元素拖动 1、代码示例 <template><movable-area class"music-layout"><movable-view class"img-layout" :x"x" :y"y" direction"all"><img :src"musicDetail.bgUrl" :class&…

SpringBoot实现Websocket聊天交友微信小程序(一)

记录一下我开发一个交友微信小程序并且上线运营的心得体会。 2022年10月1日上线的&#xff0c;到目前终于实现每天收益300左右。 界面比较简洁&#xff0c;功能有动态&#xff0c;动态可以选择话题&#xff0c;相册&#xff0c;相册可以设置看广告解锁&#xff0c;私信&#…

Kubernetes-网络

一. 前言 flannel两种容器跨主机通信的方案&#xff0c;其中UDP模式是IP in UDP&#xff0c;即三层报文封装在UDP数据包中通信&#xff1b;而vxlan模式则是MAC in UDP&#xff0c;即二层报文封装在UDP数据包中通信 flannel UDP模式和vxlan模式都对数据包做了封解包&#xff0c…

59.网游逆向分析与插件开发-游戏增加自动化助手接口-文字资源读取类的C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏菜单文字资源读取的逆向分析-CSDN博客 之前的内容&#xff1a;接管游戏的自动药水设定功能-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fing…

2 Windows网络编程

1 基础概念 1.1 socket概念 Socket 的原意是“插座”&#xff0c;在计算机通信领域&#xff0c;socket 被翻译为“套接字”&#xff0c;它是计算机之间进行通信的一种约定或一种方式。Socket本质上是一个抽象层&#xff0c;它是一组用于网络通信的API&#xff0c;包括了一系列…