当前位置: 首页 > news >正文

第十三届蓝桥杯嵌入式省赛程序设计详细题解

第十三届蓝桥杯嵌入式省赛题目相对于第十二届较为简单,没有那么多串口的数据处理以及判断!

第十三届省赛主要是制作一个可由串口设置密码的密码锁。本实验中,我们将用到LED模块、按键模块、串口模块、定时器的PWM模块以及官方会提供源码的LCD模块。

文末有小编写的代码

一、CubeMX配置

1.使能外部高速时钟:
在这里插入图片描述
2.配置时钟树:
在这里插入图片描述
3.GPIO输出
在这里插入图片描述

4.GPIO输入
在这里插入图片描述
5. TIM定时器

5.1 TIM2输出PWM脉冲
在这里插入图片描述
设置默认Pluse为50,即占空比为50%
在这里插入图片描述
5.2 TIM4实现定时5s

在这里插入图片描述

在这里插入图片描述

5.3 TIM3定时器实现微妙(us)延迟
在这里插入图片描述

6.USART(通信)

USART串口接收数据,我使用两种方法实现,大家选取其中一种即可!

1.定长接收数据
在这里插入图片描述

在这里插入图片描述
2,不定长接收数据+DMA方式
此种方法的核心是空闲中断!
在这里插入图片描述

二、代码实现

2.1 main函数实现

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM2_Init();MX_USART1_UART_Init();MX_TIM3_Init();MX_TIM4_Init();MX_TIM1_Init();/* USER CODE BEGIN 2 */LCD_Init();LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);led(1,0);led(2,0);led(3,0);led(4,0);led(5,0);led(6,0);led(7,0);led(8,0);HAL_UART_Receive_IT(&huart1, buff, 7);HAL_TIM_Base_Start_IT(&htim4);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Key_handle();lcd();if(key4_count>=3&&led_flag==0){led(2,1);delay_us(50000);delay_us(50000);led(2,0);delay_us(50000);delay_us(50000);}}/* USER CODE END 3 */
}

2.2 lcd函数实现

void lcd()
{if(pass_flag==1){show_output();	if(systick-PWMTick>5000){led(1,0);pwm1();first='@';first_flag=-1;second='@';second_flag=-1;third='@';third_flag=-1;pass_flag=0;LCD_Clear(Black);}	}if(pass_flag==0){show_input();		}
}void show_input()
{LCD_DisplayStringLine(Line1,"       PSD             ");sprintf(B1,"    B1:%c",first);LCD_DisplayStringLine(Line3,B1);sprintf(B2,"    B2:%c",second);LCD_DisplayStringLine(Line4,B2);sprintf(B3,"    B3:%c",third);LCD_DisplayStringLine(Line5,B3);
}char pl[50];
char zkb[50];
int c_pl;
int c_ARR;
int c_zkb;
int c_pluse;
void show_output()
{LCD_DisplayStringLine(Line1,"       STA             ");c_ARR=__HAL_TIM_GET_AUTORELOAD(&htim2);c_pl=100000/(c_ARR+1);sprintf(pl,"    F:%dHz",c_pl);LCD_DisplayStringLine(Line3,pl);c_pluse=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_2);c_zkb=c_pluse*100/(c_ARR+1);sprintf(zkb,"    S:%d%%",c_zkb);LCD_DisplayStringLine(Line4,zkb);
}

2.3 按键扫描功能实现

int Keynum()
{int key=0;if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==0){HAL_Delay(5);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==0){key=1;LCD_Clear(Black);}while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==0);}if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)==0){HAL_Delay(5);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)==0){key=2;LCD_Clear(Black);}while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)==0);}if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)==0){HAL_Delay(5);if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)==0){key=3;LCD_Clear(Black);}while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)==0);}if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0){HAL_Delay(5);if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0){key=4;LCD_Clear(Black);}while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0);}return key;
}char first='@';
int first_flag=-1;char second='@';
int second_flag=-1;char third='@';
int third_flag=-1;char pass1='1';
char pass2='2';
char pass3='3';
int pass_flag=0;int lcd_flag=0;int ledTick=0;
void Key_handle()
{int keynum=Keynum();if(keynum==1){first_flag++;switch(first_flag%10){case 0:first='0';break;case 1:first='1';break;case 2:first='2';break;case 3:first='3';break;case 4:first='4';break;case 5:first='5';break;case 6:first='6';break;case 7:first='7';break;case 8:first='8';break;case 9:first='9';break;}}if(keynum==2){second_flag++;switch(second_flag%10){case 0:second='0';break;case 1:second='1';break;case 2:second='2';break;case 3:second='3';break;case 4:second='4';break;case 5:second='5';break;case 6:second='6';break;case 7:second='7';break;case 8:second='8';break;case 9:second='9';break;}}if(keynum==3){third_flag++;switch(third_flag%10){case 0:third='0';break;case 1:third='1';break;case 2:third='2';break;case 3:third='3';break;case 4:third='4';break;case 5:third='5';break;case 6:third='6';break;case 7:third='7';break;case 8:third='8';break;case 9:third='9';break;}}if(keynum==4){led_flag=0;key4_count++;if(pass1==first&&pass2==second&&pass3==third){key4_count=0;pass_flag=1;pwm2();led(1,1);//定时器中断在回调函数中清屏函数不起作用
//			__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_UPDATE);
//		    HAL_TIM_Base_Start_IT(&htim1);PWMTick=systick;		}else{pass_flag=0;first='@';first_flag=-1;second='@';second_flag=-1;third='@';third_flag=-1;}if(key4_count>=3){__HAL_TIM_CLEAR_FLAG(&htim4,TIM_FLAG_UPDATE);HAL_TIM_Base_Start_IT(&htim4);}}
}

2.4 PWM脉冲转换

void pwm2()
{__HAL_TIM_SET_AUTORELOAD(&htim2,50-1);__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,5);
}//方波
void pwm1()
{__HAL_TIM_SET_AUTORELOAD(&htim2,100-1);__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,50);
}

2.5 某种状态持续5s的两种操作方法

1.利用系统滴答计时器

本实验中 实现输出2KHz 10%占空比的脉冲信号,持续5秒钟,切换为 1KHz 方波信号输出的功能 使用的是系统滴答计时器。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
2.TIM定时器定时5s
本实验中实现 指示灯 LD2 以 0.1秒为间隔亮、灭闪烁报警,5 秒后熄灭的功能使用的是TIM4定时器定时5s。
在这里插入图片描述

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM4){led_flag=1;HAL_TIM_Base_Stop_IT(&htim4);	}
}

2.6 延迟100ms

delay_us函数实现定时微妙(us)

void delay_us(int delay)
{HAL_TIM_Base_Start(&htim3);        // 启动定时器__HAL_TIM_SET_COUNTER(&htim3, 0);  // 重置计数器while (__HAL_TIM_GET_COUNTER(&htim3) < delay){}HAL_TIM_Base_Stop(&htim3);         // 停止定时器
}

delay_us(50000)代表延迟50000us即50ms,但因为定时器最大计数值为65535,如果delay_us(100000)就超过了定时器最大计数值,所以可以采取delay_us(50000)两次来实现100ms定时!
在这里插入图片描述

2.7 USART串口与修改密码

USART串口接收数据,我使用两种方法实现,大家选取其中一种即可!

1.接收固定长度数据

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(buff[0]==pass1&&buff[1]==pass2&&buff[2]&&buff[3]=='-'&&judge()==1){pass1=buff[4];pass2=buff[5];pass3=buff[6];HAL_UART_Transmit(&huart1,(unsigned char *)"Success\r\n", 9, 50);}else{HAL_UART_Transmit(&huart1,(unsigned char *)"error\r\n", 7, 50);}HAL_UART_Receive_IT(&huart1, buff, 7);
}int judge()
{for(int i=0;i<6;i++){if((buff[i]<'0')||(buff[i]>'9'))//接收数据不为阿拉伯数字时不合法return 0;else{return 1;}}
}

2.接收不定长数据+DMA方式

此种方式使用的是空闲中断
串口空闲帧中断定义:空闲中断(IDLE),俗称帧中断,空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。当串口发送数据时是将一帧数据中的字符一个一个连续发送出的,两个字符间隔时间非常短产生不了空闲,正常情况下是第一帧数据接收毕到第二帧数据开始接收期间存在一个空闲状态,检测到此空闲状态后产生空闲空暇中断。优点:空闲中断的优点在于省去了帧头帧尾的检测,进入中断程序即意味着已经接收到一组完整数据,需及时对数据处理或将数据转移出缓冲区即可。

在mian函数中,while(1)之前增加两行代码

	HAL_UART_Receive_DMA(&huart1,rx_buffer,100);    // 开启DMA接收__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);      // 开启串口的空闲中断

中断回调函数:
我是写在USART1_IRQHandler(void)这个里面,也可以直接写在由hal库提供的函数
HAL_UART_IRQHandler(&huart1)里面,如果写在HAL_UART_IRQHandler()里面的话,得找个地方放这个函数,所以直接在stm32f4xx_it.c中的这个函数
USART1_IRQHandler(void)里写省事一点!
在这里插入图片描述
最后,小编在此处附上获取我的源码链接:第十三届蓝桥杯嵌入式真题

相关文章:

第十三届蓝桥杯嵌入式省赛程序设计详细题解

第十三届蓝桥杯嵌入式省赛题目相对于第十二届较为简单&#xff0c;没有那么多串口的数据处理以及判断&#xff01; 第十三届省赛主要是制作一个可由串口设置密码的密码锁。本实验中&#xff0c;我们将用到LED模块、按键模块、串口模块、定时器的PWM模块以及官方会提供源码的LC…...

Go 语言指针

1. 什么是指针&#xff1f; 在 Go 语言中&#xff0c;指针是一种特殊的数据类型&#xff0c;它存储了一个变量的内存地址。指针提供了直接访问和修改变量值的能力。 2. 指针的基本操作 2.1 声明指针 在 Go 中声明指针需要使用 * 符号&#xff0c;例如&#xff1a; var p *…...

指针运算笔试题解析

题目1&#xff1a; int main() { int a[5] { 1, 2, 3, 4, 5 }; int* ptr (int*)(&a 1); printf("%d %d", *(a 1), *(ptr - 1)); return 0; } ptr中存放了整个数组的地址&#xff0c;ptr是int*类型&#xff0c;&a1跳到5的地址后又被强制类…...

Matlab梁单元有限元编程 | 铁木辛柯梁 | 欧拉梁 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…...

Tensorflow2.0笔记 - 常见激活函数sigmoid,tanh和relu

本笔记主要记录常见的三个激活函数sigmoid&#xff0c;tanh和relu&#xff0c;关于激活函数详细的描述&#xff0c;可以参考这里&#xff1a; 详解激活函数&#xff08;Sigmoid/Tanh/ReLU/Leaky ReLu等&#xff09; - 知乎 import tensorflow as tf import numpy as nptf.__ve…...

1688商品详情数据采集,工程数据采集丨店铺数据采集丨商品详情数据采集

1688是中国的一个大型B2B电子商务平台&#xff0c;主要用于批发和采购各种商品。对于需要从1688上获取商品详情数据、工程数据或店铺数据的用户来说&#xff0c;可以采用以下几种常见的方法&#xff1a; 官方API接口&#xff1a;如果1688提供了官方的API接口&#xff0c;那么可…...

Flutter(四):SingleChildScrollView、GridView

SingleChildScrollView、GridView 遇到的问题 以下代码会报错: class GridViewPage extends StatefulWidget {const GridViewPage({super.key});overrideState<GridViewPage> createState() > _GridViewPage(); }class _GridViewPage extends State<GridViewPage&g…...

【C++】102.二叉树的层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1…...

Java学习笔记006——子类与父类的类型转换

在Java中&#xff0c;类型转换主要涉及到两种类型&#xff1a;向上类型转换&#xff08;Upcasting&#xff09;和向下类型转换&#xff08;Downcasting&#xff09;。 1. 向上类型转换&#xff08;Upcasting&#xff09;&#xff1a; 向上类型转换是将子类的对象转换为父类类…...

FedAsync Asynchronous Federated Optimization

文章目录 IntroductionMethodologyConvergence analysisExperiments Introduction 联邦学习有三个关键属性: 不频繁的任务激活。对于弱边缘设备&#xff0c;学习任务只在设备空闲、充电、连接非计量网络时执行.沟通不频繁。边缘设备和远程服务器之间的连接可能经常不可用、缓…...

学习基于 JavaScript 语言 的计算机界三大神书”之一 ——SICP

如何阅读“计算机界三大神书”之一 ——SICP 《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动全世界大学计算…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(一)-向量扩展编程模型

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...

K8s 镜像缓存管理 kube-fledged 认知

写在前面 博文内容为K8s 镜像缓存管理 kube-fledged 认知内容涉及&#xff1a; kube-fledged 简单介绍部署以及基本使用 理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。…...

ModbusTcp协议

Modbus TCP是一种通信协议&#xff0c;用于工业设备之间的通信。它是Modbus协议家族中的一个成员&#xff0c;最初是为串行通信设计的&#xff0c;但后来扩展到了TCP/IP网络。Modbus TCP/IP是一种公开的标准&#xff0c;由Modbus组织制定&#xff0c;并且被广泛应用于工业自动化…...

常用工具——Gradle

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言一、Gradle 简介二、文件结构详解 一、Gradle 简介 Gradle 文件是一个独立于 android 之外的一个东西&#xff1b; 是什么 gradle 就是编译、打包 Android 工程的一个构建工具&#xff1b;build.gradle 文件&…...

OpenHarmony教程指南—Navigation开发 页面切换场景范例

简介 在应用开发时&#xff0c;我们常常遇到&#xff0c;需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理&#xff0c;它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载&#xff0c;navPathSta…...

2024-简单点-picamera2除了文档还有哪里可以学习实例?

picamera2学习例子 去github的picamera2库&#xff0c;找app和examples目录&#xff0c;然后学习...

JavaScript实现点击鼠标弹钢琴的效果

思路&#xff1a; 图片设置宽900px&#xff0c;找到鼠标按下时的x坐标和img距离body的x坐标&#xff0c;两个值相减&#xff0c;然后除100取整&#xff0c;赋值给a&#xff0c;通过判断a的值来确定放出那个音乐。 完整代码&#xff1a; <!DOCTYPE html> <html lan…...

docker-compose Install rustdesk

RustDesk RustDesk 是一款开源的远程支持和远程桌面工具,它旨在为用户提供便捷的远程协助和远程访问功能。 默认情况下,hbbs 监听21115(tcp), 21116(tcp/udp), 21118(tcp),hbbr 监听21117(tcp), 21119(tcp)。务必在防火墙开启这几个端口, 请注意21116同时要开启TCP和UDP。…...

初学C++

注释 变量 作用&#xff1a;给一段指定的内存空间起名&#xff0c;方便操作这段内容 数据类型 变量名 变量初始值; 常量 用于记录程序中不可更改的数据 宏常量&#xff1a; #define 宏常量 常量值 const修饰的变量&#xff1a; const 数据类型 常量名 常量值; 关键字 …...

别再死记公式了!用HFSS和Matlab FDTD两种方法,手把手教你仿真微带线阻抗(附工程文件)

微带线阻抗仿真实战&#xff1a;HFSS与Matlab FDTD双路径深度解析 微带线作为高频电路设计中最常见的传输线结构之一&#xff0c;其特性阻抗的准确计算直接关系到信号完整性和系统性能。许多工程师在学习初期都会遇到一个共同困惑&#xff1a;为什么教科书公式计算结果与仿真或…...

Perplexity症状查询功能突然失效?排查清单来了:从OpenID Connect令牌过期、UMLS MetaMap服务中断到本地缓存污染的6层故障树分析

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity症状查询功能突然失效&#xff1f;排查清单来了&#xff1a;从OpenID Connect令牌过期、UMLS MetaMap服务中断到本地缓存污染的6层故障树分析 当Perplexity的症状查询接口返回 401 Unauthorized 或…...

避坑指南:STM32驱动LD3320语音模块,SPI通信和中断配置的那些‘坑’我都替你踩过了

STM32与LD3320语音模块深度避坑实战&#xff1a;从SPI配置到中断优化的完整指南 当第一次拿到LD3320语音识别模块时&#xff0c;大多数开发者都会为它的"即插即用"特性感到兴奋——理论上只需要简单的SPI连接和基础配置就能实现语音识别功能。然而在实际项目中&#…...

ArcGIS Pro脚本工具实战:5分钟用arcpy给要素批量‘改名’(保姆级参数配置指南)

ArcGIS Pro脚本工具实战&#xff1a;5分钟用arcpy给要素批量‘改名’&#xff08;保姆级参数配置指南&#xff09; 当你在处理上百个GIS图层时&#xff0c;是否曾被重复的"右键-属性-修改别名"操作折磨到崩溃&#xff1f;上周我接手一个城市管网项目&#xff0c;需要…...

告别盲调!用Keil自带的逻辑分析仪(Debug Simulator)可视化STM32引脚波形

告别盲调&#xff01;用Keil自带的逻辑分析仪(Debug Simulator)可视化STM32引脚波形 在嵌入式开发中&#xff0c;调试环节往往占据整个开发周期的40%以上时间。对于STM32开发者而言&#xff0c;传统的调试方式主要依赖LED闪烁观察或串口打印输出&#xff0c;这种方式不仅效率低…...

从FM收音机到5G基站:拆解DDS技术如何悄悄改变我们的通信设备

从FM收音机到5G基站&#xff1a;拆解DDS技术如何悄悄改变我们的通信设备 上世纪90年代&#xff0c;当人们第一次在车载收音机上按下"自动搜台"按钮时&#xff0c;很少有人意识到这个流畅体验背后隐藏着一项革命性技术——直接数字频率合成&#xff08;DDS&#xff09…...

10分钟掌握Dism++:Windows系统优化终极完整指南

10分钟掌握Dism&#xff1a;Windows系统优化终极完整指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 还在为Windows系统越来越慢而烦恼吗&#xff1f;磁盘空…...

万物智联城市:TurMass™ Mesh 打造稳定可靠的物联底座

随着数字中国建设深入推进&#xff0c;智慧城市已从概念落地为城市治理与民生服务的现实场景。从市政设施智能运维、公共安全全域感知&#xff0c;到环境监测精准布控、便民服务高效触达&#xff0c;城市运行的每一环都离不开稳定、高效、低成本的物联网连接支撑。然而&#xf…...

毕业设计 深度学习多目标跟踪 实时检测

文章目录 0 前言2 目标跟踪效果3 目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 今天学长向大家分享一个毕业设计项目 为了大家能够顺利以及最少的精力通过毕设&…...

ncmdumpGUI:专业音频解密工具实现网易云音乐跨平台播放自由

ncmdumpGUI&#xff1a;专业音频解密工具实现网易云音乐跨平台播放自由 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 在数字音乐时代&#xff0c;平台间的格…...