实验21:DHT11温湿度传感器实验

一、简介

    输出:单总线数字信号。

    电压范围:3.3V ~ 5.5V。

    工作电流:平均0.5mA。

    测量范围:湿度20~90%RH ;温度0 ~ 50°C。

    精度:湿度+-5% ;温度+-2°C。

    分辨率:湿度1% ;温度1°C。

    DHT11图例:

    数据格式:

          DHT11数字湿温度传感器采用单总线数据格式。单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。

          DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。

          其中校验和数据为前四个字节相加。

          传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。

二、时序(从DHT11获取数据)

    首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(40~50us)时间,作为响应信号,然后DHT11拉高数据线,保持t4(40~50us)时间后,开始输出数据。

三、原理图

四、程序

dht11.h文件

#ifndef __DHT11_H__
#define __DHT11_H__

#include "stm32f4xx_conf.h"

//输出
#define DHT11_OUT_LOW()  GPIO_ResetBits(GPIOA,GPIO_Pin_4) 
#define DHT11_OUT_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_4);

//输入
#define DHT11_IN  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)


uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi);

#endif
 

dht11.c文件

#include "./DHT11/dht11.h"
#include "delay.h"
#include "stdio.h"

/*********************************
    功能:配置GPIO的输出功能
    参数:无
    返回值:无
**********************************/
void DHT11_GPIO_OUT(void)
{
    GPIO_InitTypeDef initValue;
    
    /*1、打开GPIO时钟*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    
    /*2、配置GPIO的输出功能*/
    initValue.GPIO_Mode = GPIO_Mode_OUT;
    initValue.GPIO_OType = GPIO_OType_PP;
    initValue.GPIO_Pin = GPIO_Pin_4;
    initValue.GPIO_PuPd = GPIO_PuPd_NOPULL;
    initValue.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOA,&initValue);
}

/*********************************
    功能:配置GPIO的输入功能
    参数:无
    返回值:无
**********************************/
void DHT11_GPIO_IN(void)
{
    GPIO_InitTypeDef initValue;
    
    /*1、打开GPIO时钟*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    
    /*2、配置GPIO的输入功能*/
    initValue.GPIO_Mode = GPIO_Mode_IN;
    initValue.GPIO_Pin = GPIO_Pin_4;
    initValue.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA,&initValue);
}

/*********************************
    功能:主机复位
    参数:无
    返回值:无
**********************************/
void DHT11_RST(void)
{
    /*1、配置GPIO的输出功能*/
    DHT11_GPIO_OUT();
    
    /*2、输出低电平*/
    DHT11_OUT_LOW();
    
    /*3、延时至少18ms*/
    delay_ms(20);
    
    /*4、输出高电平*/
    DHT11_OUT_HIGH();
    
    /*5、延时20~40us*/
    delay_us(30);
}

/*********************************
    功能:DHT11应答
    参数:无
    返回值:
            返回1-->未检测到DHT11存在
            返回0-->DHT11存在
**********************************/
uint8_t DHT11_ACK(void)
{
    uint8_t retry = 0;
    
    /*1、配置GPIO的输入功能*/
    DHT11_GPIO_IN();
    
    /*2、*/
    while(DHT11_IN && retry < 100)//拉低40~80us
    {
        retry++;
        delay_us(1);
    }
    if(retry >= 100)
        return 1;
    else
        retry = 0;
    
    /*3、*/
    while(!DHT11_IN && retry < 100) //拉低后再拉高40~80us
    {
        retry++;
        delay_us(1);
    }
    if(retry >= 100)
    {
        return 1;
    }

    return 0;    

}

/*********************************
    功能:从DHT11中读取一个bit
    参数:无
    返回值:读取到的数据
**********************************/
uint8_t DHT11_Read_Bit(void)
{
    uint8_t retry = 0;
    
    while(DHT11_IN && retry < 100)//等待变为低电平
    {
        retry++;
        delay_us(1);
    }
    
    retry = 0;
    
    while(!DHT11_IN && retry < 100) //等待变为高电平
    {
        retry++;
        delay_us(1);
    }
    
    //延时大于28us
    delay_us(40);
    
    //检测读取到的数据为高/低电平
    if(DHT11_IN)//高电平
    {
        return 1;
    }
    else
    {
        return 0;
    }
    
}

/*********************************
    功能:从DHT11中读取一个字节
    参数:无
    返回值:读取到的数据
**********************************/
uint8_t DHT11_Read_Byte(void)
{
    uint8_t data = 0;
    uint8_t i = 0;
    
    for(i = 0;i<8;i++)
    {
        data <<= 1;
        data |= DHT11_Read_Bit();
    }
    
    return data;
}

/************************************************
    功能:从DHT11读取一次数据(解析温度和湿度值)
    参数:
        temp-->温度值(0~50°)
        humi-->湿度值(20~90%)
    返回值:
        返回1-->失败
        返回0-->成功
*************************************************/
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
{
    
    uint8_t i = 0;
    uint8_t buf[5];
    
    DHT11_RST();//主机复位
    
    if(DHT11_ACK() == 0)//DHT11应答
    {
        for(i=0;i<5;i++)//读取40位数据
        {
            buf[i] = DHT11_Read_Byte();
        }
    
        printf(" %d %d %d %d %d\r\n",buf[0],buf[1],buf[2],buf[3],buf[4]);
        
        if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
        {
            *humi=buf[0]; //湿度
            *temp=buf[2]; //温度
            
        }
    }
    else
    {
        return 1;
    }
    
    return 0;
    
}

main.c文件

#include "delay.h"
#include "stdio.h"
#include "./USART/usart.h"
#include "./DS18B20/ds18b20.h"
#include "./DHT11/dht11.h"

int main(void)
{
    uint8_t temp;
    uint8_t humi;
    //初始化延时函数
    delay_init(168);
    //初始化串口
    USART_Config();
    
    //读取DAC值
    DHT11_Read_Data(&temp,&humi);
    printf(" temp = %d \r\n",temp);
    printf("humi = %d \r\n",humi);
    
    while(1)
    {
        
    }
}

  • 16
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值