首页 > 其他分享 >stm32-时序图学习-温度传感器-DHT11

stm32-时序图学习-温度传感器-DHT11

时间:2024-07-13 16:58:11浏览次数:15  
标签:发送 cnt 温度传感器 Pin 引脚 stm32 GPIO DHT11

目录

温度传感器-DHT11

1. 单总线协议:只有一条数据线,数据只能以比特流的方式传输,所以就会涉及到MSB(高位先出)还是LSB(低位先出),传输方向是半双工通信

2. 时序图


主从机应答信号时序图


第一步主机发送启动信号

点击查看代码
//向DHT11发送开始信号
void DHT11_SendStart(void)
{
	//1.配置引脚为输出模式
	DHT11_PinOutputModeConfig();
	
	//2.把引脚电平拉低并持续20ms
	GPIO_ResetBits(GPIOG,GPIO_Pin_9);
	delay_ms(20);
	
	//3.把引脚电平拉高并持续30us
	GPIO_SetBits(GPIOG,GPIO_Pin_9);
	delay_us(30);

}

第二步从机发送响应信号

点击查看代码
//判断DHT11是否响应
bool DHT11_IsACK(void)
{
	uint32_t cnt = 0;  //作为计数器
	//1.配置引脚为输入模式
	DHT11_PinInputModeConfig();
	//2.判断PG9引脚是否检测到低电平  为了提高程序可靠性,所以人为添加超时机制,超时时间假设为100us
	while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 1 && cnt < 100)
	{
		delay_us(1);
		cnt++;
	}
	if(cnt >= 100)
		return false;
	cnt = 0;
	
	//3.判断PG9引脚检测的低电平是否持续80us
	while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 0 && cnt < 100)
	{
		delay_us(1);
		cnt++;
	}
	if( cnt >= 100 )
		return false;
	else
		return true;
}

** 注意:拉低时间可能不够80us,最好只判断不超过上限 **


DHT11发送的数据 0 的形式



DHT11发送的数据 1 的形式



第三步判断DHT11发送的bit的值,并存储到一个字节的bit0位置中

点击查看代码
//判断DHT11发送的bit的值,并存储到一个字节的bit0位置中
uint8_t DHT11_ReadBit(void)
{
	//1.等待低电平出现   
	while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 1 );
	
	//1.等待低电平结束   
	while( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 0 );
	
	//2.此时高电平出现,则延时 28us < n < 70us
	delay_us(40);
	
	//3.延时结束之后,判断PG9引脚的电平状态,如果电平还是高电平,则说明是bit = 1
	if( GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 1 )
		return 1;
	else 
		return 0;
}

第四步DHT11读取1字节 DHT11提供的40bit是以MSB

点击查看代码
//DHT11读取1字节  DHT11提供的40bit是以MSB
uint8_t DHT11_ReadByte(void)
{
	int i = 0;
	//1.定义变量并初始化
	uint8_t data = 0;  // 0000 0000
	
	//2.循环8次,接收一个字节
	for(i = 0;i < 8;i++)
	{
		data <<= 1;
		data |= DHT11_ReadBit(); 
	} 
	
	return data;
}

关于移位操作讲解`

第五步读取DHT11温湿度传感器的数据

点击查看代码
//读取DHT11温湿度传感器的数据
bool DHT11_ReadData(uint8_t buf[5])
{
	int i = 0;
	
	//1.MCU发送开始信号
	DHT11_SendStart();
	
	//2.MCU等待DHT进行响应
	if( true == DHT11_IsACK() )
	{
		//3.循环读取40bit
		for(i=0;i<5;i++)
		{
			buf[i] = DHT11_ReadByte();
		}
		
		//4.对数据进行校验
		if( buf[4] == buf[0] + buf[1] + buf[2] + buf[3] )
		{
			return true;
		}
		else
			return false; //说明读取数据失败,原因是校验未通过
	}
	else
	{
		return false; //说明读取数据失败,原因是DHT未响应
	}
}

第六步显示数据

点击查看代码
int main()
{	
	uint8_t dhtbuf[5] = {0};
	USART1_Config(9600);
	while(1)
	{
		DHT11_ReadData(dhtbuf); //获取了一次温湿度数据
		printf("temp = %d ℃, humi = %d %%RH\r\n",dhtbuf[2],dhtbuf[0]);
		delay_ms(2000);
	}

}

完整的代码下载,免费的,要是要钱就是csdn修改了,可以提醒我


参考李明轩老师笔记

标签:发送,cnt,温度传感器,Pin,引脚,stm32,GPIO,DHT11
From: https://www.cnblogs.com/shishusheng/p/18298236

相关文章

  • 【免费】stm32单片机、PCB资料合集,上千种项目案例+源码+说明文档,各种毕业设计论文项目
    stm32单片机、PCB资料合集,上千种项目案例+源码+说明文档,各种毕业设计论文项目参考资料等等。。获取方式:https://pan.quark.cn/s/9ceaffb46008包含但不限于:stm32项目开发资料合集stm32项目开发资料合集单片机资料毕设论文等基于单片机的七彩炫光心形灯设计基于单片机的数字......
  • 位带操作-单通信DHT11接收单个bit
    目录位带操作-单通信DHT11接收单个bit操作详解解析位带操作data<<=1;data|=DHT11_ReadBit();实际发送位带操作-单通信DHT11接收单个bit操作详解单总线协议:只有一条数据线,数据只能以比特流的方式传输,所以就会涉及到MSB(高位先出)还是LSB(低位先出),传输方向是半双工通信点......
  • 六、STM32F4+标准库+LWIP2.1.2移植+无操作系统
    最快最简单的移植LWIP协议栈,可改可不改的东西统一不修改。后期学会了有能力了再回过头来修改,操作复杂理论复杂,同时讲解对新手不是很友好,故此此文档只讲操作无任何理论讲解。零、所需文件及环境          1、第四章建立好的串口2当调试口程序    2、......
  • STM32驱动-DHT11(温湿度模块)
    STM32驱动-DHT11(温湿度模块)一、DHT11模块简介DHT11是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接......
  • stm32 HAL库 笔记 定时器(1) 中断实验
    单片机中的定时器主要用于控制时间,比如延时、定时等等。而计数器则主要用于统计事件或脉冲信号的数量。通过控制定时器和计数器的中断、清零等操作,我们可以完成各种复杂的定时、计数等操作,实现更加智能化的控制系统。单片机的定时器一般由计数器、预分频器、中断控制器、基准......
  • 软件spi ST7789屏幕驱动stm32
    #include"st7789.h"voidST7789_GPIO_Init(void){ GPIO_InitTypeDefGPIO_InitStruct; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull=GPIO_PULLUP; GPIO_InitStru......
  • stm32 EC11编码器
    #include"encoder.h"//A线作为时钟线,B线作为信号线//*******************************************************************///功能:初始化EC11旋转编码器相关参数//返回:无//详解:对EC11旋转编码器的连接IO口做IO口模式设置。以及将相关的变量进行初始化//************......
  • STM32常用函数整理
    STM32常用函数整理标准库使用的API用的都是**char***数据类型1./清空缓冲区/memset((char*)uart2RxBuff,0,UART2RXBUFF_SIZE);把uart2RxBuff中长度为UART2RXBUFF_SIZE的字符都写为02.拷贝memcpy(数组1,数组2,len);把数组2的len长度的数据拷贝到数组1中数组1......
  • STM32的SPI接口详解
    目录1.SPI简介2.SPI工作原理3.SPI时序3.1CPOL(ClockPolarity,时钟极性):3.2CPHA(ClockPhase,时钟相位):3.3 四种工作模式4.相关代码4.1使能片选信号4.2使能通讯线4.3初始化SPI4.4设置SPI速度4.5读写数据1.SPI简介STM32的SPI(SerialPeripheralInterface)是一个......
  • STM32中断(NVIC和EXIT)
    CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。而常用的就是这60个......