1_头文件
//头文件
#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h" //位 段 映射
#define DHT11_OUT PGout(9)
#define DHT11_IN PGin(9)
void DHT11_Set_IO(GPIOMode_TypeDef Mode);
u8 DHT11_Start(void);
u8 DHT11_Read_Bit(void);
u8 DHT11_Read_Byte(void);
u8 DHT11_Read_Data(u8* Temp,u8* Humidity);
#endif
//C文件
#include "stm32f4xx.h" // Device header
#include "includes.h" //这句是我自己的头文件
#include "dht11.h"
void DHT11_Set_IO(GPIOMode_TypeDef Mode){
//开启时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = Mode;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStruct);
//设置GPIO默认电平 高电平
//DHT11_OUT = 1;
}
//DHT11_Start 启动信号
//返回值为 -1 错误 0 正常
u8 DHT11_Start(void){
//定义等待时间计时
u32 retry = 0;
//DHT11线设置为输出模式
DHT11_Set_IO(GPIO_Mode_OUT);
//DHT11主机发送 启动信号
DHT11_OUT = 0;
Delay_ms(20);
DHT11_OUT = 1;
Delay_us(30);
//DHT11线设置为输入模式
DHT11_Set_IO(GPIO_Mode_IN);
//等待DHT11信号响应,如果为DHT11_IN = 0 则直接结束循环
while(DHT11_IN && retry<100){
retry++;
Delay_us(1);
}
//如果计数值大于100us 则直接结束,返回-1,通信异常
if(retry>=100){
return 1;
}
//再次开始等待输入,初始化计数值retry
retry =0;
//等待计数DHT11_IN = 1,如果不为1,一直循环,大于100us之后,直接退出。并返回-1
//如果为1,则,继续执行
while((!DHT11_IN) && retry<100){
retry++;
Delay_us(1);
}
if(retry>=100){
return 1;
}
//执行成功,返回值为0
return 0;
}
u8 DHT11_Read_Bit(void){
//设置计数次数,一次为1us
u32 retry = 0;
//开始位
//等待DHT11_IN = 0,如果不为0,则返回 10
while(DHT11_IN && retry<100){
retry++;
Delay_us(1);
}
if(retry > 100){
return 10;
}
//等待DHT11_IN = 1,如果不唯一,则返回 10
retry = 0;
while((!DHT11_IN) && retry<100){
retry++;
Delay_us(1);
}
if(retry >= 100){
return 10;
}
//延时40us后再去读DHT11电平,高电平 1 低电平 0
Delay_us(40);
return DHT11_IN;
}
//读取一个字节数据
u8 DHT11_Read_Byte(void){
u8 i,data = 0;
for(i=0;i<8;i++){
//数据左移,再与data比较,先发高位
data |= (DHT11_Read_Bit()<<(7-i));
}
return data;
}
//执行成功返回0 否则返回 1
u8 DHT11_Read_Data(u8* Temp,u8* Humidity){
u8 i,data[5];
//检测DHT11是否通信成功
if(DHT11_Start() == 0){
//将读取的数据传入data[i]
for(i=0;i<5;i++){
data[i] = DHT11_Read_Byte();
}
//校验和
if((data[0]+data[1]+data[2]+data[3] & 0xff) == data[4] ){
*Temp = data[2];
*Humidity = data[0];
return 0;
}
}
return 1;
}
#ifndef __INCLIDES_H
#define __INCLUDES_H
#include "stm32f4xx.h" // Device header
#include "sys.h" //段位映射
#include "stdlib.h" //atoi函数
#include <stdio.h>
#include <string.h> //字符串
#include "sys.h" //位 段隐射
#include "delay.h" //系统延时
#include "led.h" //LED
#include "beep.h" //蜂鸣器
#include "button.h" //按键
#include "timer.h" //定时器
#include "hq2.h" //可燃气体
#include "all.h" //全部初始化头文件
#include "pwm.h" //PWM
#include "usart.h" //串口 USART1
#include "bluetooth.h" //蓝牙初始化 USART3
#include "sr04.h" //超声波传感器
#include "dht11.h" //温湿度传感器
#include "rtc.h" //系统时间
#include "i2c.h"
#endif