> 技术文档 > 7.温湿度传感器模块(DHT11)_dht11 csdn

7.温湿度传感器模块(DHT11)_dht11 csdn

1. DHT11 温湿度传感器1.1 产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗;自动控制特点 相对湿度和温度测量 全部校准,数字输出 长期稳定性 超长的信号传输距离:20超低能耗:休眠 3 引脚安装:可以买封装好的 完全互换 : 直接出结果,不用转化数据传送逻辑 只有一根数据线DATA,上官一号发送序列指令给DHT11模块,模块一次完整的数据传输为40bit,高位先出 数据格式 8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和 通讯过程时序图

时序图
根据时序图来写程序

写程序思路a : dht = 1 b dht = 0 延时30ms c dht = 1 d点;while(DHT); e点 while(!DHT) 卡f点:while(DHT) 卡g点:while(!DHT)有效数据都是高电 平,持续时间不一样,40us读,低电平0 高电平1.2 温湿度数据通过串口打印出来程序如下:

#include \"reg52.h\"
#include
#include

sfr AUXR = 0x8E;
#define SIZE 12
sbit DHT = P1^7;
sbit LED1 = P2^0;
sbit LED2 = P2^1;

char data_dht[5];
char buffer[SIZE];

void Delay30ms(void)    //@11.0592MHz
{
    unsigned char data i, j;

    i = 54;
    j = 199;
    do
    {
        while (--j);
    } while (--i);
}

/* 区分数据是0,还是1 */
void Delay40us(void)    //@11.0592MHz
{
    unsigned char data i;

    _nop_();
    i = 15;
    while (--i);
}

void Delay1000ms(void)    //@11.0592MHz
{
    unsigned char data i, j, k;

    _nop_();
    i = 8;
    j = 1;
    k = 243;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void Uart1_Init(void)    //9600bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x40;        //8位数据,可变波特率
    AUXR &= 0xBF;        //定时器时钟12T模式
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0xF0;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式
    TL1 = 0xFD;            //设置定时初始值
    TH1 = 0xFD;            //设置定时重载值
    ET1 = 0;            //禁止定时器中断
    TR1 = 1;            //定时器1开始计时
    ES = 1;                //使能串口1中断
    EA = 1;
}

void Send_Byte(char cmd)
{
    SBUF = cmd;
    while(!TI);
    TI = 0;
}

void Send_String(char* string)
{
    while(*string != \'\\0\')
    {
        Send_Byte(*string);
        string++;
    }
}

/* 模块初始化,单片机是否识别到该模块 */
void Check_DHT11(void)
{
    /* 主机发送信号 */
    DHT = 1;
    DHT = 0;
    Delay30ms();
    DHT = 1;
    /* DHT11模块开始响应 */
    while(DHT);        /* 卡d点 */
    while(!DHT);       /* 卡e点 */
    while(DHT);        /* 卡f点 */
    //模块已经连上,准备开始发数据
}

void Read_Data_From_DHT11(void)
{
    char i;
    char j;
    char temp;
    char flag;
    
    Check_DHT11();              /* 每次进来要确认模块是否与主机连接好 */
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 8; j++)
        {
            while(!DHT);        /* 卡g点,准备传输数据 */
            Delay40us();        /* 区分数据是0,还是1 */
            if(DHT == 1)
            {
                flag = 1;       /* 数据1 */
                while(DHT);     /* 等待数据1的高电平时间结束,直到下一个数据前来 */
            }
            else
            {
                flag = 0;       /* 数据0 */
            }
            
            temp <<= 1;         /* 将8个数据都缓存到这里 */
            temp |= flag;
        }
        data_dht[i] = temp;     /* 将模块一次输出的40个bit,存到数组里面去 */
    }
}

void DHT11_Display(void)
{
    Delay1000ms();
    Read_Data_From_DHT11();
    Send_String(\"Humi:\");
    Send_Byte(data_dht[0]/10 + 0x30);       /* 湿度整数 */
    Send_Byte(data_dht[0]%10 + 0x30);       /* 数据与ASCII码表对应上 */
    Send_Byte(\'.\');
    Send_Byte(data_dht[1]/10 + 0x30);       /* 湿度小数 */
    Send_Byte(data_dht[1]%10 + 0x30);       /* 数据与ASCII码表对应上 */
    Send_String(\"\\r\\n\");
    
    Send_String(\"Temp:\");
    Send_Byte(data_dht[2]/10 + 0x30);       /* 温度整数 */
    Send_Byte(data_dht[2]%10 + 0x30);       /* 数据与ASCII码表对应上 */
    Send_Byte(\'.\');
    Send_Byte(data_dht[3]/10 + 0x30);       /* 温度小数 */
    Send_Byte(data_dht[3]%10 + 0x30);       /* 数据与ASCII码表对应上 */
    Send_String(\"\\r\\n\");
}

void main(void)
{
    Uart1_Init();
    Delay1000ms();
    while(1)
    {
        DHT11_Display();
        LED2 = 0;
    }
}

 

可以看到读取正常