15_DHT11 STM32F407

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值