学习嵌入式单片机接触到最简单的一个模块之一就是DHT11了
5V或者3.3V供电,一个 GND脚以及一个数据脚
通过stm32移植dht11程序到MM32
DHT11.c
#include "dht11.h"
void dht11_gpio_input(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(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_AHBPeriphClockCmd(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();
DHT11_OUT_L;
DELAY_Ms(19);
DHT11_OUT_H;
DELAY_Us(3);
dht11_gpio_input();
}
u16 dht11_scan(void)
{
return DHT11_IN;
}
u16 dht11_read_bit(void)
{
while (DHT11_IN == RESET);
DELAY_Us(4);
if (DHT11_IN == SET)
{
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])
{
return 1;
}
}
return 0;
}
DHT11.h
#ifndef __DHT11_H__
#define __DHT11_H__
#include "sys.h"
#include "led.h"
#include "stdio.h"
#include "delay.h"
#define DHT11_GPIO_TYPE GPIOB
#define DHT11_GPIO_PIN GPIO_Pin_1
#define DHT11_RCC RCC_AHBENR_GPIOB
#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
你只需要更改你需要的引脚即可 另外由于MM32F3277的库函数的DELAY_Us()函数被注释了,你可以自己手动更改SysTick_Config(SystemCoreClock / 100000)这个函数的滴答间隔时间(10us)。 由于我根据野火的滴答定时器改的,所以我并没有试过间隔1us能否成功,如果你感兴趣的话你可以试一试。 更改了SysTick_Config()滴答间隔配置函数,相应的你也就需要更改DELAY_Ms()的写法并且添加DELAY_Us()微秒延时函数了。
到这里,你的DHT11程序就完成了。
|