STM32外设系列—DHT11

2023-11-08

本文程序暂时存在问题,显示的温湿度不正确,如有急需,可私信。

一、DHT11简介

DHT11是一款常用的数字温湿度传感器。传感器包括一个电容式感湿元件和一个 NTC 测温元件,能够测量皱纹环境的温湿度,常用于暖通空调、除湿器、农业、冷链仓储等方面。
DHT11

二、数据手册分析

2.1 接口说明

DHT11接口说明

2.2 串行通信说明

DHT11通过串行通信的方式,将采集到的环境温湿度信息传递给单片机。数据手册中,针对DHT11的串行通信做了详细介绍。

2.2.1 单总线通信

DHT11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口连至数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 4.7kΩ 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

2.2.2 单总线传输数据位定义

DHT11的DATA引脚,用于单片机与 DHT11 之间的通讯和同步,采用单总线数据格式,一次传送 40 位数据,高位先出。数据格式

8bit 湿度整数数据 + 8bit 湿度小数数据 + 8bit 温度整数数据 + 8bit 温度小数数据 + 8bit 校验位

数据手册中写明,湿度的小数部分为0。8bit 校验位等于所得结果的末 8 位。
单总线格式定义
对于校验位,数据手册中举例说明。比如接收到的40位数据为

0011 0101 0000 0000 0001 1000 0000 0100 0101 0001
湿度高8位 湿度低8位 温度高8位 温度低8位 校验位

计算 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 + 0101 0001 = 0101 0001,与接收到的校验位相等,校验通过。如果校验不通过,则将此次接收到的数据丢弃,重新接收数据。

2.2.3 时序图

根据上面的介绍,如果单片机想要读取数据,需要先发送一个起始信号。起始信号需要拉低数据线至少18ms。
起始信号

DHT11检测到起始信号之后,等待起始信号低电平结束,然后输出应答信号。应答信号是先将数据线拉低83us,再拉高87us。

应答信号

然后DHT11就开始输出数据了,“0”和“1”的时序图如下

“0”和“1”的时序图

总时序图如下

总时序图

三、DHT11程序设计

3.1 初始化GPIO

根据上面的介绍,STM32的GPIO既需要用作输出,也需要用作输入。因此,STM32的GPIO需要有两种配置

/*
 *==============================================================================
 *函数名称:Drv_Dht11_Gpio_OutInSet
 *函数功能:DHT11引脚输出/输入设置
 *输入参数:state:OUT:输出(0);IN:输入(1)
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Drv_Dht11_Gpio_OutInSet (u8 state)
{
	// 结构体定义
 	GPIO_InitTypeDef  GPIO_InitStructure;
	
	// 开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// 初始化GPIO结构体
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	if (state)
	{
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入
	}
	else
	{
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出
	}
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

.h文件添加下面程序

// GPIO模式
#define OUT   0   // 输出模式
#define IN    1   // 输入模式

3.2 发送起始信号

单片机的 I/O 设置为输出同时输出低电平,且低电平保持时间不能小于 18ms(最大不得超过 30ms),然后单片机的 I/O 设置为输入状态,由于上拉电阻,单片机器的 I/O 即 DHT11 的 DATA 数据线也随之变高,等待 DHT11 作出回答信号。程序设计如下

/*
 *==============================================================================
 *函数名称:Drv_Dht11_Start
 *函数功能:向DHT11发送起始信号
 *输入参数:state:OUT:输出(0);IN:输入(1)
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Drv_Dht11_Start (void)
{
	OLED_SDA_Set();   // 拉高一小段时间
	delay_us(30);
	
	Drv_Dht11_Gpio_OutInSet(OUT);   // GPIO配置为输出模式
	OLED_SDA_Clr();   // 拉低数据线
	delay_ms(20);   // 保持20ms
	
	OLED_SDA_Set();   // 拉高一小段时间
	delay_us(30);
	
	Drv_Dht11_Gpio_OutInSet(IN);   // GPIO配置为输入模式
}

3.3 接收一个字节数据

/*
 *==============================================================================
 *函数名称:Med_Dht11_ReceOneByte
 *函数功能:接收一帧数据
 *输入参数:无
 *返回值:一字节接收数据
 *备  注:无
 *==============================================================================
 */
u8 Med_Dht11_ReceOneByte (void)
{
	u8 tempVar = 0;   // 临时循环变量
	u8 receData = 0;   // 接收数据
	
	for (tempVar = 0;tempVar < 8;tempVar ++)
	{
		while (!DHT11_SDA_DATA);   // 等待54us的低电平过去
		delay_us(30);   // 延时30us之后判断是0还是1
		
		// 如果30us之后依旧为高电平
		if (DHT11_SDA_DATA)
		{
			receData |= 1;   // 接收数据为1
		}
		while (DHT11_SDA_DATA);   // 等待高电平过去
		
		receData <<= 1;   // 左移
	}
	
	return receData;
}

3.4 接收温湿度信息并校准

/*
 *==============================================================================
 *函数名称:App_Dht11_Result_Process
 *函数功能:处理接收结果,得出正确的温湿度信息
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u8 receData[4];   // 存储温湿度结果
void App_Dht11_Result_Process (void)
{
	u8 receCheck = 0;   // 接收到的校验码
	u8 tempCal = 0;   // 临时计算变量
	
	Drv_Dht11_Start();   // 发送一个起始信号
	DHT11_SDA_Set();   // 拉高SDA
	
	// 等待应答信号
	if (!DHT11_SDA_DATA)
	{
		while (!DHT11_SDA_DATA);   // 等待83us低电平结束
		while (DHT11_SDA_DATA);   // 等待87us高电平结束
		
		// 开始接收数据
		receData[0] = Med_Dht11_ReceOneByte();   // 湿度整数
		receData[1] = Med_Dht11_ReceOneByte();   // 湿度小数
		receData[2] = Med_Dht11_ReceOneByte();   // 温度整数
		receData[3] = Med_Dht11_ReceOneByte();   // 温度小数
		receCheck = Med_Dht11_ReceOneByte();   // 校验码
		
		tempCal = receData[0] + receData[1] + receData[2] + receData[3];
		
		// 如果校验失败
		if (tempCal != receCheck)
		{
			// 清空接收
			receData[0] = receData[1] = receData[2] = receData[3] = 0;
		}
	}
}

四、总结

实际上面的程序设计有一些不足,比如某些地方不需要再拉高SDA线,在等到时使用了while语句但是没有超时检测。但是由于博主的DHT11坏了,目前买的新的还没到,无法继续调试,因此这里说明一下。后续会修改完善程序,补充应用实例。——2023年6月26日

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32外设系列—DHT11 的相关文章

  • C++之extern和static用法和区别

    目录 声明和定义的区别 关键字extern 作用 用法总结 关键字static 全局变量和全局静态变量区别 局部静态变量 静态函数 声明和定义的区别 变量定义 用于为变量分配存储空间 还可为变量指定初始值 程序中 变量有且仅有一个定义 变量
  • C语言读取写入CSV文件基础入门篇

    什么是CSV 大量C语言项目课设 小游戏源码 压 缩 包 免 费 下 载 链 接 如 下 c语言项目课设小游戏源码资料压缩包 zip C文档类资源 CSDN下载c语言项目课设小游戏源码资料压缩包 zipc语言项目课设小游戏源码资料压缩包 z

随机推荐

  • 数据驱动的数字化转型:从流程驱动到数据驱动

    以下文章来源于凯哥讲故事系列 作者凯哥 数字化时代已经到来 1996年的时候 Being Digital 的作者Negroponte就提出数字化生活的概念 而20年以后的今天 我们已经进入了数字化的生活 移动互联网 物联网 手机 各种社交媒
  • 刷脸支付无一例外地建构与完善起来

    刷脸支付均采用的是3D人脸识别技术 这种技术具有一项至关重要的功能 活体检测 即系统摄像头在识别人脸是否为本人的同时 还能检验是否有人利用照片等手段冒充用户 由此封闭了假体攻击的空间 正如支付工具的迭代总是高出人们的预估一样 技术的进化对于
  • 小程序配置网络请求@escook/request-miniprogram

    由于平台限制 小程序项目不支持axios 原生wx request API功能较为简单 不支持拦截器等功能 所以使用 escook request miniprogram第三方包发起网络数据请求 配置步骤 官方文档 https www np
  • 浅谈.NET语言开发应用领域

    NET语言是一种跨平台的开发框架 适用于各种应用程序的开发 以下是一些常见的 NET语言开发应用领域 桌面应用程序开发 使用 NET框架开发的桌面应用程序可以在Windows操作系统上运行 包括Windows Forms和WPF 这些应用程
  • 智能指针之weak_ptr06

    一 weak ptr 看名字就知道 他是一个弱引用 他的存在是为了辅助shared ptr的循环引用问题 它不占用引用数 只能通过shared ptr或者weak ptr构造赋值 它没有重载 和 gt 运算符 因此不可以直接通过 weak
  • hvv 文件上传和文件包含考点

    天眼如何判断文件上传漏洞是否成功 数据包分析 观察客户端请求数据 是否包含webshell流量特征 观察服务器返回信息 是否有 上传成功 或 success upload 等信息提示 尝试寻找上传的文件 访问上传的文件看是否存在 查看文件上
  • Java的数据类型及变量

    一 变量 内存存储的是运行中程序的数据 eg 我有10块钱 买早餐花了6元 问我现在还有多钱 计算机 1 存储数据 2 CPU取出来 参与运算 3 结果更新内存 变量的本质 内存中的一个存储空间 另一种说法 程序运行过程中 其值可以发生改变
  • Java定时任务技术分析

    从零打造项目 系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实
  • 商汤提出解偶检测中分类和定位分支的新方法TSD,COCO 51.2mAP

    目前很多研究表明目标检测中的分类分支和定位分支存在较大的偏差 论文从sibling head改造入手 跳出常规的优化方向 提出TSD方法解决混合任务带来的内在冲突 从主干的proposal中学习不同的task aware proposal
  • IPD简介

    目录 IPD是什么 IPD流程 做正确的事 1 市场调研 2 需求管理 正确地做事 第一阶段 概念阶段 第二阶段 计划阶段 第三阶段 开发阶段 第四阶段 验证阶段 第五阶段 发布阶段 第六阶段 生命周期阶段 IPD与项目管理 项目管理 IP
  • 全程软件测试(十三):静态百盒测试-代码检查/走查——读书笔记

    代码检查与走查是人工测试的两种主要方式 本次主要介绍两种方式的相似点 不同点将在后面详细介绍 两种方式的相似点如下 1 二者均需要建立小组来研读特定程序 使用这两种方式的参与者都需要完成准备工作 准备工作是参加 头脑风暴 会议 会议的主旨是
  • uni-app 环境配置,uni.request封装,接口配置,全局配置,接口调用的封装

    1 环境配置 可参考uni 官网的环境配置 common文件夹下新建config js let url config if process env NODE ENV development 开发环境 url config https com
  • Mybatis-Plus高级查询LambdaQueryWrapper&QueryWrapper

    目录 前言 Wrapper 查询构造器 查询条件 前期准备 查询条件 allEq eq ne gt ge lt le between notBetween like notLike likeLeft likeRight isNull 空值查
  • Python3 使用psycopg2模块 批量写入数据到PostgreSQL数据库(最强输出速度,单机数据库3000W数据写入最多180秒)

    Python3 使用psycopg2模块 批量写入数据到PostgreSQL数据库 最强输出速度 单机数据库3000W数据写入最多180秒 1 本文知识点 1 将string或者list类型的数据转换为IO缓冲区中的str类型 指定格式 2
  • C++中对象创建与释放

    创建对象有以下四种形式 include
  • 一毛一条的接码平台_搭建一套基于 Groovy 规则引擎的业务风控平台

    黑灰产在互联网领域盛行 从反面推动了业务安全反欺诈领域的快速发展 互联网SAAS服务产品响应市场不断创新 也决定了业务风险的多样性 笔者所在财税领域常见的非财税业务互联网风控场景包括登陆注册 短信接口 营销活动 渠道引流推广 交易和支付等
  • 程序员如何逆袭,达到财富自由?

    程序员逆袭达到财富自由有以下几条路 1 加入独角兽公司 拿到大量期权 并坚守到上市套现 2 找到靠谱的创业公司和诚信的创始人 拿到百分比左右的股份 坚守到出售或者上市 3 通过技术创业 公司出售或者上市 4 建立影响力 通过技术咨询 自媒体
  • 目标检测中的MAP(无抄袭)

    个人理解 如果写的有问题可以留言交流 转载请标明出处 谢谢 参考链接 内含代码 https github com rafaelpadilla Object Detection Metrics 人家写的比我好 我只是用中文把理论小总结一下 懒
  • Transformer综述1——《A Survey on Visual Transformer》

    A Survey on Visual Transformer 摘要 将视觉Transformer应用到不同的任务中 分析优缺点 回顾自注意力机制 背景介绍 多层感知和全连接层是经典的神经网络 有多线性层和非线性激活函数 卷积神经网络引入卷积
  • STM32外设系列—DHT11

    本文程序暂时存在问题 显示的温湿度不正确 如有急需 可私信 文章标题 一 DHT11简介 二 数据手册分析 2 1 接口说明 2 2 串行通信说明 2 2 1 单总线通信 2 2 2 单总线传输数据位定义 2 2 3 时序图 三 DHT11