DHT11温湿度传感器stm32测试程序

DHT11温湿度传感器stm32测试程序//dht11.h#ifndef __DHT_H__#define __DHT_H__#include”stm32f10x.h”#include”systick.h”#include”led.h”#include “stdio.h”#include “Usart1.h”#defineDHT11_GPIO_TYPEGPIOA#defineDHT11_GPIO_PINGPIO_Pin_8#defineDHT11_RCCRCC_APB2Periph_

//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%%RH\r\n",hum);
		printf("温度 == %.2f℃\r\n",temp);		
		Delay_ms(2000);

今天的文章DHT11温湿度传感器stm32测试程序分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23915.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注