目录

1.简介

2.主要参数 

 3.引脚说明

4.注意事项

5.单总线协议

6.数据格式

7.工作时序

8.分模块编写程序


1.简介

  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。DHT11实物图和内部框图如下图。

2.主要参数 

 3.引脚说明

4.注意事项

5.单总线协议

6.数据格式

(1)数据格式:
(2)校验位数据定义:
(3)校验:
基于STM32的DHT11温湿度测量-LMLPHP

7.工作时序

基于STM32的DHT11温湿度测量-LMLPHP

8.分模块编写程序

(1)IO方向设置和输出设置

//IO方向设置
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3;}
IO操作函数
#define	DHT11_DQ_OUT PAout(0) //数据端口	PC2
#define	DHT11_DQ_IN  PAin(0)  //数据端口	PC2 

(2)STM32发出复位信号

void DHT11_Rst(void)
{
    DHT11_IO_OUT();					//设置IO口输出模式
    DHT11_DQ_OUT = 0;				//拉低DQ 至少18ms
    delay_ms(20);
    DHT11_DQ_OUT = 1;				//主机拉高20~40us
    delay_us(30);
}

(3)等待DHT11回应(检测DHT11是否存在)

u8 DHT11_Check(void)
{
    u8 retry = 0;
    DHT11_IO_IN();//SET INPUT

    while(DHT11_DQ_IN && retry < 100)		//DHT11会拉低40~80us(拉低会跳出while)
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
        return 1;
    else
        retry = 0;

    while(!DHT11_DQ_IN && retry < 100)		//DHT11拉低后会再次拉高(DHT11_DQ_IN = 1)40~80us (!DHT11_DQ_IN 为0 跳出while 表示DHT11拉高)
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
    {
        return 1;
    }

    return 0;
}

(4)读一个位数据

u8 DHT11_Read_Bit(void)
{
    u8 retry = 0;

    while(DHT11_DQ_IN && retry < 100)		//主机读时 DHT11会先拉低12~14us(拉低会跳出while)
    {
        retry++;
        delay_us(1);
    }

    if(retry >= 100)
        return 1;
    else
        retry = 0;

    while(!DHT11_DQ_IN && retry < 100)		//主机读时 为0(再拉高26~28us) 为1(再拉高116~118us)
    {
        retry++;
        delay_us(1);
    }

    delay_us(40);							//等40us 判断此时电位 高电平为1 低电平为0

    if(DHT11_DQ_IN)
        return 1;
    else
        return 0;
}

(5)读一个字节数据

u8 DHT11_Read_Byte(void)
{
    u8 i, dat;
    dat = 0;

    for (i = 0; i < 8; i++)
    {
        dat <<= 1;
        dat |= DHT11_Read_Bit();
    }

    return dat;
}

(6)一次性读取数据并校验

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();       //5个字节读入buf数组
        }

        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])//校验 前四个字节和等于第五个字节
        {
            *humi = buf[0];
            *temp = buf[2];
        }
    }
    else
        return 1;

    return 0;
}

(7)初始化代码

u8 DHT11_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PC端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				 //PC2端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);				 //初始化IO口
    GPIO_SetBits(GPIOA, GPIO_Pin_0);						 //PC2 输出高

    DHT11_Rst();  //复位DHT11
    return DHT11_Check();//等待DHT11的回应
}

说明:本文章部分内容参考 ASARI温湿度模块DHT11 产品手册

以上就是DHT11的所有内容了,更多传感器驱动代码请订阅我的传感器专栏

05-28 00:28