DHT11 的技能参数如下:
事情电压范围:3.3V-5.5V

事情电流 :均匀 0.5mA

输出:单总线数字旗子暗记
丈量范围:湿度 20~90%RH,温度 0~50℃
精度 :湿度±5%,温度±2℃
分辨率 :湿度 1%,温度 1℃
DHT11 的管脚排列如下图 :
DHT11 数字湿温度传感器采取单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由 5Byte(40Bit)组成。数据分小数部分和整数部分,一次完全的数据传输为40bit,高位先出。DHT11 的数据格式为:8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和。个中校验和数据为前四个字节相加。 传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间该当分开 处理。
由以上数据就可得到湿度和温度的值,打算方法:
湿度= byte4 . byte3=45.0 (%RH)
温度= byte2 . byte1=28.0 ( ℃)
校验= byte4+ byte3+ byte2+ byte1=73(=湿度+温度)(校验精确)。
可以看出,DHT11的数据格式是十分大略的,DHT11和 MCU的一次通信最大为 3ms 旁边,
建议主机连续读取韶光间隔不要小于 100ms。
2.DHT11 的传输时序DHT11 的数据发送流程如图:
首先主机发送开始旗子暗记,即:拉低数据线,保持 t1(至少 18ms)韶光,然后拉高数据线 t2(20~40us)韶光,然后读取 DHT11 的相应,正常的话,DHT11 会拉低数据线,保持 t3(40~50us)韶光,作为相应旗子暗记,然后 DHT11 拉高数据线,保持 t4(40~50us)韶光后,开始输出数据。
DHT11 输出数字‘0’的时序如图:
DHT11 输出数字‘1’的时序如图:
3. STM32程序编写
硬件连接:
利用的单片机型号是:STM32F103C8T6
引脚连接:
+ 接 5V
- 接 GND
S 接 PB12
程序编写:
ht11.c:
实现了DHT11传感器读取温湿度数据的功能,详细实现流程如下:
定义DHT11的引脚号和初始化GPIO的函数,包括输出模式和输入模式的初始化。定义发送开始旗子暗记的函数,即先将DQ拉低20ms以上,再拉高20~40us,以唤醒DHT11。定义检测DHT11回应的函数,即等待DHT11将DQ拉低40~80us,再拉高40~80us,如果在100次内没有检测到DHT11回应,则返回1表示未检测到。定义从DHT11读取一个位的函数,即等待DQ变为低电平,再等待变高电平,末了延时40us,返回读取到的值。定义从DHT11读取一个字节的函数,即调用8次读取一个位的函数,将8个位组成一个字节,返回读取到的字节。定义从DHT11读取一次数据的函数,即调用发送开始旗子暗记的函数后,如果检测到DHT11回应,则调用读取一个字节的函数读取40位数据,并打算校验和,如果校验和精确,则将湿度值和温度值分别存到humi和temp指针所指的变量中,返回0表示读取成功,否则返回1表示读取失落败。须要把稳的是,DHT11的一次通讯韶光最大为3ms,主机连续采样间隔建议不小于100ms,因此在利用此段代码时,须要在主程序中掌握采样韶光间隔,避免频繁读取导致DHT11无法正常事情。
#include "dht11.h"#include "delay.h"#include "stm32f10x.h" // //DHT11一次通讯韶光最大3ms,主机连续采样间隔建议不小于100ms。// //输出模式void DHT11_GPIO_Init_OUT(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); } //输入模式void DHT11_GPIO_Init_IN(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); } //主机发送开始旗子暗记void DHT11_Rst(void){ DHT11_GPIO_Init_OUT(); DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us} //等待DHT11的回应//返回1:未检测到DHT11的存在//返回0:存在u8 DHT11_Check(void) { u8 retry=0;//DHT11_IO_IN(); //SET INPUTDHT11_GPIO_Init_IN(); while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us{retry++;delay_us(1);}; if(retry>=100)return 1;else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us{retry++;delay_us(1);};if(retry>=100)return 1; return 0;} //从DHT11读取一个位//返回值:1/0u8 DHT11_Read_Bit(void) { u8 retry=0;while(DHT11_DQ_IN&&retry<100)//等待变为低电平{retry++;delay_us(1);}retry=0;while(!DHT11_DQ_IN&&retry<100)//等待变高电平{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; dat=0;for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat;} //从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(i=0;i<5;i++)//读取40位数据{buf[i]=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; }
ht11.h
#ifndef __DHT11_H#define __DHT11_H#include "sys.h" IO操作函数 #defineDHT11_DQ_OUT PBout(12) //数据端口PB12#defineDHT11_DQ_IN PBin(12) //数据端口PB12 void DHT11_GPIO_Init_OUT(void);void DHT11_GPIO_Init_IN(void); u8 DHT11_Init(void);//初始化DHT11u8 DHT11_Read_Data(u8 temp,u8 humi);//读取温湿度u8 DHT11_Read_Byte(void);//读出一个字节u8 DHT11_Read_Bit(void);//读出一个位u8 DHT11_Check(void);//检测是否存在DHT11void DHT11_Rst(void);//复位DHT11 #endif
主函数:
实现1s采集一次温湿度数据,并将数据通过串口打印出来。
#include "delay.h"#include "sys.h"#include "usart.h"#include "dht11.h" extern unsigned int rec_data[4]; int main(void) { u8 temperature; u8 humidity; delay_init(); //延时函数初始化 uart_init(9600); //串口初始化为9600 printf("温湿度开始采集......\r\n"); while(1){ DHT11_Read_Data(&temperature,&humidity);//读取温湿度值delay_ms(100);printf("温度:%d\r\n",temperature); printf("湿度:%d\r\n",humidity); }}
运行效果:
源码:https://download.csdn.net/download/qq_39742246/88361721









