三合一网站建设是指,视频网站直播如何做,大专ui设计师工资一般多少,中小企业网络拓扑图STM32—— DHT11 本文主要涉及STM32F4 的DHT11的使用以及相关时序的介绍#xff0c;最后有工程下载地址。 文章目录 STM32—— DHT11一、 DHT11的介绍1.1 DHT11的经典电路 二、DHT11的通信2.1 DHT11的传输数据格式2.2 DHT11 通信分步解析 三、 DHT11 代码3.1 引脚图3.2 电路图…STM32—— DHT11 本文主要涉及STM32F4 的DHT11的使用以及相关时序的介绍最后有工程下载地址。 文章目录 STM32—— DHT11一、 DHT11的介绍1.1 DHT11的经典电路 二、DHT11的通信2.1 DHT11的传输数据格式2.2 DHT11 通信分步解析 三、 DHT11 代码3.1 引脚图3.2 电路图3.3 DHT11初始化配置代码 一、 DHT11的介绍
DHT11的实物图片
1.1 DHT11的经典电路
DHT11的经典电路如下
DATA 用于微处理器与 DHT1X之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.
二、DHT11的通信
2.1 DHT11的传输数据格式
操作流程如下:一次完整的数据传输为40bit,高位先出。
数据格式: 8bit湿度整数数据8bit湿度小数数据8bi温度整数数据8bit温度小数数据8bit校验和数据传送正确时校验和数据等“8bit湿度整数数据8bit湿度小数数据8bi温度整数数据8bit温度小数数据”所得结果的末8位。
根据DHTx的手册我们可以知道DHT11工作时单总线协议。用户MCU发送一次开始信号后,DHT1X从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT1X发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT1X接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT1X不会主动进行温湿度采集.采集数据后转换到低速模式。 它的通讯过程如图
2.2 DHT11 通信分步解析
总线空闲状态为高电平,主机把总线拉低等待DHT1X响应,主机把总线拉低必须大于18毫秒,保证DHT1X能检测到起始信号。DHT1X接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT1X的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。
总线为低电平,说明DHT1X发送响应信号,DHT1X发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.
格式见下面图示.如果读取响应信号为高电平,则DHT1X没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后DHT1X拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。 三、 DHT11 代码
3.1 引脚图
这个引脚与每个开发板自己的设计有关。
3.2 电路图 3.3 DHT11初始化配置代码
#include dht11.h
#include delay.h
#include stdio.h
#include LED.h
//复位DHT11
void DHT11_Rst(void)
{ DHT11_IO_OUT(); //SET OUTPUTDHT11_DQ_OUT0; //拉低DQdelay_ms(20); //拉低至少18ms--说明书中有DHT11_DQ_OUT1; //DQ1 delay_us(30); //主机拉高20~40us
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{ u8 retry0;DHT11_IO_IN();//SET INPUT LED1 !LED1 ; delay_ms(100);while (DHT11_DQ_INretry100)//DHT11会拉低40~80us{retry;delay_us(1);}; if(retry100)return 1;else retry0;while (!DHT11_DQ_INretry100)//DHT11拉低后会再次拉高40~80us{retry;delay_us(1);};if(retry100)return 1; return 0;
}
//从DHT11读取一个位
//返回值1/0
u8 DHT11_Read_Bit(void)
{u8 retry0;while(DHT11_DQ_INretry100)//等待变为低电平{retry;delay_us(1);}retry0;while(!DHT11_DQ_INretry100)//等待变高电平{retry;delay_us(1);}delay_us(40);//等待40usif(DHT11_DQ_IN)return 1;else return 0;
}
//从DHT11读取一个字节
//返回值读到的数据
u8 DHT11_Read_Byte(void)
{ u8 i,dat;dat0;for (i0;i8;i) {dat1; //先左移最先发送的是最高位所以要先移位再放值dat|DHT11_Read_Bit();//如果移位操作放到赋值后面那么最后一次移位操作会将获得的最高位的数据移出去} return dat;//保存到的1个字节的数据
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{ u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check()0){for(i0;i5;i)//读取40位数据{buf[i]DHT11_Read_Byte();}//数据的校验if((buf[0]buf[1]buf[2]buf[3])buf[4]){*humibuf[0];*tempbuf[2];}}else return 1;return 0;
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIO时钟//GPIO初始化设置GPIO_InitStructure.GPIO_Pin GPIO_Pin_3 ;GPIO_InitStructure.GPIO_Mode GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//50MHzGPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP;//上拉GPIO_Init(GPIOA, GPIO_InitStructure);//初始化DHT11_Rst();return DHT11_Check();
} 关于上面的工程大家可以在我的gitee上面去拉在master分支下的单片机课设工程中04-OLED显示DHT11的数据,工程下载地址