單片機
返回首頁

STM32外設驅動篇——DHT11溫濕度傳感器

2021-09-10 來源:eefocus

已在STM32上進行過測試。本例使用PC0引腳連接DHT11的data引腳。


main函數中調用下面代碼中的DTH11_test函數即可。


//數據定義:

    //----以下變量均為全局變量--------

    //----溫度高8位== U8T_data_H------

    //----溫度低8位== U8T_data_L------

    //----濕度高8位== U8RH_data_H-----

    //----濕度低8位== U8RH_data_L-----

    //----校驗 8位 == U8checkdata-----

u8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

u8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

 

#define BOOL unsigned char

 

#ifndef TRUE

#define TRUE 1

#endif

 

#ifndef FALSE

#define FALSE 0

#endif

 

static void DHT11_DataPin_Configure_Output(void)

{

     GPIO_InitTypeDef  GPIO_InitStructure;

    

    //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, DISABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);     //使能PC端口時鐘

                

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                 //PC.0 端口配置

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽輸出

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

     GPIO_Init(GPIOC, &GPIO_InitStructure);

}

 

static void DHT11_DataPin_Configure_Input(void)

{

       GPIO_InitTypeDef  DataPin;     

    

     DataPin.GPIO_Pin = GPIO_Pin_0;                

     DataPin.GPIO_Mode = GPIO_Mode_IN_FLOATING;         //懸空     

     DataPin.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &DataPin);

}

BOOL DHT11_get_databit(void)

{

    uint8_t val;

    

     val = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0);

    if(val == Bit_RESET){

        return FALSE;

    }else{

        return TRUE;

    }

}

 

void DHT11_set_databit(BOOL level)

{

    if(level == TRUE){

        GPIO_SetBits(GPIOC, GPIO_Pin_0);

    }else{

        GPIO_ResetBits(GPIOC, GPIO_Pin_0);

    }

}

 

void mdelay(u16 ms)  

{

    if(ms != 0){

        delay_ms(ms);

    }

}

 

void udelay(u16 us)  

{

    if(us != 0){

        delay_us(us);

    }

}

static uint8_t DHT11_read_byte(void)

{     

    uint8_t i;  

    uint8_t data = 0;    

                       

    for(i = 0; i < 8; i++)       

    {    

        data <<= 1;        

           while((!DHT11_get_databit()));

        udelay(10);

        udelay(10);

        udelay(10);

 

        if(DHT11_get_databit())    {

            data |= 0x1;

            while(DHT11_get_databit());

        } else{

        

        } 

 

     }

                         

     return data;

}

  

static uint8_t DHT11_start_sampling(void)

{

    DHT11_DataPin_Configure_Output();

      //主機拉低18ms   

    DHT11_set_databit(FALSE);

    mdelay(18);

    DHT11_set_databit(TRUE);

     //總線由上拉電阻拉高 主機延時20us

    udelay(10);

    udelay(10);

//    udelay(10);

//    udelay(10);

     //主機設為輸入 判斷從機響應信號 

    DHT11_set_databit(TRUE);

 

    DHT11_DataPin_Configure_Input();

 

     //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行      

    if(!DHT11_get_databit())         //T !      

    {

     //判斷從機是否發出 80us 的低電平響應信號是否結束     

       while((!DHT11_get_databit()));

      // printf("DHT11 answers.rn");

     //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態

       while((DHT11_get_databit()));

       return 1;

    }

 

    return 0;               

}

 

void DHT11_get_data(void)

{      

    u8 temp;

    if(DHT11_start_sampling()){

        //printf("DHT11 is ready to transmit datarn");

        //數據接收狀態         

        U8RH_data_H_temp = DHT11_read_byte();

        U8RH_data_L_temp = DHT11_read_byte();

        U8T_data_H_temp     = DHT11_read_byte();

        U8T_data_L_temp     = DHT11_read_byte();

        U8checkdata_temp = DHT11_read_byte();

 

        /* Data transmission finishes, pull the bus high */

        DHT11_DataPin_Configure_Output();   

        DHT11_set_databit(TRUE);

        //數據校驗 

 

        temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

        if(temp==U8checkdata_temp)

        {

            U8RH_data_H=U8RH_data_H_temp;

            U8RH_data_L=U8RH_data_L_temp;

            U8T_data_H=U8T_data_H_temp;

            U8T_data_L=U8T_data_L_temp;

            U8checkdata=U8checkdata_temp;

 

            printf("DHT11 tempature %d.%d  humidity %d.%d rn", 

                U8T_data_H,

                U8T_data_L,

                U8RH_data_H,

                U8T_data_L);

 

       }else{

            printf("checksum failure rn");

       } 

    }else{

        printf("DHT11 didn't answer. Sampling failed. rn");

    }

}

 

void DTH11_test()

{

    while(1)

    {

        DHT11_get_data();

        delay_ms(1000);    

    }

}

進入單片機查看更多內容>>
相關視頻
  • TI 新一代 C2000? 微控制器:全方位助力伺服及馬達驅動應用

  • MSP430電容觸摸技術 - 防水Demo演示

  • 直播回放: Microchip Timberwolf? 音頻處理器在線研討會

  • 新唐 8051單片機教程

  • 基于靈動MM32W0系列MCU的指夾血氧儀控制及OTA升級應用方案分享

  • 基于靈動MM32SPIN系列MCU的無感FOC便攜冰箱應用方案分享

    相關電子頭條文章
萝卜大香蕉