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

news2024/11/17 17:44:58

一.题目分析

(1).题目

 (2).题目分析

1..按键功能分析

a. B1界面切换

b. B2每次按下,PA6手动模式占空比参数增加10%

c. B3每次按下,PA7手动模式占空比参数增加10%

d. B4模式切换

f. 在数据显示界面下每次按下B3按键,互换PA6和PA7输出脉冲信号频率

 (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个字符

//全局变量
_Bool Lcd_Show_State;//0- 数据界面,1- 参数界面
uint8_t PWM_Running_State = 2;
float R37_Voltage;
uint8_t PA6_Duty_Int = 10;
uint8_t PA7_Duty_Int = 10;

//***子函数声明区
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();

	PWM_OUTPUT_TIM3_Init();
	PWM_OUTPUT_TIM17_Init();

	//PA6绿色
		__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
		__HAL_TIM_SET_AUTORELOAD(&htim3, 9999);	
	//PA7黄色
		__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, 500);
		__HAL_TIM_SET_AUTORELOAD(&htim17, 4999);		
	
	//*启动定时器3和定时器17通道输出
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);	//PA6
  HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);		//PA7
	
  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;
	
	switch(unKey_Down)
	{
		case 1://B1
			Lcd_Show_State ^= 1;
			LCD_Clear(Black);
		break;
		
		case 2://B2
			if(Lcd_Show_State == 1)//当处于参数界面
			{
				PA6_Duty_Int += 10;
				if(PA6_Duty_Int == 100) PA6_Duty_Int = 10;			
			}
		break;		
	
		case 3://B3   //0- 数据界面,1- 参数界面
			if(Lcd_Show_State == 0)//当处于数据界面
			{
				if(PWM_Running_State == 0) PWM_Running_State = 1;
				else if(PWM_Running_State == 1) PWM_Running_State = 0;
				else if(PWM_Running_State == 2) PWM_Running_State = 3;
				else if(PWM_Running_State == 3) PWM_Running_State = 2;	
			}
			
			if(Lcd_Show_State == 1)//当处于参数界面
			{
				PA7_Duty_Int += 10;
				if(PA7_Duty_Int == 100) PA7_Duty_Int = 10;			
			}
		break;	
	
		case 4://B4
			if(PWM_Running_State == 0) PWM_Running_State = 2;
			else if(PWM_Running_State == 2) PWM_Running_State = 0;
			else if(PWM_Running_State == 1) PWM_Running_State = 3;
			else if(PWM_Running_State == 3) PWM_Running_State = 1;		
		break;
	}

3.LED扫描子函数

a.逻辑框图

b.程序源码

//***LED扫描子函数
void Led_Proc(void)
{
	if((uwTick -  uwTick_Led_Set_Point)<200)	return;//减速函数
		uwTick_Led_Set_Point = uwTick;

	if(PWM_Running_State >= 2)//自动模式
	{	
		ucLed |= 0x01;//LD1点亮
	}
	else //手动模式
	{
		ucLed &= (~0x01);//LD1熄灭	
	}
	
	if(Lcd_Show_State)//参数界面
	{
		ucLed &= (~0x02);//LD2熄灭		
	}
	else//数据界面
	{
		ucLed |= 0x02;//LD2点亮	
	}
	
	
	
	LED_Disp(ucLed);
}

3.LCD扫描子函数

a.逻辑框图

b.程序源码

void Lcd_Proc(void)
{
	if((uwTick -  uwTick_Lcd_Set_Point)<100)	return;//减速函数
		uwTick_Lcd_Set_Point = uwTick;
	//数据采集区
	R37_Voltage = ((((float)getADC2())/4096)*3.3);
	
	
	//我的显示
	if(Lcd_Show_State == 0)//数据界面
	{
		sprintf((char *)Lcd_Disp_String, "      Data");
		LCD_DisplayStringLine(Line0, Lcd_Disp_String);	
		
		sprintf((char *)Lcd_Disp_String, "    V:%4.2fV",R37_Voltage);
		LCD_DisplayStringLine(Line2, Lcd_Disp_String);		
	
		if(PWM_Running_State <= 1)
		{
			sprintf((char *)Lcd_Disp_String, "    Mode:MANU");
			LCD_DisplayStringLine(Line4, Lcd_Disp_String);				
		}
		else
		{
			sprintf((char *)Lcd_Disp_String, "    Mode:AUTO");
			LCD_DisplayStringLine(Line4, Lcd_Disp_String);				
		}			
	}
	else //参数界面
	{
		sprintf((char *)Lcd_Disp_String, "      Para");
		LCD_DisplayStringLine(Line0, Lcd_Disp_String);		
	
		sprintf((char *)Lcd_Disp_String, "    PA6:%02d%%",(unsigned int)PA6_Duty_Int);
		LCD_DisplayStringLine(Line2, Lcd_Disp_String);	

		sprintf((char *)Lcd_Disp_String, "    PA7:%02d%%",(unsigned int)PA7_Duty_Int);
		LCD_DisplayStringLine(Line4, Lcd_Disp_String);		
	}
		
	
	
	//数据输出区
	
		switch(PWM_Running_State)
		{
			case 0:
					__HAL_TIM_SET_AUTORELOAD(&htim3, 9999);	//PA6(绿色)的频率为100hz
					__HAL_TIM_SET_AUTORELOAD(&htim17, 4999);//PA7(黄色)的频率为200hz
			
					__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (100*PA6_Duty_Int));//PA6(绿色)的占空比跟随设置
					__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, (50*PA7_Duty_Int));//PA7(黄色)的占空比跟随设置			
			break;
		
			case 1:
					__HAL_TIM_SET_AUTORELOAD(&htim3, 4999);	//PA6(绿色)的频率为200hz
					__HAL_TIM_SET_AUTORELOAD(&htim17, 9999);//PA7(黄色)的频率为100hz
			
					__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (50*PA6_Duty_Int));//PA6(绿色)的占空比跟随设置
					__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, (100*PA7_Duty_Int));//PA7(黄色)的占空比跟随设置			
			break;		
		
			case 2:
					__HAL_TIM_SET_AUTORELOAD(&htim3, 9999);	//PA6(绿色)的频率为100hz
					__HAL_TIM_SET_AUTORELOAD(&htim17, 4999);//PA7(黄色)的频率为200hz
			
					__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (unsigned int)(10000*(R37_Voltage/3.3)));//PA6(绿色)的占空比跟随设置
					__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, (unsigned int)(5000*(R37_Voltage/3.3)));//PA7(黄色)的占空比跟随设置			
			break;			
		
			case 3:
					__HAL_TIM_SET_AUTORELOAD(&htim3, 4999);	//PA6(绿色)的频率为200hz
					__HAL_TIM_SET_AUTORELOAD(&htim17, 9999);//PA7(黄色)的频率为100hz
			
					__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, (unsigned int)(5000*(R37_Voltage/3.3)));//PA6(绿色)的占空比跟随设置
					__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, (unsigned int)(10000*(R37_Voltage/3.3)));//PA7(黄色)的占空比跟随设置			
			break;				
			
		}
}

(2)BSP

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

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

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

相关文章

JAVA姓氏头像情侣头像家庭头像签名头像谐音顽埂头像设计小程序头像大全系统小程序源码

姓氏头像到谐音梗&#xff0c;打造你的专属头像大全系统 &#x1f3a8;✨ &#x1f468;‍&#x1f469;‍&#x1f467;‍&#x1f466; 家庭头像&#xff1a;记录温馨瞬间 在这个充满爱的时代&#xff0c;用一张家庭头像来记录你和家人的美好瞬间吧&#xff01;我们的“姓氏…

Linux 进程状态、僵尸进程与孤儿进程

目录 0.前言 1. 进程状态 1.1 定义 1.2 常见进程 2.僵尸进程 2.1 定义 2.2 示例 2.3 僵尸进程的危害与防止方法 3. 孤儿进程 3.1 介绍 3.2 示例 4.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在上一篇文章中&#xff0c;我们介绍了进程的基本概念、进程控制块&#…

Python Flask 和 Django 的区别与适用场景

Flask 和 Django 的异同&#xff08;结合代码解释&#xff09; Flask 和 Django 是两个流行的 Python Web 框架。尽管它们都是用于构建 Web 应用程序的强大工具&#xff0c;但它们的设计哲学、功能和用法有很大的区别。通过代码示例&#xff0c;可以更直观地理解 Flask 和 Dja…

基础岛第1关:书生大模型全链路开源体系

了解书生浦语大模型体系&#xff1a;书生浦语 InternLM2.5 系列模型&#xff1a; 卓越的推理性能&#xff1a;在数学推理方面取得了同量级模型最优精度&#xff0c;超越了 Llama3 和 Gemma2-9B。有效支持百万字超长上下文&#xff1a;模型在 1 百万字长输入中几乎完美地实现长…

一文讲透大语言模型构建流程

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

用友U8-CRM fillbacksettingedit.php SQL注入复现

0x01 产品描述&#xff1a; 用友U8-CRM是企业利用信息技术&#xff0c;是一项商业策略&#xff0c;它通过依据市场细分组织企业资源、培养以客户为中心的经营行为、执行以客户为中心的业务流程等手段来优化企业的客户满意度和获利能力。 0x02 漏洞描述&#xff1a; 用友 U8 C…

VMware Aria Operations for Logs 8.18 发布,新增功能概览

VMware Aria Operations for Logs 8.18 - 集中式日志管理 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-operations-for-logs/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 集中式日志管理 VMware Aria …

web开发(1)-基础

这是对b站课程的总结&#xff0c;后续可能会继续更 01 前后端分离介绍_哔哩哔哩_bilibili01 前后端分离介绍是Web应用开发-后端基础-基于Springboot框架的第1集视频&#xff0c;该合集共计29集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://w…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-01

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-01 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-01目录1. Beyond Text-to-Text: An Overview of Multimodal and Generative Artificial Intelligence for Education Using Topi…

第二弹:面向对象编程中的类与对象

文章目录 面向对象编程中的类与对象1. 类与对象的定义1.1 类和对象的概念1.2 类的基本定义 2. 类的封装2.1 类的封装语法2.2 类成员访问权限2.3 struct和class的区别2.4 类封装与成员函数定义分离 3. 类对象的创建与销毁3.1 静态与动态对象的创建3.2 对象的销毁 4. 构造函数和析…

云服务器部署k8s需要什么配置?

云服务器部署k8s需要什么配置&#xff1f;云服务器部署K8s需要至少2核CPU、4GB内存、50GBSSD存储的主节点用于管理集群&#xff0c;工作节点建议至少2核CPU、2GB内存、20GBSSD。还需安装Docker&#xff0c;选择兼容的Kubernetes版本&#xff0c;配置网络插件&#xff0c;以及确…

大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【日常记录】现在遇到的Y7000P亮度无法调节问题,无需改动注册表进行调整的方法。

1、winR 2、输入&#xff1a;services.msc 3、找到下面红框内的服务 4、右键后&#xff0c;点击重启任务&#xff0c;重启任务后&#xff0c;再次按热键即可恢复亮度调节。

XGBOOST算法Python实现(保姆级)

摘要 XGBoost算法&#xff08;eXtreme Gradient Boosting&#xff09;在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。 目录 0 绪论 一、材料准备 二、算法原理 三、算法Python实现 3…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合&#xff0c;这是因为工科要求都必须是8开头的专业课&#xff0c;里面参考课本还是没变的&#xff0c;无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…

<<迷雾>> 第5章 从逻辑学到逻辑电路(6)--莎士比亚电路 示例电路

info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch05-17-shakespeare-circuit.txt 原图

【AI人工智能】文心智能体,陪爸妈去旅游,国庆假期不容错过,旅游搭子首选

文章目录 背景创作灵感陪爸妈去旅游简介角色与目标思考路径个性化开场白调优 智能体体验总结和感受 背景 文心智能体平台&#xff0c;开启新一轮活动&#xff0c;超级创造营持续百日活动。 在AI 浪潮席卷的今天&#xff0c;如雨后春笋般丛生的 AI 应用&#xff0c;昭告着时代风…

AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用

查看原文>>>AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用 目录 专题一 CMIP6中的模式比较计划 专题二 数据下载 专题三 基础知识3.1 Python基础 专题四 单点降尺度 专题五 统计方法的区域降尺度 专题六 基于WRF模式的动力降尺度 专题七…

墙绘艺术在线交易:SpringBoot技术解析

2 相关技术 2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架…

习题2 算法

选择题 1. 以下叙述中错误的是 【 正确答案: C】。 A.算法正确的程序最终一定会结束 B.算法正确的程序可以有零个输入 C.算法正确的程序可以有零个输出 D.算法正确的程序对于相同的输入一定有相同的结果 2. 下面关于算法的说法错误的是 【 正确答案: B】。 …