IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32读取DHT11中时序的问题,通过逻辑分析仪读取信号 -> 正文阅读

[嵌入式]STM32读取DHT11中时序的问题,通过逻辑分析仪读取信号

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_Pin = GPIO_Pin_0;					//选定管脚3
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;			//配置为开漏输出
	
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;			//输出速度为2MHZ
	GPIO_Init( GPIOB, &GPIO_InitStruct);

	GPIO_WriteBit(GPIOB,  GPIO_Pin_0, Bit_SET);
	
	delay_ms(1000);											//延时1s越过不稳定状态
}





/*
 * 函数名:DHT11_Mode_IPU
 * 描述  :使DHT11-DATA引脚变为上拉输入模式
 * 输入  :无
 * 输出  :无
 */
static void DHT11_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;

	  	/*选择要控制的DHT11_PORT引脚*/	
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

	   /*设置引脚模式为浮空输入模式*/ 
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; 

	  /*调用库函数,初始化DHT11_PORT*/
	  GPIO_Init(GPIOB, &GPIO_InitStructure);	 
}

/*
 * 函数名:DHT11_Mode_Out_PP
 * 描述  :使DHT11-DATA引脚变为推挽输出模式
 * 输入  :无
 * 输出  :无
 */
static void DHT11_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;

	 	/*选择要控制的DHT11_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	

	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	/*调用库函数,初始化DHT11_PORT*/
  	GPIO_Init(GPIOB, &GPIO_InitStructure);	 	 
}




//MCU发送开始信号函数
void Mcu_Send_Start_Sign(void)
{
    DHT11_Mode_Out_PP();
	GPIO_WriteBit(GPIOB,  GPIO_Pin_0, Bit_RESET);	
	delay_ms(18);	//拉低总线18ms以上
	GPIO_WriteBit(GPIOB,  GPIO_Pin_0, Bit_SET);		//拉高总线等待DHT11响应
    DHT11_Mode_IPU();
}

//等待DHT11响应函数
//返回值  1---响应失败   0-----响应成功
u8 Dht11_Ack(void)
{
	u16 i = 0;
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1)
	{
		i++;
		delay_us(1);
		if(i>50)
		{
			return 1;			//Dht11响应失败
		}
	}
	//代码运行到这里代表DHT11响应成功
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0);//跳过DHT11响应时间
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1);//跳过DHT11测量时间

	return 0;					//DHT11响应成功
}

//读DHT11测到的数据

u8 Read_Dht11_Data(void)
{
	u8 i,data = 0;
	for(i=0;i<8;i++)
	{
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0);//跳过数据的1bit低电平开始位
		delay_us(40);
//		data = data<<1;
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1)		//数据1
		{
            while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 1);//跳过数据'1'的剩余高电平时间
//			data |= 1;
            data|=(uint8_t)(0x01<<(7-i));
		}
    else{
            data&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
        }		
	}	
	return data;
}

u8 Mcu_Control_Dht11(u8 *p)
{
	u8 ret;
	Mcu_Send_Start_Sign();			//发送开始信号
	ret = Dht11_Ack();
	if(ret)
	{
		return 1;					//测量失败
	}

	
	p[0] = Read_Dht11_Data();	//湿度整数数据
	p[1] = Read_Dht11_Data();	//湿度小数数据
	p[2] = Read_Dht11_Data();	//温度整数数据
	p[3] = Read_Dht11_Data();	//温度小数数据
	p[4] = Read_Dht11_Data();   //8bit校验和
	
	if(p[0]+p[1]+p[2]+p[3] != p[4])
	{
		return 1;					//测量失败
	}
    
	return 0;						//测量成功
}


DHT11.H代码

#ifndef  _DHT11_H_		//防止头文件重定义
#define  _DHT11_H_

#include "stm32f10x.h"
#include "delay.h"

static void DHT11_Mode_IPU(void);
static void DHT11_Mode_Out_PP(void);
void Dht11_Init(void);
u8 Mcu_Control_Dht11(u8 *p);

#endif

开始信号的延时

//MCU发送开始信号函数
void Mcu_Send_Start_Sign(void)
{
    DHT11_Mode_Out_PP();
	GPIO_WriteBit(GPIOB,  GPIO_Pin_0, Bit_RESET);	
	delay_ms(18);	//拉低总线18ms以上
	GPIO_WriteBit(GPIOB,  GPIO_Pin_0, Bit_SET);		//拉高总线等待DHT11响应
    DHT11_Mode_IPU();
}

在这里插入图片描述
可以看到,主机先要拉低最少18ms,再拉高。通过逻辑分析仪采集的信号可以看到。主机拉低了大约18ms.
在这里插入图片描述
在这里插入图片描述

后又拉高了29um
在这里插入图片描述
在这里插入图片描述
这里主机拉高后是由从机拉低的。

从机响应信号

在这里插入图片描述

响应1

大约82um
在这里插入图片描述

响应2

大约89.5um
在这里插入图片描述

读取数据信号,信号0与信号1.

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

因此

在这里插入图片描述
这里可以根据上面的数据间隔大约在50um左右,因此延时可以在25um到71um之间。

根据每个设备的不同,所产生的信号延时也会不一样,因此仅供参考。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:35:27  更:2022-04-01 23:35:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:58:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码