数字温湿度传感器DHT11模块
1. 数字温湿度传感器DHT11
接口:建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻。
2. 数字温湿度传感器模块DHT11实物、原理图
2.模块说明
2.1 DHT11产品概述
- DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。
- 传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
- 单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
2.2 订货信息:
型号 | 测量范围 | 测湿精度 | 测温精度 | 分辨力 | 封装 |
DHT11 | 20-90%RH 0-50℃ | ±5%RH | ±2℃ | 1 | 4 针单排直插 |
2.3 性能参数
2.4 电源引脚
DHT11的供电电压为3-5.5V。传感器上电后,要等待1s 以越过不稳定状态,在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
2.5 串行接口(单线双向)
2.5.1 单总线工作原理:DATA 输出线用于单片机与DHT11之间的通讯,一次通讯时间4ms左右;单片机发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取数据,采集数据后转换到低速模式;如果没有接收到主机发送的开始信号,DHT11不会主动进行温湿度采集。
2.5.2 数据格式:
- 一次完整的数据传输为40bit,高位先出;
- 数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验;
- DHT11数据分小数部分和整数部分,当前小数部分用于以后扩展,现读出为零; 测量分辨率分别为8bit(温度)、8bit(湿度)。
- 数据传送正确时校验位等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”之和;
2.5.3 开始信号与响应信号
开始信号:由于上拉电阻,总线空闲状态为高电平,主机发出开始信号,把总线拉低大于18ms,拉高电平延时等待20-40us后, 读取DHT11的响应信号;
响应信号:DHT11接收到主机的开始信号后,等待主机开始信号结束,发送80us低电平响应信号,再把总线拉高80us;主机发送开始信号结束后,可以切换到输入模式,总线由上拉电阻拉高或者输出高电平均可。
2.5.4 数据信号与结束信号
数据信号:每一bit数据都以50us低电平开始,高电平的长短决定数据位是0还是1,如下图所示:
结束信号:当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
3.STM32程序与显示结果
//主函数
#include <stdio.h>
#include "stm32f10x.h"
//#include "bsp_led.h"
#include "bsp_usart.h"
#include "bsp_rccclkconfig.h"
#include "dht11.h"
#include "bsp_systick.h"extern uint8_t dat[5];/*** @brief 主函数* @param 无 * @retval 无*/
int main(void)
{ USART_Config();HSE_SetSysClk( RCC_PLLMul_6 );printf( "串口printf函数测试\n" );while (1){if(DHT_Read())printf("湿度:%d%%,温度:%d度\r\n",dat[0],dat[2]);SysTick_Delay_ms(3000);}
}
/*********************************************END OF FILE**********************/
//dht11.c程序
#include "dht11.h"
#include "bsp_systick.h"uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00};
uint8_t sum=0;//初始化为输出
void DHT11_GPIO_OUT(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//初始化为输入
void DHT11_GPIO_IN(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure);
}//读一个字节
uint8_t DHT_Read_Byte(void)
{uint8_t temp;uint8_t ReadDat=0;uint8_t retry = 0; uint8_t i;for(i=0;i<8;i++){//数据信号低电平50uswhile(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100){ SysTick_Delay_us(1);retry++; }retry=0;SysTick_Delay_us(30);temp=0;//数字信号0,temp=0//数字0信号高电平持续28us,数字1信号高电平70us,延时30us以确认数字0或1if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1) temp=1; while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//数字1信号高电平剩余40us{ SysTick_Delay_us(1);retry++;}retry=0;ReadDat<<=1;ReadDat|=temp;} return ReadDat;
}uint8_t DHT_Read(void)
{uint8_t i;uint8_t retry = 0;//主机设置为输出,发送开始信号低电平18ms,高电平40usDHT11_GPIO_OUT();GPIO_ResetBits(GPIOB,GPIO_Pin_14);SysTick_Delay_ms(18);GPIO_SetBits(GPIOB,GPIO_Pin_14);SysTick_Delay_us(40);//主机设置为输入,检查并接收响应信号低电平80us,高电平80usDHT11_GPIO_IN();SysTick_Delay_us(20);//延时20us,低电平80us,还剩60us,检查是否是低电平以确定是否有响应信号if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0){while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us{SysTick_Delay_us(1);retry++; }retry=0;//超过100us自动向下运行,以免卡死while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1&&retry<100)//接收响应信号高电平80us{SysTick_Delay_us(1);retry++; }retry=0;//接收8字节数据for(i=0;i<5;i++){dat[i]=DHT_Read_Byte();}SysTick_Delay_us(50);//DHT11拉低总线50us作为结束信号,或者使用以下语句// while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0&&retry<100)//接收响应信号低电平剩余60us
// {
// SysTick_Delay_us(1);
// retry++;
// }
// retry=0;}sum=dat[0]+dat[1]+dat[2]+dat[3];if(dat[4]==sum){return 1;}elsereturn 0;
}
//dth11.h程序
#ifndef __DHT11_H
#define __DHT11_H#include "stm32f10x.h"void DHT11_GPIO_OUT(void);
void DHT11_GPIO_IN(void);
uint8_t DHT_Read_Byte(void);
uint8_t DHT_Read(void);#endif
//延时.c函数
#include "bsp_systick.h"#if 0
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ // 判断 tick 的值是否大于 2^24,如果大于,则不符合规则if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);// 初始化reload寄存器的值 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;// 配置中断优先级,配置为15,默认为最低的优先级NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); // 初始化counter的值为0 SysTick->VAL = 0; // 配置 systick 的时钟为 72M// 使能中断// 使能systickSysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; return (0);
}
#endifvoid SysTick_Delay_us(uint32_t us)
{uint32_t i;SysTick_Config(72);for(i=0; i<us; i++){while( !((SysTick->CTRL) & (1<<16)) );}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}void SysTick_Delay_ms(uint32_t ms)
{uint32_t i;SysTick_Config(72000);for(i=0; i<ms; i++){while( !((SysTick->CTRL) & (1<<16)) );}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
//延时.h函数
#ifndef __BSP_SYSTICK_H
#define __BSP_SYSTICK_H#include "stm32f10x.h"
#include "core_cm3.h"void SysTick_Delay_us(uint32_t us);
void SysTick_Delay_ms(uint32_t ms);#endif /* __BSP_SYSTICK_H */
//12M晶振替换8M,RCC.C程序配置频率
#include "bsp_rccclkconfig.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x )
{ErrorStatus HSEStatus;// 把RCC 寄存器复位成复位值RCC_DeInit(); // 使能 HSE RCC_HSEConfig(RCC_HSE_ON);HSEStatus = RCC_WaitForHSEStartUp();if( HSEStatus == SUCCESS ){// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );}else{/* 如果HSE 启动失败,用户可以在这里添加处理错误的代码 */}
}void HSI_SetSysClk( uint32_t RCC_PLLMul_x )
{__IO uint32_t HSIStatus = 0;// 把RCC 寄存器复位成复位值RCC_DeInit(); // 使能 HSI RCC_HSICmd(ENABLE);HSIStatus = RCC->CR & RCC_CR_HSIRDY;if( HSIStatus == RCC_CR_HSIRDY ){// 使能预取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL稳定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );}else{/* 如果HSI 启动失败,用户可以在这里添加处理错误的代码 */}
}void MCO_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 选择GPIO8引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//设置为复用功能推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置IO的翻转速率为50MGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// 初始化GPIOA8GPIO_Init(GPIOA, &GPIO_InitStructure);}
//12M晶振替换8M晶振,重新设置频率.H程序
#ifndef __BSP_RCCCLKCONFIG_H
#define __BSP_RCCCLKCONFIG_H#include "stm32f10x.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x );
void MCO_GPIO_Config(void);
void HSI_SetSysClk( uint32_t RCC_PLLMul_x );
#endif /*__BSP_RCCCLKCONFIG_H */
数字温湿度传感器DHT11模块相关推荐
- 小白学数字温湿度传感器DHT11模块
[本系列文章还将陆续介绍其他的传感器模块,欢迎订阅我的博客] 温度和湿度对我们的生活有极大的影响,对它的测量也是很有必要的. DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器, ...
- STM32应用(八)数字温度传感器DS18B20、数字温湿度传感器DHT11(软件模拟I2C)
文章目录 1.DS18B20 数字温度传感器实验 1.1 DS18B20简介 1.2 硬件与IO口配置 1.3 实物图与接线 1.4 工程配置 1.5 驱动和检测代码编写 1.5.1 ds18b20. ...
- 有关温湿度传感器DHT11的C语言编程,数字温湿度传感器DHT11 操作C语言源代码
1.数字温湿度传感器DHT11 操作C语言源代码 2.带校验 3.带读操作超时处理 //IO定义 #defineP_DataIN_DHT11PB0_IN #defineP_DataOUT_DHT11P ...
- 数字温湿度传感器DHT11
相对湿度和温度测量 全部校准,数字输出 卓越的长期稳定性 无需额外部件 超长的信号传输距离 超低能耗 4引脚安装 DHT11产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...
- 数字温湿度传感器(DHT11)
一.简介 DHT11概述(官方描述) DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性 ...
- dht11传感器c语言程序,数字温湿度传感器DHT11 操作C语言源代码
//IO定义 #define P_DataIN_DHT11 PB0_IN #define P_DataOUT_DHT11 PB0_OUT //宏定义 #define BSET_DHT11 P_Data ...
- 【正点原子STM32连载】第四十章 DHT11数字温湿度传感器 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...
- 【正点原子MP157连载】第二十七章 DHT11数字温湿度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- Arduino之读取DHT11数字温湿度传感器并串口显示
温度是表示物体冷热程度的物理量,微观上来讲是物体分子热运动的剧烈程度.温度只能通过物体随温度变化的某些特性来间接测量,而用来量度物体温度数值的标尺叫温标.它规定了温度的读数起点(零点)和测量温度的基本 ...
- 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第2章 CC2530温湿度传感器DHT11
1理论分析 1.1 DHT11 介绍 DHT11 数字温湿度传感器,如图所示,是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓 ...
最新文章
- js中显示一个指定html文档,JS实现选定指定HTML元素对象中指定文本内容功能示例...
- Linux下php安装Redis扩展
- SpringMVC重定向传参
- 一个应用程序多线程误用的分析
- bladex实现单点登录
- centos7 編譯 chmsee
- Neural Filters for mac(ps2021逆天滤镜库)无需登陆Adobe Id v22.0.1最新版使用教程
- Android 使用手机向手表安装任意.apk
- postman发送json格式的post请求
- 104道精选iOS面试题PDF
- JavaScript发送短信案例
- html5视频加速播放插件,Video Speed Controller Chrome(HTML5视频加速播放插件) v0.3.2 官方免费版...
- 华氏温度和摄氏温度互换
- 多商户商城系统功能拆解27讲-平台端分销结算设置
- 淘宝店铺用ps+dw装修的步骤
- 所有图片类型后缀汇总
- MySQL 中 delete where in 语句的子查询限制
- 谷歌卫星地图、电子地图和地形图有什么区别?
- MyCobot六轴机械臂(五)--Myblockly拖拽式编程
- c语言 qsort 改进篇
热门文章
- 微服务拆分以及之间的远程调用
- HTML网页设计:二、表单、表格
- Windows 11 全新 4K 壁纸发布
- 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
- wps word中交叉引用的用法
- 基于FPGA的脉冲压缩设计(Matlab+vivado)
- 检查服务器端口占用,服务器中如何检查端口是否开放
- 添加固态硬盘后系统迁移
- 大学心理学课本_大学心理学的教材依次(全部)都有哪些?
- 备战数学建模2——MATLAB导入数据,处理缺失值