STM32F407学习笔记——DHT11模块(温湿度传感器)
一、基本原理:
通过控制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_OT