STM32之DHT11温湿度传感器---附代码

DHT11简介

在这里插入图片描述
DHT11的供电电压为 3-5.5V。
传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。
电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
DATA 用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,当前小数部分用于以后扩展,现读出为零。
操作流程如下:
一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据 + 8bit湿度小数数据
+8bi温度整数数据 + 8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bit温度整数数据+8bit温度小数数据”所得结果的末8位

在这里插入图片描述

通讯过程(单线双向)

在这里插入图片描述
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号。
主机发送开始信号结束后,延时等待20-40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。
在这里插入图片描述
总线为低电平(80us低电平响应信号),说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据。
每1bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。
格式见下面图示:
数字0信号表示方法
在这里插入图片描述
数字1信号表示方法
在这里插入图片描述
如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后1bit数据传送完毕后,DHT11拉低总线 50us,随后总线由上拉电阻拉高进入空闲状态。

#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"// 位带操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bitnum << 2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))// GPIOA的ODR和IDR寄存器地址
#define GPIOA_ODR_ADDR    (GPIOA_BASE + 12) // GPIOA的输出数据寄存器地址,0x4001080C 
#define GPIOA_IDR_ADDR    (GPIOA_BASE + 8)  // GPIOA的输入数据寄存器地址,0x40010808// 定义PBout和PBin宏
#define PAout(n)   BIT_ADDR(GPIOA_ODR_ADDR, n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_ADDR, n)  //输入 /************************************************************************/#define	DHT11_DQ_OUT PAout(15) //数据端口	PA15 
#define	DHT11_DQ_IN  PAin(15)  //数据端口	PA15#define DHT11_GPIO_PORT    	GPIOA			            //GPIO端口
#define DHT11_GPIO_CLK 	    RCC_APB2Periph_GPIOA		//GPIO端口时钟
#define DHT11_GPIO_PIN		GPIO_Pin_15			        //连接到SCL时钟线的GPIO/************************************************************************/void DHT11_Rst(void);
uint8_t DHT11_Check(void);
uint8_t DHT11_Read_Bit(void);
uint8_t DHT11_Read_Byte(void);
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi);	 
uint8_t DHT11_Init(void);#endif
#include "stm32f10x.h"                  // Device header
#include "DHT11.h"
#include "Delay.h"/*DHT11数据线为输出模式*/
void DHT11_IO_OUT(void)
{RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO时钟和AFIO时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁用JTAG,保留SWDGPIO_InitTypeDef  GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);				
}/*DHT11数据线为输入模式*/
void DHT11_IO_IN(void)
{RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO时钟和AFIO时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁用JTAG,保留SWDGPIO_InitTypeDef  GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}/*复位DHT11传感器*/
void DHT11_Rst(void)	   
{                 DHT11_IO_OUT(); 	//设置输出模式DHT11_DQ_OUT = 0; 	//将数据线拉低,等待DHT11响应Delay_ms(20);    	//拉低至少18ms,保证DHT11能检测到起始信号DHT11_DQ_OUT = 1; 	//将数据线拉高 Delay_us(30);     	//主机拉高20~40us,读取DHT11的响应信号
}/*检查DHT11是否存在*/
//返回1:未检测到DHT11的存在
//返回0:检测到DHT11的存在
uint8_t DHT11_Check(void) 	   
{   uint8_t retry = 0;DHT11_IO_IN(); //设置输入模式 //DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号//DHT11发送响应信号后,再把总线拉高80us,准备发送数据while (DHT11_DQ_IN && retry < 100)	//DHT11会拉低40~80us{retry++;Delay_us(1);};	 if(retry >= 100) return 1;else retry = 0;while (!DHT11_DQ_IN && retry < 100)	//DHT11拉低后会再次拉高40~80us{retry++;Delay_us(1);};if(retry >= 100) return 1;	    return 0;
}/*DHT11读取一个位*/
//返回值:数据位1或0
uint8_t DHT11_Read_Bit(void)
{uint8_t retry = 0;//每1bit数据都以50us低电平时隙开始while(DHT11_DQ_IN && retry < 100)	//等待变为低电平{retry++;Delay_us(1);}retry = 0;while(!DHT11_DQ_IN && retry < 100)	//等待变高电平{retry++;Delay_us(1);}Delay_us(40);	//等待40us//高电平的长短定了数据位是0还是1//26us-28us表示0,70us表示1if(DHT11_DQ_IN) return 1;else return 0;
}/*DHT11读取一个字节*/
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)    
{        uint8_t i,data;data = 0;for (i = 0; i < 8; i++) {data<<=1; data |= DHT11_Read_Bit();}						    return data;
}/*DHT11读取一次数据*/
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)    
{        uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check() == 0){for(i = 0; i < 5; i++)	//读取40位数据{buf[i] = DHT11_Read_Byte();}//数据格式:8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和//8bit校验和 = 8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) //校验数据{*humi = buf[0];*temp = buf[2];}}else return 1;return 0;
}//初始化DHT11的IO口同时检测DHT11是否存在
//返回1:不存在
//返回0:存在    	 
uint8_t DHT11_Init(void)
{	    DHT11_Rst();  //复位DHT11return DHT11_Check();	//等待DHT11的回应
} 

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

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

相关文章

#define STEUER_A_H {PWM_A_ON}

目录 一、括号的区别 二、实例讲解 三、注意事项 四、总结 五、补充 一、括号的区别 大括号 {}: 在 C/C 中&#xff0c;大括号一般用于表示一个代码块或结构体、集合等。例如&#xff1a; 用于定义函数体、控制结构&#xff08;如 if、for&#xff09;的代码块。用于初始化…

Redis 缓存—处理高并发问题

Redis的布隆过滤器、单线程架构、双写一致性、比较穿透、击穿及雪崩、缓存更新方案及分布式锁。 1 布隆过滤器 是一种高效的概率型数据结构&#xff0c;用于判断元素是否存在。主要用于防止缓存穿透&#xff0c;通过拦截不存在的数据查询&#xff0c;避免击穿数据库。 原理&…

【玩转全栈】—— 无敌前端究极动态组件库--Inspira UI

目录 Inspira UI 介绍 配置环境 使用示例 效果&#xff1a; Inspira UI 学习视频&#xff1a; 华丽优雅 | Inspira UI快速上手_哔哩哔哩_bilibili 官网&#xff1a;https://inspira-ui.com/ Inspira UI 介绍 Inspira UI 是一个设计精美、功能丰富的用户界面库&#xff0c;专为…

【OpenCV图像处理实战】从基础操作到工业级应用

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;6个案例&#xff09;案例1&#xff1a;图像基本操作案例2&#xff1a;边缘检测案例3&…

fastjson使用parseObject转换成JSONObject出现将字符特殊字符解析解决

现象&#xff1a;将字符串的${TARGET_VALUE}转换成NULL字符串了问题代码&#xff1a; import com.alibaba.fastjson.JSON;JSONObject config JSON.parseObject(o.toString()); 解决方法&#xff1a; 1.更换fastjson版本 import com.alibaba.fastjson2.JSON;或者使用其他JS…

Docker Compose 和 Kubernetes(k8s)区别

前言&#xff1a;Docker Compose 和 Kubernetes&#xff08;k8s&#xff09;是容器化技术中两个常用的工具&#xff0c;但它们的定位、功能和适用场景有显著区别。以下是两者的核心对比&#xff1a; ​​1. 定位与目标​​ ​​特性​​ ​​Docker Compose​​ ​​Kubernet…

【21天学习打卡挑战赛】如何学习WEB安全:逼自己在短时间掌握WEB安全核心内容

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Oracle数据库巡检脚本

1.查询实例信息 SELECT INST_ID, INSTANCE_NAME, TO_CHAR(STARTUP_TIME, YYYY-MM-DD HH24:MI:SS) AS STARTUP_TIME FROM GV$INSTANCE ORDER BY INST_ID; 2.查看是否归档 archive log list 3.查看数据库参数 SELECT NAME , TYPE , VALUE FROM V$PARAMETER ORDER BY NAME; 4.…

Windows 安装 JDK

下载 Java8 的下载直接访问&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 接受协议后点击下载&#xff0c;再输入账号信息就可以下载了。 如果…

强化学习核心原理及数学框架

1. 定义与核心思想 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;的持续交互来学习最优决策策略的机器学习范式。其核心特征为&#xff1a; ​​试错学习​​&#x…

Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例

前言 Netty是什么&#xff1f; Netty 是一个基于 Java 的 ​高性能异步事件驱动网络应用框架&#xff0c;主要用于快速开发可维护的协议服务器和客户端。它简化了网络编程的复杂性&#xff0c;特别适合构建需要处理海量并发连接、低延迟和高吞吐量的分布式系统。 1)Netty 是…

TIM输入捕获知识部分

越往左&#xff0c;频率越高&#xff1b;越往右&#xff0c;频率越低。【越紧凑&#xff0c;相同时间&#xff0c;次数越多】 计算频率的方法&#xff1a;测评法、测周法、中界频率。 频率的定义&#xff1a;1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…

4.4 记忆机制与上下文管理:短期与长期记忆的设计与应用

记忆机制与上下文管理已成为智能代理&#xff08;Agent&#xff09;系统实现高效、智能化行为的核心技术。记忆机制通过短期记忆&#xff08;Short-Term Memory, STM&#xff09;和长期记忆&#xff08;Long-Term Memory, LTM&#xff09;支持Agent存储、检索和利用信息&#x…

深入了解递归、堆与栈:C#中的内存管理与函数调用

在编程中&#xff0c;理解如何有效地管理内存以及如何控制程序的执行流程是每个开发者必须掌握的基本概念。C#作为一种高级编程语言&#xff0c;其内存管理和函数调用机制包括递归、堆与栈。本文将详细讲解这三者的工作原理、用途以及它们在C#中的实现和应用。 1. 递归 (Recur…

leetcode day 35 01背包问题 416+1049

0-1背包问题 &#xff08;1&#xff09;第一种情况&#xff1a;二维dp[i][j]数组 dp[i][j]表示[0,i]的物品放入容量为j背包的最大价值 不放物品i,dp[i][j]dp[i-1][j] 放物品i,dp[i][j]dp[i-1][j-w[i]]v[i] 递推公式为&#xff1a; dp[i][j]dp[i-1][j];//不放 if(w[i]<j)dp…

算法时代的“摩西十诫”:AI治理平台重构数字戒律

一、引言 数字时代的狂飙突进中&#xff0c;人工智能&#xff08;AI&#xff09;正以颠覆性的力量重塑人类社会。从医疗诊断到金融决策&#xff0c;从智能制造到舆论传播&#xff0c;AI的触角已延伸至每个角落。 然而&#xff0c;斯坦福大学《2024年人工智能指数报告》揭示的…

上岸率85%+,25西电先进材料与纳米科技学院(考研录取情况)

1、先进材料与纳米科技学院各个方向 2、先进材料与纳米科技学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、材料科学与工程25年相较于24年上升10分&#xff0c;为290分 2、材料与化工&#xff08;专硕&#xff09;25年相较于24年下降20分&#xff0c;为…

Tomcat Web应用(Ubuntu 18.04.6 LTS)部署笔记

一、前言 本文与【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安装笔记】和【JDK&#xff08;Ubuntu 18.04.6 LTS&#xff09;安装笔记】同批次&#xff1a;先搭建数据库&#xff0c;再安装JVM&#xff0c;后面就是部署Web应用&#xff1a;典型的单机部署。   本着善…

Datawhale AI春训营——用AI帮助老人点餐

详细内容见官网链接&#xff1a;用AI帮助老人点餐-活动详情 | Datawhale

17.第二阶段x64游戏实战-人工遍历二叉树结构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;16.第二阶段x64游戏实战-分析二叉树结构 上一个内容里把二叉树的结构写了写&am…