标题:
stm32f407vet6单片机+dht11程序,自己写的不太行 不知到问题出在哪
[打印本页]
作者:
xin16
时间:
2023-3-22 11:32
标题:
stm32f407vet6单片机+dht11程序,自己写的不太行 不知到问题出在哪
初学者,我是用正点原子上的dht11代码改的但是就是不知道问题出在哪?串口一直显示是检测不到dht11,要么就是随机数。单总线怎么配置,我用的是GPIOB5这个端口配的,但是就是不行。/* IO操作函数 */是根据正点原子hal库改过来的,这样可以吗?有大佬指点一下吗?小弟在这里多谢了。
单片机源程序如下:
#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"
/******************************************************************************************/
/* DHT11 引脚 定义 */
#define DHT11_DQ_GPIO_PORT GPIOB
#define DHT11_DQ_GPIO_PIN GPIO_Pin_5
/******************************************************************************************/
/* IO操作函数 */
#define DHT11_DQ_OUT(x) do{x ? \
GPIO_WriteBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN, Bit_RESET):\
GPIO_WriteBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN,Bit_SET); \
}while(0) /* 数据端口输出 */
#define DHT11_DQ_IN GPIO_ReadInputDataBit(DHT11_DQ_GPIO_PORT, DHT11_DQ_GPIO_PIN) /* 数据端口输入 */
uint8_t dht11_init(void); /* 初始化DHT11 */
uint8_t dht11_check(void); /* 检测是否存在DHT11 */
uint8_t dht11_read_data(uint8_t *temp,uint8_t *humi); /* 读取温湿度 */
#endif
***********************************************************************
#include "dht11.h"
#include "delay.h"
/**
* @brief 复位DHT11
* @param data: 要写入的数据
* @retval 无
*/
static void dht11_reset(void)
{
DHT11_DQ_OUT(0); /* 拉低DQ */
delay_ms(20); /* 拉低至少18ms */
DHT11_DQ_OUT(1); /* DQ=1 */
delay_us(30); /* 主机拉高20~40us */
}
/**
* @brief 等待DHT11的回应
* @param 无
* @retval 0, DHT11正常
* 1, DHT11异常/不存在
*/
uint8_t dht11_check(void)
{
uint8_t retry = 0;
uint8_t rval = 0;
while (DHT11_DQ_IN && retry < 100) /* DHT11会拉低40~80us */
{
retry++;
delay_us(1);
}
if (retry >= 100)
{
rval = 1;
}
else
{
retry = 0;
while (!DHT11_DQ_IN && retry < 100) /* DHT11拉低后会再次拉高40~80us */
{
retry++;
delay_us(1);
}
if (retry >= 100) rval = 1;
}
return rval;
}
/**
* @brief 从DHT11读取一个位
* @param 无
* @retval 读取到的位值: 0 / 1
*/
uint8_t dht11_read_bit(void)
{
uint8_t retry = 0;
while (DHT11_DQ_IN && retry < 100) /* 等待变为低电平 */
{
retry++;
delay_us(1);
}
retry = 0;
while (!DHT11_DQ_IN && retry < 100) /* 等待变高电平 */
{
retry++;
delay_us(1);
}
delay_us(40); /* 等待40us */
if (DHT11_DQ_IN) /* 根据引脚状态返回 bit */
{
return 1;
}
else
{
return 0;
}
}
/**
* @brief 从DHT11读取一个字节
* @param 无
* @retval 读到的数据
*/
static uint8_t dht11_read_byte(void)
{
uint8_t i, data = 0;
for (i = 0; i < 8; i++) /* 循环读取8位数据 */
{
data <<= 1; /* 高位数据先输出, 先左移一位 */
data |= dht11_read_bit(); /* 读取1bit数据 */
}
return data;
}
/**
* @brief 从DHT11读取一次数据
* @param temp: 温度值(范围:0~50°)
* @param humi: 湿度值(范围:20%~90%)
* @retval 0, 正常.
* 1, 失败
*/
uint8_t dht11_read_data(uint8_t *temp, uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
dht11_reset();
if (dht11_check() == 0)
{
for (i = 0; i < 5; i++) /* 读取40位数据 */
{
buf[i] = dht11_read_byte();
}
if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
}
else
{
return 1;
}
return 0;
}
/**
* @brief 初始化DHT11的IO口 DQ 同时检测DHT11的存在
* @param 无
* @retval 0, 正常
* 1, 不存在/不正常
*/
uint8_t dht11_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//DHT11_DQ_GPIO_CLK_ENABLE(); /* 开启DQ引脚时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = DHT11_DQ_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; /* 上拉 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /* 高速 */
GPIO_Init(DHT11_DQ_GPIO_PORT, & GPIO_InitStructure); /* 初始化DHT11_DQ引脚 */
/* DHT11_DQ引脚模式设置,开漏输出,上拉, 这样就不用再设置IO方向了, 开漏输出的时候(=1), 也可以读取外部信号的高低电平 */
dht11_reset();
return dht11_check();
}
**************************************************************************
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "dht11.h"
//串口通信实验 -库函数版本
//STM32F4工程模板-库函数版本
int main(void)
{
u8 t;
u8 len;
u16 times=0;
uint8_t temperature;
uint8_t humidity;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
//dht11_init();
while (dht11_init()) /* DHT11初始化 */
{
printf("DHT11 Error");
delay_ms(200);
delay_ms(200);
}
while (1)
{
if (t % 10 == 0) /* 每100ms读取一次 */
{
dht11_read_data(&temperature, &humidity); /* 读取温湿度值 */
printf("%lf\n",temperature);
printf("%lf\n",humidity);
}
delay_ms(100);
t++;
if (t == 20)
{
t = 0;
//LED0_TOGGLE(); /* LED0闪烁 */
}
}
}
复制代码
作者:
yzwzfyz
时间:
2023-3-22 16:10
读通dht11的手册,按照手册的逻辑去写,如此能获得更多的知识和经验。
作者:
iamluckman
时间:
2023-3-24 18:45
连接的硬件接口 //dht11_init();
作者:
iamluckman
时间:
2023-3-24 18:46
你确定有初始化GPIO
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1