完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
DHT11概述
接口说明 电源引脚 DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此 期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。 DHT11数据处理 串行接口 (单线双向) DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数 部分用于以后扩展,现读出为零.操作流程如下: 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据 +8bit校验和 数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位。 用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主 机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。 总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。 DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。 DHT11代码实现步骤 最重要的就是看懂时序图,然后看图写代码 dht11_init.c void Dht11_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //第9号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增强驱动能力,引脚的输出电流更大 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引脚的速度最大为100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //没有使用内部上拉电阻 GPIO_Init(GPIOG, &GPIO_InitStructure); //温湿度模块还没有工作,那么它的触发引脚是高电平 PGout(9)=1; } //引脚模式变更 void Dht11_Pin_Mode(GPIOMode_TypeDef mode) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //第9号引脚 GPIO_InitStructure.GPIO_Mode = mode; //输入/输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增强驱动能力,引脚的输出电流更大 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //引脚的速度最大为100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //没有使用内部上拉电阻 GPIO_Init(GPIOG, &GPIO_InitStructure); } //启动DHT11正常返回0 异常返回-1(根据启动时序图,写出下列代码) int32_t Dht11_Start(void) { u32 t = 0; //启动信号 Dht11_Pin_Mode(GPIO_Mode_OUT); PGout(9) = 1; delay_us(50); PGout(9) = 0; delay_ms(20); PGout(9) = 1; delay_us(30); Dht11_Pin_Mode(GPIO_Mode_IN); t = 0; //等待低电平到来 while(PGin(9) == 1) { t++; delay_us(2); if(t >= 1000) //等待2ms未能等待到低电平 { return -1; } } delay_us(40); t = 0; //等待高电平到来 过滤低电平 while(PGin(9) == 0) { t++; delay_us(2); if(t >= 80) //等待160us未能等待到高电平 { return -1; } } delay_us(40); t = 0; //等待低电平到来 过滤高电平 while(PGin(9) == 1) { t++; delay_us(2); if(t >= 80) //等待160us未能等待到低电平 { return -1; } } return 0; } //一次性读取八位数据 uint8_t Dht11_Read_Byte(void) { u8 i, data = 0; //0000 0000 u32 t = 0; for(i=0; i<8; i++) { t = 0; //等待高电平到来 过滤低电平 while(PGin(9) == 0) { t++; delay_us(2); if(t >= 50) //等待100us未能等待到高电平 { return 0; } } delay_us(40); if(PGin(9) == 1) { data |= (1<<(7-i)); t = 0; //等待低电平到来 过滤高电平 while(PGin(9) == 1) { t++; delay_us(2); if(t >= 50) //等待100us未能等待到低电平 { return -1; } } } } return data; } //成功返回0,失败返回-1 int32_t Dht11_Read(u8 *data) { u8 i=0; for(i=0; i<5; i++) { data = Dht11_Read_Byte(); } if(data[4] == data[0]+data[1]+data[2]+data[3]) { return 0; } else { return -1; } } main.c //判断Dht11_Start()是否为0,如果为0则调用Dht11_Read函数,并输出温湿度。 //串口、printf、延时代码参照上几篇博客 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
725浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
564浏览 3评论
591浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
549浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 22:13 , Processed in 0.664276 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号