蓝桥杯嵌入式——扩展板DHT11(更新)

这篇具有很好参考价值的文章主要介绍了蓝桥杯嵌入式——扩展板DHT11(更新)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        没想到蓝桥杯官方资料更新到四梯官网了,今天才下到今年的国赛资源包

目录

一. 原理

1.初始化

2.DHT11_Check

3.数据采集

 二. 代码编写

1. dht11.c文件

2. dht.h文件

3. main.c 文件

三. 注意事项

结语


一. 原理

        从代码入手,按代码运行顺序来解释一下

1.初始化

        设置引脚为输出模式,并且拉高电平,高电平表示为总线空闲

2.DHT11_Check

        当DHT11接收到单片机的开始信号(拉低电平)后,等待单片机开始信号结束,然后发送80us低电平响应信号。
        单片机拉高电平表示开始信号结束,单片机需延时等待20-40us后,

        切换为输入模式。等待单片机发的高电平转成DHT11的80us低电平信号,再等待低电平结束,返回0,表示可以开始采集数据。

蓝桥杯嵌入式——扩展板DHT11(更新)

3.数据采集

        首先要等待上一步的高电平结束,然后低电平能才开始判断数据是0还是1。

数据0和1都可以分为两部分,前面一部分都是50us的低电平,只有后面的高电平时间不一样。为了更加方便写代码,可以利用数据0和1在这个地方的时间差,等过了28us,电平是低电平就是数据0,反之是1。所以会加一个延时。

数据0的时序图:

蓝桥杯嵌入式——扩展板DHT11(更新)

数据1的时序图:

蓝桥杯嵌入式——扩展板DHT11(更新)

 二. 代码编写

1. dht11.c文件

#include "dht11_hal.h"


dht11Data dht11;

//
static void usDelay(uint32_t us)
{
	uint16_t i = 0;
	while(us--){
		i = 30;
		while(i--);
	}
}

//
void outDQ(uint8_t i)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	
	GPIO_InitStructure.Pin = HDQ;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	if(!i) 
		HAL_GPIO_WritePin(GPIOA, HDQ, GPIO_PIN_RESET);
	else 
		HAL_GPIO_WritePin(GPIOA, HDQ, GPIO_PIN_SET);
}

//
void inDQ(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.Pin = HDQ;
	GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
	GPIO_InitStructure.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//
uint8_t DHT11_Check(void)
{
    uint8_t re = 0;
    inDQ();//设置为输入
	
    while (HAL_GPIO_ReadPin(GPIOA, HDQ) && re < 100) //DHT11会拉低40~80us
    {
        re++;
        usDelay(1);
    };
    if(re >= 100)return 1;
    else re = 0;
    while (!HAL_GPIO_ReadPin(GPIOA, HDQ) && re < 100) //DHT11拉低后会再次拉高40~80us
    {
        re++;
        usDelay(1);
    };
    if(re >= 100)return 1;
    return 0;
}
//
void dht11Init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
	outDQ(1);		//空闲状态高电平
}

//
uint8_t recData(void)
{
	uint8_t i,temp=0;
	
	for(i=0; i<8; i++){
		while(HAL_GPIO_ReadPin(GPIOA,HDQ)&&n<100)
		{
			n++;
            usDelay(1);
		};	
		while(!HAL_GPIO_ReadPin(GPIOA,HDQ)&&m<100)
		{
			m++;
            usDelay(1);
		};			//等待低电平结束
		usDelay(40);	//卡时间
		if(HAL_GPIO_ReadPin(GPIOA,HDQ))
		{
			temp=(temp<<1)|1;
		}	
		else
		{
			temp=(temp<<1)|0;
		}
        n=0;
        m=0;
	}
	return temp;
}
void DHT11_Read_Data(float *temp, float *humi)
{
    uint8_t buf[5];
    uint8_t i;
		outDQ(0);
    HAL_Delay(20);	//拉低至少18ms
    HAL_GPIO_WritePin(GPIOA, HDQ, GPIO_PIN_SET); 	//高电平
    usDelay(30);     	//主机拉高20~40us
		if(DHT11_Check() == 0)
    {
        for(i = 0; i < 5; i++)
        {
            buf[i] = recData();
        }
        if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
        {
            *humi = buf[0]+buf[1]/10.f;
            *temp = buf[2]+buf[3]/10.f;
        }
    }
  
}

2. dht.h文件

#ifndef __DHT11_HAL_H
#define __DHT11_HAL_H

#include "stm32g4xx_hal.h"

#define HDQ		GPIO_PIN_7

typedef struct {
	uint8_t humidity_high;
	uint8_t humidity_low;
	uint8_t temperature_high;
	uint8_t temperature_low;
}dht11Data;

void dht11Init(void);
//dht11Data* dht11Read(void);
void DHT11_Read_Data(float *temp, float *humi);

#endif

3. main.c 文件

        需要的可以参考这一篇:蓝桥杯嵌入式——扩展板DHT11_☆时光の星阵☆的博客-CSDN博客

        记得改头文件名、DHT11初始化函数名

三. 注意事项

(1)PA7-HDQ

结语

        不得不说我是怎么一步步改的。

        首先就是参照我之前改好的文件,添加了读取函数,发现不行,读取必须要改引脚模式为输入模式。

        后来又发现必须要写DHT11_Check,先判断能不能采集,就是到了DHT11发数据的时间没。不过还是不行,一般是时序问题,把之前的时延搬过来,不行。

        怀疑读取函数有问题,再搬过来,果然是的。

        最后稍微研究了一下读函数的问题,便解决了。

还是问题定位更加折磨啊!文章来源地址https://www.toymoban.com/news/detail-488553.html

到了这里,关于蓝桥杯嵌入式——扩展板DHT11(更新)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【雕爷学编程】Arduino动手做(174)---Sensor Shield V5.0传感器扩展板

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)

    2024年02月15日
    浏览(47)
  • 微信小程序+UDP+wifi8266+l293d扩展板+Arduino uno遥控小车

    序言 前面突然看到自己已经落灰的Arduino板子,感觉自己必须做点什么。正好手上有个8266的模块、有个焊接接好的小车、有个落灰的Arduino板子,好巧。正好前几天上过一篇8266模块和微信小程序进行UDP通信的博文,一切都正好,那开搞吧。 前置知识需要的不多 至少要去看看微

    2024年02月09日
    浏览(49)
  • 树莓派POE以太网供电扩展板模块可接风扇支持802.3af支持3B+/4B

    这是一款适用于 Raspberry Pi 3B+/4B 的以太网供电 (PoE) 迷你扩展板,支持 IEEE 802.3af 网络标准。如果已有支持 IEEE 802.3af 网络标准的 PoE 路由器或交换机,搭配本扩展板,只需一根网线接入即可让树莓派实现联网和供电。 []  适用于 Raspberry Pi 3B+/4B,可搭配树莓派官方外壳一起使用

    2024年02月16日
    浏览(50)
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛客观题以及详细题解

    题解:   概念题。 MCO引脚,是单片机对外提供时钟的引脚。 HSE,高速外部时钟信号,时钟源由外部晶体/陶瓷谐振器与外部时钟; HSI,高速的内部时钟,由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入; SYSCLK,是系统时钟; HSE/2,对高速外部时钟进

    2023年04月16日
    浏览(166)
  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛客观题及详细题解

    解析: 波特率,指 每秒钟传输码元符号的个数,对符号传输速率的一种度量,单位为1baud/s 。 由于串口只有高低电平之分,即1码元等于1bit,即波特单位1baud和1bit等效,因此,此时的波特单位可以是位/秒。 答案: B 解析: 放大电路的开环,是指未经反馈通路形成的独立放大电

    2023年04月17日
    浏览(82)
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解

      本届国赛试题主要包含 LCD 、 LED 、 按键 、 EEPROM 、 串口 、 模拟电压输入 、 脉冲输入输出 七大部分,其中前面三个部分是蓝桥杯嵌入式的“亲儿子”(必考部分),而剩下的四个部分都为“干儿子”(考频相对较高)。   相对于本届省赛两套试题:   本套试题 串口数

    2024年02月02日
    浏览(90)
  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式国赛程序设计试题以及详细题解

      本套试题较为常规,试题主要需要使用的模块有:LCD、LED、按键、定时器输入捕获功能、采集光照传感器的值以及串口,其中最重要的是 串口收发数据 以及 定时器的输入捕获功能 ,其余的各个部分还算比较常规、比较简单。下面咱就一起来看看这届赛题的题解吧!🤤🤤

    2024年02月06日
    浏览(55)
  • 【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

     🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届省

    2023年04月15日
    浏览(104)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛2]客观题及详细题解

    解析 USART_CR1:控制寄存器1,其中的M位定义了数据字的长度,由软件对其设置和清零。 USART_CR2:控制寄存器2。 USART_BRR:波特率寄存器。 USART_DR:数据寄存器。 (如果现场不记得,可以查阅芯片手册) 答案: A 解析 在STM32微控制器中,DMA可编程的数据传送数目:最大为65535。(如果现场不

    2023年04月10日
    浏览(67)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式省赛[第一场]程序设计题以及详细题解

      今年的第一场比赛绝对np,官方将串口直接省掉了,将其替换成很多小功能,如:切换计时、频率均匀变化、锁机制等等,总的来说本届赛题的难度提升了不少。   本届试题需要用到的功能模块有 LCD 、 LED 、 按键 、 定时器输入捕获 、 定时器PWM输出 、 ADC获取 ,虽然这

    2023年04月17日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包