第十一届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(大学组)

news2024/12/25 1:19:38

一.题目分析

(1).题目

 

 (2).题目分析

1.计时分析

只要遇到Vmin,就将计时时间重置为0,直到遇到Vmax结束计时

2.按键功能分析

a.B1显示和功能页面相互切换

b.B2每次按下Vmax加0.1,加到3.3V,再次按下返回3.3V

c.B3每次按下Vmin加0.1,加到3.3V,再次按下返回3.3V

d.设备从参数页面退出要判断数据是否合理,判断是否Vmax>Vmin+1 ,同时Vmax和Vmin 可以设置的范围是0.0V~3.3V

2.按键功能分析

a.若当前触发了计时功能,并且计时没有结束,LD1就点亮,否则就熄灭

b.如果判断按键设置的参数不合理,LD2点亮,直到参数合理才熄灭

 (3).逻辑框图

二.CubeMX配置

由于蓝桥杯使用的板子都是STM32G431RBT6,配置都是相同的,模板已经在第六届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)-CSDN博客配置完成,大家可以前往学习

三.相关代码实现

(1)MAIN

1.全局变量声明

#include "main.h"
#include "RCC\bsp_rcc.h"
#include "KEY_LED\bsp_key_led.h"
#include "LCD\bsp_lcd.h"
#include "ADC\bsp_adc.h"
#include "TIM\bsp_tim.h"

//***全局变量声明区
//*减速变量
__IO uint32_t uwTick_Key_Set_Point = 0;//控制Key_Proc的执行速度
__IO uint32_t uwTick_Led_Set_Point = 0;//控制Led_Proc的执行速度
__IO uint32_t uwTick_Lcd_Set_Point = 0;//控制Lcd_Proc的执行速度

//*按键扫描专用变量
uint8_t ucKey_Val, unKey_Down, ucKey_Up, ucKey_Old;

//*LED专用变量
uint8_t ucLed;

//*LCD显示专用变量
uint8_t Lcd_Disp_String[21];//最多显示20个字符

//*定时器专用变量
uint16_t Sec;

//*主逻辑使用的变量
uint8_t Disp_Flag;//用于显示屏幕的代号,0-数据界面,1-参数界面
uint8_t Vmax_Disp = 30;
uint8_t Vmax_Ctrl = 30;
uint8_t Vmin_Disp = 10;
uint8_t Vmin_Ctrl = 10;
uint16_t ADC_X100_Num;//AD采集的数值,放大了100倍
uint8_t Start_Timer_Key_Point = 0;//开始计时关键点,当小于Vmin时,此点为1,当下一次扫描,大于Vmin小于Vmax,此点为2
uint16_t ADC_Befor_Filter;//AD滤波前的数值
uint8_t Filter_Times;//滤波次数控制
void Key_Proc(void);
void Led_Proc(void);
void Lcd_Proc(void);

2.系统主函数

int main(void)
{

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

	/*bsp资源的初始化*/
	KEY_LED_Init();
	
	LCD_Init();
	LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);	
    ADC2_Init();
	BASIC_TIM6_Init();

	ADC_X100_Num = ((uint16_t)((((float)getADC2())/4096)*330));
	HAL_Delay(1000);	
  while (1)
  {
		Key_Proc();
		Led_Proc();
		Lcd_Proc();
  }
}

3.子函数

按键扫描子函数

a.逻辑框图

b.程序源码

//***按键扫描子函数
void Key_Proc(void)
{
	if((uwTick -  uwTick_Key_Set_Point)<50)	return;//减速函数   
		uwTick_Key_Set_Point = uwTick;

	ucKey_Val = Key_Scan();
	unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); 
	ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);	
	ucKey_Old = ucKey_Val;

	if(unKey_Down == 1)//B1按键调整屏幕显示内容
	{
		Disp_Flag ^= 0x01;//完成最低位0和1之间的切换
		
		if(Disp_Flag == 0x00)//从参数界面进入到数据界面
		{
			if(Vmax_Disp>=(Vmin_Disp+10))//判别参数设置的数据没有bug
			{
				Vmax_Ctrl = Vmax_Disp;
				Vmin_Ctrl = Vmin_Disp;
				ucLed &= (~0x02);//熄灭LD2小灯
			}
			else//判别数据出BUG了
			{
				ucLed |= 0x02;//点亮LD2小灯
			}
				
		}	
		
		if(Disp_Flag == 0x01)//从数据界面进入到参数界面
		{		
			 Vmax_Disp = Vmax_Ctrl;
			 Vmin_Disp = Vmin_Ctrl;		
		}
	}	
	
	if(Disp_Flag == 0x01)//如果在参数界面,可以调整Vmin和Vmax的数值
	{
		if(unKey_Down == 2)//B2按键调整Vmax增加0.1
		{
			 Vmax_Disp += 1;
			 if(Vmax_Disp > 33)
				 Vmax_Disp = 0;
		}			
		else if(unKey_Down == 3)//B3按键调整Vmin增加0.1
		{
			 Vmin_Disp += 1;
			 if(Vmin_Disp > 33)
				 Vmin_Disp = 0;
		}		
	}
}
LED扫描子函数

a.程序源码

void Led_Proc(void)
{
	if((uwTick -  uwTick_Led_Set_Point)<200)	return;//减速函数
		uwTick_Led_Set_Point = uwTick;

	LED_Disp(ucLed);
}
LCD扫描子函数

a.逻辑框图

b.程序源码

void Lcd_Proc(void)
{
	if((uwTick -  uwTick_Lcd_Set_Point)<100)	return;//减速函数
		uwTick_Lcd_Set_Point = uwTick;	

	for(Filter_Times = 0; Filter_Times<=2; Filter_Times++)
	{
		ADC_Befor_Filter += getADC2();
		HAL_Delay(10);
	}
	
	ADC_X100_Num = ((uint16_t)((((float)ADC_Befor_Filter)/4096)*110));
	ADC_Befor_Filter = 0;
	
	//判别1
	if(ADC_X100_Num < (Vmin_Ctrl*10))//第一次采集,小于Vmin
	{
		Start_Timer_Key_Point = 1;//开始计时关键点一半有效。
	}
	
	//判别2
	if((ADC_X100_Num > (Vmin_Ctrl*10))&&(ADC_X100_Num < (Vmax_Ctrl*10)))//第二次采集,大于Vmin,小于Vmax
	{
		if(Start_Timer_Key_Point == 1)//当第一个关键点有效后,第二个关键点产生,置标志位
		{
			Start_Timer_Key_Point = 2;//开始计时关键点另一半有效
			Sec	= 0 ;	
			//*打开基本定时器
			HAL_TIM_Base_Start_IT(&htim6);//每1s触发一次中断	
      ucLed |= 0x01;//点亮LD1小灯			
		}
	}	
	
	//判别3
	if(ADC_X100_Num > (Vmax_Ctrl*10))//又一次采集,大于Vmax
	{		
			//*停止基本定时器
			HAL_TIM_Base_Stop_IT(&htim6);//每1s触发一次中断	
      ucLed &= (~0x01);//熄灭LD1小灯			
	}
	if(Disp_Flag == 0)//数据界面
	{
		sprintf((char *)Lcd_Disp_String, "      Data");
		LCD_DisplayStringLine(Line0, Lcd_Disp_String);	
	
		sprintf((char *)Lcd_Disp_String, " V:%4.2fV       ",(ADC_X100_Num*0.01));
    LCD_DisplayStringLine(Line2, Lcd_Disp_String);		

		sprintf((char *)Lcd_Disp_String, " T:%02ds        ",(unsigned int)Sec);
    LCD_DisplayStringLine(Line3, Lcd_Disp_String);				
	}
	
	else if(Disp_Flag == 1)//参数界面
	{
		sprintf((char *)Lcd_Disp_String, "      Para");
		LCD_DisplayStringLine(Line0, Lcd_Disp_String);	
	
		sprintf((char *)Lcd_Disp_String, " Vmax:%3.1fV         ",(Vmax_Disp*0.1));
    LCD_DisplayStringLine(Line2, Lcd_Disp_String);		

		sprintf((char *)Lcd_Disp_String, " Vmin:%3.1fV         ",(Vmin_Disp*0.1));
    LCD_DisplayStringLine(Line3, Lcd_Disp_String);	
	}
}
基本定时器6更新回调函数

a.程序源码

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
  {
			Sec++;
	}
}

(2)BSP

在第六届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)-CSDN博客里面有详细的讲解,大家可前往此链接学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怀孕之天赋共享:其实人身体没变,完全是天赋共享

关于怀孕天赋共享&#xff0c;有人说&#xff0c;是不是怀孕导致身体变化&#xff1f; 并没有。下面这个就是案例。你总不能说&#xff0c;小孩生下来身体立即改变吧&#xff1f;

【大模型系列篇】动手部署实践国产文生图模型-腾讯混元DiT

首个中英双语DiT架构&#xff0c;混元-DiT&#xff0c;高性能细粒度中文理解-多分辨率扩散Transformer模型。 腾讯提出的混元DiT&#xff0c;是一个基于Diffusion transformer的文本到图像生成模型&#xff0c;此模型具有中英文细粒度理解能力。为了构建混元DiT&#xff0c;精心…

plt绘画三维曲面

目录 前言实战 前言 如果想绘画三维曲面&#xff0c;需导入Axes3D 模块&#xff0c;具体语法可参考&#xff1a; from mpl_toolkits.mplot3d import Axes3D问题的关键是需要三维坐标对象与figure相关联&#xff0c;这里可以使用如下两种方法&#xff0c;亲测可用&#xff01;…

安卓使用memtester进行内存压力测试

memteser简介 memtester 是一个用于测试内存可靠性的工具。 它可以对计算机的内存进行压力测试&#xff0c;以检测内存中的错误&#xff0c;例如位翻转、随机存取错误等。memtester 可以在不同的操作系统上运行&#xff0c;并且可以针对不同大小的内存进行测试。 下载源码 m…

企业微信hook协议接口,群发,标签,客户管理。

服务提供了丰富的API和SDK&#xff0c;可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互&#xff0c;可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作&#xff0c;通过接口可以实…

用Python实现运筹学——Day 8: 对偶理论的经济解释

一、学习内容 1. 对偶价格的经济含义 对偶价格&#xff08;Dual Price&#xff09;&#xff0c;也称为影子价格&#xff08;Shadow Price&#xff09;&#xff0c;反映了在线性规划问题中的某个约束条件下&#xff0c;单位资源的边际价值。影子价格是对每一单位资源的增加所带…

1.7 编码与调制

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言前言1 基本术语2 常用的编码方法2.1 不归零编码2.2 归零编码2.3 反向归零编码2.4 曼彻斯特编码2.5 差分曼彻斯特编码 3 常用的调制方法3.1 调幅&#xff08;AM&#xff09…

plt等高线图的绘制

目录 np.meshgrid()plt.contour()实战 np.meshgrid() np.meshgrid 是 NumPy 中的一个函数&#xff0c;用于生成多维坐标网格。它通常用于在多维空间中创建坐标点的组合&#xff0c;以便进行向量化的计算或者绘制三维图形。 基本语法&#xff1a; X, Y np.meshgrid(x, y) 参…

车视界系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;汽车品牌管理&#xff0c;汽车颜色管理&#xff0c;用户管理&#xff0c;汽车信息管理&#xff0c;汽车订单管理系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;汽车信息&#xff0c;我…

【C++】多态练习题(面试常考)

学习之前&#xff0c;建议观看&#xff1a;【C】多态&#xff1a;深度剖析&#xff08;多态、虚函数、抽象类、底层原理&#xff09;_c 多态和虚函数,虚函数的实现原理-CSDN博客https://blog.csdn.net/2301_80555259/article/details/142178677?spm1001.2014.3001.5501 一.概念…

echarts X轴出现小数点问题解决方案

问题描述 当X轴数据较小时&#xff0c;X轴的坐标会用小数点将数据撑开&#xff0c;使其均匀显示&#xff0c;如下图所示&#xff1a; 因业务需要不希望出现小数点&#xff0c;该怎么解决呢&#xff1f; 查找一番&#xff0c;解决方案如下&#xff1a; xAxis: {minInterval:…

2-108 基于matlab的模板匹配法实现车牌识别

基于matlab的模板匹配法实现车牌识别&#xff0c;包含完整的字符库和案例车牌。选择待识别车牌&#xff0c;对车牌图像进行边缘检测、腐蚀、平滑、定位彩色、滤波、最小化区域等一系列操作&#xff0c;分割出字符区域&#xff0c;并与全字符模板库比较&#xff0c;得到最终的车…

【LeetCode每日一题】——95.不同的二叉搜索树 II

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 中等 三【题目编号】 95.不同的二叉搜索树 II 四【题目描述】 给你一…

NASA数据集:ATLAS/ICESat-2 L3B 每日和每月网格化海冰自由面高度,第 4 版

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Daily and Monthly Gridded Sea Ice Freeboard, Version 4 简介 ATLAS/ICESat-2 L3B Daily and Monthly Gridded Sea Ice Freeboard, Version 4数据是由NASA的ATLAS&#xff08…

idea.vmoptions 最佳配置

1. 推荐的 idea64.exe.vmoptions 配置&#xff1a; -Xms1024m -Xmx4096m -XX:ReservedCodeCacheSize512m -XX:UseG1GC -XX:SoftRefLRUPolicyMSPerMB50 -XX:CICompilerCount4 -XX:HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dsun.io.useCanonCachesfalse -Dj…

【React 】入门Day01 —— 从基础概念到实战应用

目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发&#xff0c;是用于构建 Web 和原生…

RabbitMQ的应用问题

一、幂等性保障 幂等性是数学和计算机科学中某些运算的性质, 它们可以被多次应⽤, ⽽不会改变初始应⽤的结果 数学上的幂等性&#xff1a; f(x)f(f(x)) |x| 数据库操作幂等性&#xff1a; 数据库的 select 操作. 不同时间两次查询的结果可能不同, 但是这个操作是符合幂等性…

MetaShape+CloudCompare的一些基本操作(一)

一、前言 由于要做一些小小的数据处理&#xff0c;要进行无人机影像的拼接&#xff0c;上网一搜发现metashape&#xff08;前photoscan&#xff09;很好用。由于一些影像涉及到未发布的论文和知识版权&#xff0c;所以进行了打码处理&#xff0c;请见谅&#xff01;&#xff01…

实验5 预备实验2-配置单个的路由器

配置单个的路由器 一、实验目的 此次试验目的是了解思科网络设备的配置基本特点及IOS命令基本操作方法。这些是配置思科设备的重要前提。 二、实验内容及结果 1、实验环境搭建 添加一个模块化的路由器&#xff0c;单击Packet Tracer 5.3的工作区中刚添加的路由器&#xff0c;…

【老生常谈、查漏补缺】SpringBoot接收参数的几种方式图文详解

前言 在实际开发过程中&#xff0c;我们经常会遇到各种不同的场景&#xff0c;需要从客户端接收不同的参数。Spring Boot 提供了多种方式来接收这些参数&#xff0c;使得我们的开发更加灵活便捷。这篇文章主要介绍了 SpringBoot 在接收参数的几种常用方式详解。随着前后端的分离…