完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
1、DHT11传感器简介
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测型号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用甚至最为苛刻的应用场合的最佳选择。产品为4针单排引脚封装,连接方便。 传感器特性 供电电压: 3.3~5.5V DC ; 输 出: 单总线数字信号 ; 测量范围: 湿度20-90%RH, 温度0~50℃ ; 测量精度: 湿度+-5%RH, 温度+-2℃; 分 辨 率: 湿度1%RH, 温度1℃; 互 换 性: 可完全互换 ; 长期稳定性: <±1%RH/年;
2.1、DHT11data数据格式: (高位先出) 一次传输40位数据=8bit湿度整数数据 + 8bit湿度小数数据 + 8bit温度整数数据 + 8bit温度小数数据 + 8bit校验和。数据传送正确时,校验和数据等于“8bit湿度整数数据+8位湿度小数数据+8bit温度整数数据+8bit温度小数数据”所得结果的末8位。 用户MCU发送一次开始信号后,DHT11从低功耗转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据,从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集,采集数据后转换到低速模式。 2.2、时序编程 起步时序 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。 数据接收时序 总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。 数字0信号表示方法 数字1信号表示方法 3、DHT11通信流程及代码 3.1、简单通讯流程 第一步初始化IO口 完成起步时序 检查DHT11是否存在 第二部主机信号线拉高准备接收数据,依次接收40位 3.2主要程序部分 dht11.h部分代码 #ifndef _dht11_h #define _dht11_h #include "system.h" #include "SysTick.h" #define DHT11 (GPIO_Pin_4) //PA4 #define GPIO_DHT11 GPIOA #define DHT11_DQ_IN PAin(4) //输入 #define DHT11_DQ_OUT PAout(4) //输出 void DHT11_IO_OUT(void); void DHT11_IO_IN(void); u8 DHT11_Init(void); void DHT11_Rst(void); u8 DHT11_Check(void); u8 DHT11_Read_Bit(void); u8 DHT11_Read_Byte(void); u8 DHT11_Read_Data(u8 *temp,u8 *humi); #endif dht11.c部分代码 #include "stm32f10x.h" // Device header #include "dht11.h" /******************************************************************************* * 函 数 名 : DHT11_Init() * 函数功能 : DHT11初始化 * 引 脚 : PA4 * 输 出 : 返回0:初始化成功,1:失败 *******************************************************************************/ u8 DHT11_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin=DHT11; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIO_DHT11,&GPIO_InitStructure); GPIO_SetBits(GPIO_DHT11,DHT11); //拉高 DHT11_Rst(); return DHT11_Check(); } /******************************************************************************* * 函 数 名 : DHT11_Rst(),DHT11_Check() * 函数功能 : 复位DHT11,检测DHT11 * 引 脚 : PA4 * 输 出 ://返回1:未检测到DHT11的存在,返回0:存在 *******************************************************************************/ void DHT11_Rst() { DHT11_IO_OUT(); //配置io口为输出模式 DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us } u8 DHT11_Check() { u8 retry=0; DHT11_IO_IN();//配置io口为输入模式 while (DHT11_DQ_IN&&retry<100)//高电平循环,低电平跳出 { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~50us { retry++; delay_us(1); }; if(retry>=100)return 1; return 0; } /******************************************************************************* * 函 数 名 : DHT11_Read_Bit(void) * 函数功能 : 从DHT11读取一个位 * 引 脚 : PA4 * 输 出 :返回值:1/0 *******************************************************************************/ u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//等待变为低电平 12-14us 开始 { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//等待变高电平 26-28us表示0,116-118us表示1 { retry++; delay_us(1); } delay_us(40);//等待40us if(DHT11_DQ_IN)return 1; else return 0; } /******************************************************************************* * 函 数 名 : DHT11_Read_Byte(void) * 函数功能 : 从DHT11读取一个字节 * 引 脚 : PA4 * 输 出 :返回值:读到的数据 *******************************************************************************/ u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } /******************************************************************************* * 函 数 名 : DHT11_Read_Data(u8 *temp,u8 *humi) * 函数功能 : 从DHT11读取一次数据 * 引 脚 : PA4 * 输 出 :返回值:0,正常;1,读取失败 *******************************************************************************/ u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++)//读取40位数据 { buf=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } } else return 1; return 0; } //DHT11输出模式配置 void DHT11_IO_OUT() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=DHT11; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIO_DHT11,&GPIO_InitStructure); } //DHT11输入模式配置 void DHT11_IO_IN() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=DHT11; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入模式 GPIO_Init(GPIO_DHT11,&GPIO_InitStructure); } mian.c代码 #include #include #include "system.h" #include "usart1.h" #include "dht11.h" int main() { u8 temperature; u8 humidity; u8 rx_buf[5]; SysTick_Init(72); //系统时钟初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 USART1_Init(9600); //串口初始化PA9,PA10 DHT11_Init(); //DHT11初始化 引脚PA4PA6-MISO PA7-MOSI while(1) { DHT11_Read_Data(&temperature,&humidity); rx_buf[0]=temperature; rx_buf[1]=humidity; printf("temp=%d,humi=%d",rx_buf[0],rx_buf[1]); delay_ms(20); } } 总结一下DHT11总体来说挺简单的 只要清楚理解它的时序,就可以快速上手这款传感器 DHT11.C和DHT11.H文件可在下边下载 |
|||||
|
|||||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:34 , Processed in 0.722685 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号