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

news2024/11/28 8:43:24

简介

主芯片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引脚实现跑马灯)

结语

在网上看到一种利用串口单线半双工原理读取数据 的, 也是很有意思(未试验过)。。。

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

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

相关文章

[大厂实践] 重新发明后端子集

子集算法有助于优化服务间连接利用率&#xff0c;降低资源使用。但随机或轮询子集算法在动态拓扑环境中会造成较高的连接扰动。本文介绍了谷歌在解决连接扰动方面所做的思考和实践&#xff0c;并介绍了当前最新的Rocksteadier子集算法。原文: Reinventing Backend Subsetting a…

算法的复杂度分析

[王有志](https://www.yuque.com/wangyouzhi-u3woi/dfhnl0/hqrch62un0cc9sp2?singleDoc# 《&#x1f525;快来关注我》)&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;[共同富裕的Java人](https://www.yuque.com/wangyouzhi-u3woi/dfhnl0/n…

pytorch集智-2单车预测器

完整代码在个人主页简介链接pytorch路径下可找到 1 单车预测器1.0 1.1 人工神经元 对于sigmoid函数来说&#xff0c;w控制函数曲线的方向&#xff0c;b控制曲线水平方向位移&#xff0c;w控制曲线在y方向的幅度 1.2 多个人工神经元 模型如下 数学上可证&#xff0c;有限神经…

前端ui库搜集

涟漪动画效果 - MDUI 开发文档, Material Design 前端框架添加涟漪动画效果后&#xff0c;会在点击元素时&#xff0c;产生向外扩散的水波纹效果。https://www.mdui.org/docs/ripple#ripple https://semantic-ui.com/ https://getuikit.com/ https://www.purecss.cn/grids.htm…

iview table 表格合并行鼠标悬停时的高亮

背景&#xff1a; Iview里面的表格没有提供鼠标移入移出的事件。 而且当开启鼠标悬浮高亮的时候会显示异常&#xff0c;并没有高亮合并后的整行&#xff0c;还是高亮子行。 高亮前&#xff1a; 高亮异常情况&#xff1a; 解决后&#xff1a; 解决方案&#xff1a; 一、思路&…

第6章 密码学和对称密钥算法

6.1 密码学基本知识 6.1.1 密码学的目标 安全从业者可借助密码系统实现4个基本目标&#xff1a;保密性、完整性、身份认证和不可否认性。 其中每个目标的实现都需要满足诸多设计要求&#xff0c;而且并非所有密码系统都是为达到所有4个目标而设计的。 下面的小节将详细讲解这…

我的剑,传给能挥舞它的人--量化书籍推荐!

这篇笔记介绍量化入门的参考书目。 前1/4叹为观止&#xff0c;再1/4勉强点赞&#xff0c;再1/4乏善可陈&#xff0c;最后1/4简直不忍卒读。这是我对某本名书的评价&#xff0c;希望你并不会将这句话还给我。“不会的”&#xff0c;我安慰自己。不是文章多好&#xff0c;但你们…

云卷云舒:【实战篇】对象存储迁移

云卷云舒&#xff1a;【实战篇】MySQL迁移-CSDN博客 1. 简介 对象存储与块存储、文件存储并列为云计算三大存储模型。提供海量存储空间服务&#xff0c;具备快速的数据存取性能、高可靠和数据安全性&#xff0c;通过标准的RESTful API接口和丰富的SDK包来提供服务&#xff0c…

基于SSM的校内信息服务发布系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

uniapp 微信小程序跳转至其他小程序

一、背景&#xff1a; 需要在目前的小程序中跳转到另一个小程序&#xff0c;跳转的目标小程序需要已经发布上线了 二、具体实现 使用uni.navigateToMiniProgram打开另一个小程序 官网指引&#x1f449;&#xff1a;uni.navigateToMiniProgram(OBJECT) | uni-app官网 <t…

RA8900CE汽车用c总线接口实时时钟模块

汽车用c总线接口实时时钟模块内置调频32.768 kHz晶体单元和DTCXO&#xff0c;高稳定性和电源切换。 接口类型我 2C-Bus接口(400kHz)界面电压范围2.5V ~ 5.5V温度补偿电压范围2.0V至5.5V计时电压范围1.6V ~ 5.5V可选时钟输出(32.768 kHz, 1024 Hz, 1 Hz)各种功能齐全的日历、报…

css3 transform:scale

transform:scale 语法&#xff1a;transform:scale(x,y); <html> <head><style>.box1 {display: inline-block;width: 200px;height: 200px;background-color: pink;}.box2 {display: inline-block;width: 200px;height: 200px;background-color: red;tran…

第85讲:MySQLDump与Binlog日志实现企业级数据备份恢复案例

文章目录 1.企业级数据备份恢复案例描述2.第一环节&#xff1a;周三凌晨进行数据全量备份3.第二环节&#xff1a;模拟周三凌晨备份完之后到下午3点前的业务操作4.第三环节&#xff1a;模拟数据库异常数据丢失导致平台无法使用5.第四环节&#xff1a;发布停服公告全员进入数据恢…

计算机组成原理 I/O方式

I/O 方式 I/O方式分类: 程序查询方式。由 CPU通过程序不断查询 /O 设备是否已做好准备&#xff0c;从而控制0 设备与主机交换信息程序中断方式。只在 I/0 设备准备就绪并向 CPU发出中断请求时才予以响应。DMA方式。主存和 I/O 设备之间有一条直接数据通路&#xff0c;当主存和…

什么是IT安全(Information Technology Security)?它的价值如何体现

文章目录 一、IT安全名词解释二、IT安全面临的威胁三、IT安全的类型3.1 网络安全3.2 系统安全3.3 应用安全3.4 数据安全3.5 用户安全3.6 物理安全3.7 安全管理 四、IT 安全和信息安全 ( InfoSec )之间有什么区别&#xff1f;IT安全信息安全&#xff08;InfoSec&#xff09; 五、…

湖南大学-计算机网路-2023期末考试【部分原题回忆】

前言 计算机网络第一门考&#xff0c;而且没考好&#xff0c;回忆起来的原题不多。 这门学科学的最认真&#xff0c;复习的最久&#xff0c;考的最差。 教材使用这本书&#xff1a; 简答题&#xff08;6*530分&#xff09; MTU和MSS分别是什么&#xff0c;联系是什么&#x…

内外网文件交换系统实用技巧揭秘:安全、效率、便捷一个不少

内外网文件交换系统是一种专门设计用于在企业内部网络&#xff08;内网&#xff09;与外部网络&#xff08;外网&#xff09;之间安全传输文件的技术解决方案。在企业环境中&#xff0c;出于安全考虑&#xff0c;内部网络通常与外部网络隔离&#xff0c;以防止未经授权的访问和…

Nacos 学习之系列文章

系列文章目录 目录 系列文章目录 文章目录 前言 一、Nacos是什么&#xff1f; 二、Nacos的主要功能 服务发现和服务健康监测 动态配置服务 动态 DNS 服务 三、Nacos 地图 四、Nacos 生态图 总结 前言 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Naco…

MATLAB根据数据拟合曲线

MATLAB根据数据拟合曲线 MATLAB根据数据拟合曲线视频观看 MATLAB根据数据拟合曲线 x1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,6…

测试分类篇

小王学习录 测试分类按测试对象划分1. 界面测试2. 可靠性测试3. 容错性测试4. 文档测试5. 兼容性测试6. 易用性测试7. 安装卸载测试8. 安全测试9. 性能测试10. 内存泄露测试 按是否查看代码划分1. 黑盒测试2. 白盒测试3. 灰盒测试 按开发阶段分1. 单元测试2. 集成测试3. 系统测…