完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、基本原理:
通过控制DHT11模块时序来对DHT11传感器进行控制和数据的读取,总线空闲状态为高电平,单片机把总线拉低等待DHT11响应,拉低时间大于18ms,保证DHT11能检测到起始信号。当DHT11接收到单片机的开始信号后,等待单片机开始信号结束,然后发送80us低电平响应信号。单片机发送开始信号结束后,延时等待20-40us后,切换为输入状态,等待DHT11的80us低电平信号结束,然后判断DHT11是否是否发出 80us 的高电平;如果是,即可开始采集数据。 数字0的时序:当DHT11输出数字0时, 单片机读取到的信号为50 us的低电平,之后为26-28 us的高电平。 数字1的时序:当DHT11输出数字0时, 单片机读取到的信号为50 us的低电平,之后为70 us的高电平。 数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和 8位校验和:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”相加所得结果的末8位。 二、代码功能: 通过单片机控制DHT11模块测量温湿度并且反馈在串口上。 三、接线: VCC——VCC、GND——GND、DATA——PF0 四、代码部分: dht.h #ifndef __DHT_H #define __DHT_H #include "sys.h" #include "delay.h" #include "usart.h" #define IO_DHT11 GPIO_Pin_0 #define GPIO_DHT11 GPIOF #define DHT11_DQ_High GPIO_SetBits(GPIO_DHT11,IO_DHT11) #define DHT11_DQ_Low GPIO_ResetBits(GPIO_DHT11,IO_DHT11) void DHT11_IO_OUT(void); void DHT11_IO_IN (void); void DHT11_Init(void); void DHT11_Rst(void); u8 DHT11_Read_Data(u8 *temp,u8 *humi); u8 DHT11_Read_Byte(void); u8 DHT11_Read_Bit(void); u8 DHT11_Check(void); #endif dht.c #include "dht.h" void DHT11_IO_IN (void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_SetBits(GPIOF,GPIO_Pin_0); } void DHT11_IO_OUT (void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOF, &GPIO_InitStructure); GPIO_SetBits(GPIOF,GPIO_Pin_0); } void DHT11_Rst(void) { DHT11_IO_OUT(); DHT11_DQ_Low; delay_ms(20); DHT11_DQ_High; delay_us(30); } u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN(); while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)&&retry<100) { retry++; delay_us(1); }; if(retry>=100) return 1; else retry=0; while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==0)&&retry<100) { retry++; delay_us(1); }; if(retry>=100) return 1; return 0; } u8 DHT11_Read_Bit(void) { u8 retry=0; while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)&&retry<100) { retry++; delay_us(1); }; retry=0; while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==0)&&retry<100) { retry++; delay_us(1); }; delay_us(50); if(GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1) return 1; else return 0; } u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } 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++) { buf=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *temp=buf[2]; *humi=buf[0]; } } else return 1; return 0; } void DHT11_Init(void) { DHT11_Rst(); DHT11_Check(); } mian.c #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "key.h" #include "dht.h" int main(void) { u8 wd=0; u8 sd=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); uart_init(115200); DHT11_Init(); while(1) { DHT11_Read_Data(&wd,&sd); printf("ζȣº%d ¡¯Crn",wd); printf("ʪ¶È£º%d %%rn",sd); delay_ms(1000); delay_ms(1000); } } PS:基于stm32f407zgt6测试成功 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2951 浏览 16 评论
3455 浏览 1 评论
8984 浏览 16 评论
4045 浏览 18 评论
1094浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2299浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 10:44 , Processed in 1.760289 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号