STM32外设系列—DHT11

文章标题

  • 一、DHT11简介
  • 二、数据手册分析
    • 2.1 接口说明
    • 2.2 串行通信说明
      • 2.2.1 单总线通信
      • 2.2.2 单总线传输数据位定义
      • 2.2.3 时序图
  • 三、DHT11程序设计
    • 3.1 初始化GPIO
    • 3.2 发送起始信号
    • 3.3 接收一个字节数据
    • 3.4 接收温湿度信息并校准
  • 四、总结

一、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 01010000 00000001 10000000 01000101 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);   // 保持20msOLED_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日

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

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

相关文章

【新星计划·2023】Linux内核、发行版讲解,它们有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、Linux内核版 二、Linux发行版 1、Debian 2、Slackware 3、Red Hat 4、Gentoo 三、内核版和发行版的区别 1、内核版 2、发行…

BUUCTF 还原大师 1

题目描述&#xff1a; 我们得到了一串神秘字符串&#xff1a;TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母&#xff0c;为了确定这个神秘字符串&#xff0c;我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全&#xff0c;E903???4D…

计算机启动

按下主机上的 power 键后&#xff0c;第一个运行的软件是 BIOS,BIOS 全称叫 Base Input & Output System&#xff0c;即基本输入输出系统。 &#xff08;8086的1MB内存&#xff09; 地址 0&#xff5e;0x9FFFF 处是 DRAM&#xff0c;顶部的 0xF0000&#xff5e;0xFFFFF&am…

AR急诊急救大平台远程专家会诊方案

随着AR技术的完善&#xff0c;在医院急救中&#xff0c;需要及时把各方面专家汇在一起会诊&#xff0c;在AR这方面有数据采集清晰&#xff0c;资料呈现方便便捷&#xff0c;针对客户需要&#xff0c;我们对业务需求分析&#xff0c;比较市面多种产品&#xff0c;把会议&#xf…

【OpenCV DNN】Flask 视频监控目标检测教程 10

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 10 3.10 OpenCV DNNFlask实时监控目标检测1、加载MobileNet SSD模型2、导入分类名称文件3、处理视频帧进行目标检测4、新建一个Flask项目5、Python 程序文件6、视频流的网…

如何使用KoodousFinder搜索和分析Android应用程序中的安全威胁

关于KoodousFinder KoodousFinder是一款功能强大的Android应用程序安全工具,在该工具的帮助下,广大研究人员可以轻松对目标Android应用程序执行安全研究和分析任务,并寻找出目标应用程序中潜在的安全威胁和安全漏洞。 账号和API密钥 在使用该工具之前,我们首选需要访问该…

np.averag的运算规则

今天写代码的时候&#xff0c;计算加权平均&#xff0c;一直没有搞懂np.average是怎么运算的&#xff0c;做个笔记记录一下&#xff1a; 创建一个&#xff08;3,4,5&#xff09;维度的np数组&#xff0c;然后在创建一个[1,0.5,1]的权重数组&#xff0c;计算他们的加权平均&…

6月人工智能论文推荐

Prompt Space Optimizing Few-shot Reasoning Success with Large Language Models https://arxiv.org/abs/2306.03799 Prompt engineering 是通过提供明确和具体的指令来增强大型语言模型(llm)能力的基本技术。它使LLM能够在各种任务中脱颖而出&#xff0c;例如算术推理、问…

RTMPose

RTMPose 1. 人体姿态估计简介2. RTMPose2.1 网络结构2.2 基于SimCC的优化路线2.2.1 SimCC&#xff1a;2.2.2 RTMPose 1. 人体姿态估计简介 多人姿态估计框架包括5个方面&#xff1a; paradigm&#xff1a;范式 top-down&#xff1a; 用于人数不多于6人的场景使用现成的检测器提…

Android Studio 配置 DCL 单例脚本

DCL&#xff08;Double-Checked Locking&#xff09;单例是一种用于创建单例对象的设计模式。单例模式是一种创建型模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。 DCL单例的核心思想是使用双重检查来保证只有在需要时才对实例进行实例化。它结合…

Nginx服务器的六个修改小实验

一、Nginx虚拟主机配置 1.基于域名 &#xff08;1&#xff09;为虚拟主机提供域名解析 配置DNS 修改/etc/hosts文件 &#xff08;2&#xff09;为虚拟主机准备网页文档 #创建网页目录 mkdir -p /var/www/html/abc mkdir -p /var/www/html/def ​ #编写简易首页html文件 ec…

MySQL 字符集与比较规则

字符集与比较规则 一. 字符集相关操作1. 查看字符集1.1 查看数据库当前字符集配置1.2 查看某数据库/数据表字符集 2. 修改字符集2.1 全局修改字符集2.2 修改已有库表字符集 3. 字符集级别二. 比较规则1.1 后缀表示含义1.2 查看指定数据集比较规则1.3 查看/修改数据库/表比较规则…