單片機
返回首頁

DHT11溫濕度傳感器stm32測試程序

2021-09-10 來源:eefocus

//dht11.h

#ifndef __DHT_H__

#define __DHT_H__

#include "stm32f10x.h"

#include "systick.h"

#include "led.h"

#include "stdio.h"

#include "Usart1.h"



#define DHT11_GPIO_TYPE  GPIOA

#define DHT11_GPIO_PIN   GPIO_Pin_8

#define DHT11_RCC        RCC_APB2Periph_GPIOA




#define DHT11_OUT_H GPIO_SetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)

#define DHT11_OUT_L GPIO_ResetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)

#define DHT11_IN    GPIO_ReadInputDataBit(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)


void dht11_gpio_input(void);

void dht11_gpio_output(void);

u16 dht11_scan(void);

u16 dht11_read_bit(void);

u16 dht11_read_byte(void);

u16 dht11_read_data(u8 buffer[4]);


#endif


//dht11.c

#include "dht.h"

 

void dht11_gpio_input(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    

    RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);

    

    GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入

    

    GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);

}

 

void dht11_gpio_output(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    

    RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);

    

    GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

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

 

    GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);

}

 

void dht11_reset(void)

{

    dht11_gpio_output();//配置IO口輸出模式

    DHT11_OUT_L;//拉低IO口

    Delay_us(19000);//延時18ms-30ms之間

    DHT11_OUT_H;//拉高IO口

    Delay_us(30);//延時30us,等待接收

    dht11_gpio_input();//配置為輸入模式

}

 

u16 dht11_scan(void)

{

    return DHT11_IN;

}

 

u16 dht11_read_bit(void)

{

    while (DHT11_IN == RESET);//等待低電平結束

    Delay_us(40);//延時40us,如果是信號0,高電平信號在26-28us之間,如果是信號1,高電平信號在70us

    if (DHT11_IN == SET)//如果還是高電平就是信號1

    {

        while (DHT11_IN == SET);//等待此信號結束

        return 1;

    }

    else

    {

        return 0;

    }

}

 

u16 dht11_read_byte(void)

{

    u16 i;

    u16 data = 0;

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

    {

        data <<= 1;

        data |= dht11_read_bit();

    }

    return data;

}

 

u16 dht11_read_data(u8 buffer[5])

{

    u16 i = 0;

    u8 checksum;

    dht11_reset();//發送起始信號

    if (dht11_scan() == RESET)

    {

        //等待響應信號結束

        while (dht11_scan() == RESET);

        while (dht11_scan() == SET);

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

        {

            buffer[i] = dht11_read_byte();

        }

        

        while (dht11_scan() == RESET);//接收結束,拉高片選

        dht11_gpio_output();

        DHT11_OUT_H;


         checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];//校驗數據

        if (checksum != buffer[4])

        {

            // checksum error

            return 1;

        }

    }

    

    return 0;

}


//main.c測試

if(dht11_read_data(buf)==0){

            hum = buf[0] + buf[1] / 10.0;

            temp = buf[2] + buf[3] / 10.0;

}

printf("濕度 == %.2f%%RHrn",hum);

printf("溫度 == %.2f℃rn",temp);

Delay_ms(2000);

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

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

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

  • 新唐 8051單片機教程

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

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

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