完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
关于DHT11
DHT11是一款数字温湿度传感器,DHT11是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有可靠的稳定性,响应快,抗干扰能力强。传感器包括一个高分子电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接,通过单总线与微处理器通讯,只需要一根线。 相关参数 1、DHT11数据结构 DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,具体格式在下面说明。 一次完整的数据传输为40bit,高位先出。 数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和 校验和数据为前四个字节相加。 传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间 应该分开处理。如果,某次从传感器中读取如下5Byte数据: 由以上数据格式可以得到温湿度计算方法 humi (湿度)= byte4 . byte3=45.0 (%RH) temp (温度)= byte2 . byte1=28.0 ( ℃) jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校验正确) 2、DHT11传输数据时序 主机发送开始信号后,延时等待 20us-40us 后读取 DH11T 的回应信号,读取总线为低电平,说明 DHT11 发送响应信号,DHT11 发送响应信号后,再把总线拉高,准备发送数据,每一 bit 数据都以低电平开始。 3、DHT11的数字“0”和数字“1”表示方法 DHT11的数字0和数字1表示方式和常见的不同,一般的数据表示0的是低电平,表示1的是高电平,DHT11不同,开始传输数据之后他数字0的表示方式是高电平26-28us,数字1的表示方式是高电平116-118us。 代码篇 本次实验定义的IO口是PB11,传输的数据是串口一 static void DHT11_Rst(void) { GPIO_SETOUT(); //配置成输出模式 GPIO_ResetBits(DHT11_IO,DHT11_PIN); //拉低数据线 Delay_ms(20); //拉低至少18ms GPIO_SetBits(DHT11_IO,DHT11_PIN); //拉高数据线 Delay_us(30); //主机拉高20~40us GPIO_ResetBits(DHT11_IO,DHT11_PIN); } 2、DHT11发送响应信号到主机(32单片机),DHT11的数据线会拉低40-50us的,在拉高40-50us,让单片机的IO口检测信号。 函数名:static u8 DHT11_Check(void) 参数说明:无 返回值:检测到回应-->返回1,否则0 函数作用:检测DHT11的响应信号 ***********************************************/ static u8 DHT11_Check(void) { u8 retry=0; GPIO_SETIN(); //设置为输入模式 while (!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//DHT11会拉低40~50us { retry++; Delay_us(1); } if(retry >= 100) //超时未响应/未收到开始信号,退出检测 return 0; else retry = 0; while (GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//DHT11拉低后会再次拉高40~50us { retry++; Delay_us(1); } if(retry>=100) //超时,DHT11工作出错,退出检测 return 0; return 1; //设备正常响应,可以正常工作 } 3、DHT11开始传输数据给单片机,这有两个传输数据的函数,一个是传输字节的,在由传输字节的函数来写传输一个8位字符串的函数。 函数名:static u8 DHT11_Read_Bit(void) 参数说明:无 返回值:返回从DHT11上读取的一个Bit数据 函数作用:从DHT11上读取一个Bit数据 ***********************************************/ static u8 DHT11_Read_Bit(void) { u8 retry = 0; //DHT11的Bit开始信号为12-14us低电平 while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待变为低电平(等待Bit开始信号) { retry++; Delay_us(1); } retry = 0; while(!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待变高电平(代表数据开始传输) { retry++; Delay_us(1); } Delay_us(30);//等待30us //0信号为26-28us,1信号则为116-118us,所以说超过30us去读取引脚状态就可以知道传输的值了 if(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN)) return 1; else return 0; } /*********************************************************************** 函数名:static u8 DHT11_Read_Byte(void) 参数说明:无 返回值:返回从DHT11上读取的一个byte数据 函数作用:从DHT11上读取一个byte数据 ************************************************************************/ static u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } 4、DHT11数据采集完毕之后通过主函数在串口显示出来 函数名:int main(void) 参数说明:无 返回值:无 函数作用:主函数 ***************************************************************************/ int main(void) { clock_init(); uart_init(115200); //初始化串口 printf("wecome to DHT11"); //初始化DHT11(有BUG,第一次上电总是失败,按一下复位按钮又能进了) if(!DHT11_Init()){ printf("rn EEROR! THE DHT11 HAS NO RESPOND..."); //while(1); } printf("rn THE DHT11 HAS RESPOND"); Delay_ms(10); //这里延时10ms主要是因为,刚刚接收到响应信息,要等DHT11发送完信息 while(1) { if(DHT11_Read_Data(&temp,&humi)) printf("rn temp:%d,humi:%d",temp,humi); else //printf("rn EEROR! THE DHT11 HAS NO RESPOND...");//由于是库函数编程,不能准确把握函数的执行时间, //所以会经常出现这条警告信息 Delay_ms(100); } } 总结 DHT11是性价比比较高的一个温湿度模块,用串口来显示温湿度来说是比较直观的,长期发布此类文章,喜欢的点个关注吧。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1752 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1611 浏览 1 评论
1052 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
721 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1666 浏览 2 评论
1926浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
711浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
560浏览 3评论
584浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
544浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 22:34 , Processed in 0.639737 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号