资讯详情

STM32F407学习笔记——DHT11模块(温湿度传感器)

STM32F407学习笔记——DHT11模块(温湿度传感器)

一、基本原理: 通过控制DHT模块时序来对DHT11传感器控制和读取数据。总线的空闲状态是高电平,单片机降低总线等待DHT11响应时间大于18ms,保证DHT起始信号可以检测到。当DHT11接收单片机开始信号后,等待单片机开始信号结束,然后发送80us低电平响应信号。单片机发送开始信号后,延迟等待20-40us之后,切换到输入状态,等待DHT11的80us低电平信号结束,然后判断DHT是否发出11 80us 高电平;如果是,可以开始收集数据。

数字0时序:当DHT11输出数字0时, 单片机读取的信号为50 us26-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[i]=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 ¡¯C\r\n",wd);
		printf("滦飼%d %%r\n",sd);
		delay_ms(1000);
		delay_ms(1000);	
	}
}

PS:基于stm32f407zgt6测试成功

该文章参考资料:详解DHT11温湿度传感器的原理及驱动程序

标签: zg2传感器如何维护

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台