STM32delay延时函数不准确,无法读取DHT11数据的问题

本文探讨了STM32F103开发中使用DHT11传感器遇到的延时不准确问题,通过debug发现DHT11_DATA_IN函数的问题。作者通过调整延时函数并采用while循环解决了延时不准确,同时分享了如何替换传统delay函数以提高精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32delay延时函数不准确,无法读取DHT11数据的问题
环境:KEIL5 、STM32F103C8T6 、 淘宝提供的例程
功能需求:stm32f103单片机读取dht11的温湿度数据
问题发生:在把商家提供的驱动包移植的我的工程中后,只有DHT11传感器无法正常工作,其他传感器能正常工作,初步分析是DHT11的驱动代码有问题。因为DHT11对微秒的延时要求比较高。
在这里插入图片描述

问题查找:
1、经过debug的调试,发现代码在if(DHT11_DATA_IN() == Bit_RESET)这里判断后,条件不成立,问题应该在DHT11_DATA_IN() 函数中。

在这里插入图片描述
在这里插入图片描述

DHT11_DATA_IN()函数的宏定义,函数功能为读取DHT11的响应信号,说明DHT11没有正常启动,所以没有返回信号。
在这里插入图片描述

2、当在程序中与波特率115200发送一个字节a,(大约0.0086ms),delay(50)毫秒进行延时时,发现两个延时的时间大于50毫秒(大约80ms)
3、推测:1、可能芯片的时钟有问题,可能性小 2、delay函数本来就不准确,博客上有相关的说法 3、我的程序中可能定义了某个中断,但我忘记了,所以出现延时。
在这里插入图片描述

4、找解决方案
在相关淘宝店上找了很多程序源码,但都是使用很多delay函数的,网上论坛上的代码也是,使用不能参考。
在这里插入图片描述

在一个博客上发现,可以通过while(…)函数去替代相关的delay()函数,那就可以不用考虑delay()函数是否准确的问题了。
在这里插入图片描述
在这里插入图片描述

5、替代函数分析
MCU发送开始信号和DHT11响应函数

发送起始信号后,通过while来替代两个应答的delay()函数
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0);//跳过DHT11响应时间
while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1);//跳过DHT11测量时间

相似的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
到此,delay延时不准确问题基本解决,当数还是不准确的时候,可以通过调节上方的DelauUsaa(40);函数中的值,直到能测出数据。上方的函数是判断接收的数据是1还是0。
在这里插入图片描述

dht11.c的代码

#include "dht11.h"


//DHT11初始化函数
//DHT11 DATA---PB3


void Dht11_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStruct;
	//开B组时钟和AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);	
	//初始化IO口
	
							//定义结构体变量
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;			//配置为开漏输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;					//选定管脚3
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;			//输出速度为2MHZ
	GPIO_Init( GPIOB, &GPIO_InitStruct)
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值