//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