STM32 DHT11温湿度测试应用

前言:本代码在STM32F407ZET6开发板平台测试通过,STM32结合DTH11温湿度传感器进行测量温度和湿度,并通过串口把测试结果发送到串口终端上显示。

现呈上代码再说

int main(void)
{
    u8 Temp, Hum;
    char Info_Buf[50];
    Led_Init();
    Key_Init();
    Systick_Init();
    Uart1_Init();
    while(1)
    {
        if(!KEY0)                       //等待按键按下
        {
            while(!KEY0);               //等待按键释放
            Temp = 0;                   //清零
            Hum = 0;                    //清零
            DHT11_Read(&Temp, &Hum);    //读取温湿度 
            snprintf(Info_Buf, 50,"Temperature:%d   Humidity:%d\r\n", Temp, Hum);
            printf("%s", Info_Buf);     //发送数据到串口助手显示
            delay_ms(100);  
        }
    }
}
void Dht11_OutputMode(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    GPIO_DeInit(GPIOG);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_9;       
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_OUT;     
    GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;  
    GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;   
    GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_UP;  
    GPIO_Init(GPIOG, &GPIO_InitStruct);
}

void Dht11_InputMode(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    GPIO_DeInit(GPIOG);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

    GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_9;       
    GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN;      
    GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;    
    GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL;  
    GPIO_Init(GPIOG, &GPIO_InitStruct);
}

u8 DHT11_ReadByte(void)
{
    u8 bit_value;
    u8 value=0;
    u8 count;

    for(count=0;count<8;count++)
    {
        if(!PGin(9))
        {
            while(!PGin(9));  //等待低半周期过去
            //判断是0还是1
            delay_us(50);
            if(PGin(9))
            bit_value = 1;
            else
            bit_value = 0;
        }
        value <<= 1;
        value |=  bit_value;
        while(PGin(9));
    }              
    return value;
}

void DHT11_Read(u8 *pTemp, u8 *pHum)
{
   //设置为输出模式
   Dht11_OutputMode();

   //主机启动读写信号
   PGout(9) = 0;    //拉低
   delay_ms(19);    //保持19ms
   PGout(9) = 1;    //拉高

   //设置为输入模式
   Dht11_InputMode();

    //等待DHT11应答
    while(PGin(9));

   //DHT11响应
    if(!PGin(9))
    {
        //DHT11 响应信号
        while(!PGin(9));    //等待低周期结束
        while(PGin(9));     //等待低周期结束

        //读取40bit数据

        //读取湿度的整数值 
        *pHum = DHT11_ReadByte();

        //读取湿度的小数值,暂不支持 
        DHT11_ReadByte();       

        //读取温度的整数值
        *pTemp = DHT11_ReadByte();

        //读取温度的小数值 ,暂不支持
        DHT11_ReadByte();  

        //读取校验值,忽略
        DHT11_ReadByte();   

        PGout(9) = 1;
   }
}

根据DHT11用户手册,可知DHT11的工作时序过程:

一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
STM32 DHT11温湿度测试应用_第1张图片

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。
STM32 DHT11温湿度测试应用_第2张图片

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉
高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定
了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有
响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线
50us,随后总线由上拉电阻拉高进入空闲状态。
STM32 DHT11温湿度测试应用_第3张图片

STM32 DHT11温湿度测试应用_第4张图片

效果图:(用湿纸巾包住DHT11时温湿度变化过程,每按下一次按键读取一次温湿度值)
STM32 DHT11温湿度测试应用_第5张图片

具体完整工程代码下载可以点击一下链接:
http://download.csdn.net/download/xiebaocheng12138/10001857

你可能感兴趣的:(stm32)