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

【蓝桥杯嵌入式】13届程序题刷题记录及反思

 一、题目分析

考察内容:

  • led
  • 按键(短按)
  • PWM输出(PA1)
  • 串口接收
  • lcd显示

根据PWM输出占空比调节,高频与低频切换

串口接收(指令解析)【中断接收】

2个显示界面

led灯闪烁定时器

二、Usr.c

/* Includes ------------------------------------------------------------------*/
#include "usr.h"
#include "usart.h"
/* values --------------------------------------------------------------------*/
struct keys key[4]={0,0,0,0};
uint8_t menu = 0;
uint8_t password_valid = 0;//密码有效信号
uint8_t password_err_3 = 0;//密码3次及以上输入错误信号
uint8_t password_err_time = 0;//密码3次及以上输入错误次数
uint8_t B1 = '@';
uint8_t B2 = '@';
uint8_t B3 = '@';
uint16_t F = 1000;
uint16_t D = 50;
uint16_t password = 123;//密码
/* define --------------------------------------------------------------------*/
#define MENU_PSD 0
#define MENU_STA 1/*----------------------------------------------------------------------------*/
void led_set(uint8_t led_dis)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//关闭所有ledHAL_GPIO_WritePin(GPIOC,led_dis<<8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void led_2_toggle(void){HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}//key_control
void key_control(void)
{if(key[0].single_flag == 1){key[0].single_flag = 0;//仅在PSD有效if(menu == MENU_PSD){if(B1 == '@'){B1 = '0';}else{B1++;if(B1>'9'){B1 = '0';}}}}else if(key[1].single_flag == 1){key[1].single_flag = 0;if(menu == MENU_PSD){if(B2 == '@'){B2 = '0';}else{B2++;if(B2>'9'){B2 = '0';}}}}else if(key[2].single_flag == 1){key[2].single_flag = 0;if(menu == MENU_PSD){if(B3 == '@'){B3 = '0';}else{B3++;if(B3>'9'){B3 = '0';}}}  }else if(key[3].single_flag == 1){       //密码输入完成确认key[3].single_flag = 0;//此处要写密码判断if((B1-'0')*100+(B2-'0')*10+(B3-'0') == password){password_valid = 1;}else{password_err_time ++;}if(password_valid == 1){menu = MENU_STA;password_err_3 = 0;password_err_time = 0;//输入成功将err次数清0}else{B1 ='@';B2 ='@';B3 ='@';if(password_err_time >= 3){password_err_3 = 1;}}}else{key[0].long_flag = 0;key[1].long_flag = 0;key[2].long_flag = 0;key[3].long_flag = 0;}
}
void dispaly_init(void){LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);
}
void menu_display(void)
{char text[30]={NULL};if(menu == MENU_PSD){sprintf(text,"       PSD           ");LCD_DisplayStringLine(Line1,(u8*)text);sprintf(text,"    B1:%c     ",B1);LCD_DisplayStringLine(Line3,(u8*)text);sprintf(text,"    B2:%c     ",B2);LCD_DisplayStringLine(Line4,(u8*)text);sprintf(text,"    B3:%c     ",B3);LCD_DisplayStringLine(Line5,(u8*)text);}else{fre_2hz_duty_10_set();sprintf(text,"       STA           ");LCD_DisplayStringLine(Line1,(u8*)text);sprintf(text,"    F:%d",F);LCD_DisplayStringLine(Line3,(u8*)text);sprintf(text,"    D:%d",D);LCD_DisplayStringLine(Line4,(u8*)text);LCD_ClearLine(Line5);}
}//2hz
void fre_2hz_duty_10_set(void)
{F= 2000;D =10;__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,100-1);//占空比百分之10__HAL_TIM_SET_PRESCALER(&htim2,40-1);//2hz
}
//1hz 50%
void fre_1hz_duty_50_set(void){__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,500-1);//占空比百分之50__HAL_TIM_SET_PRESCALER(&htim2,80-1);//1hzF= 2000;D = 50;
}//定时器中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){key[0].key_sta = HAL_GPIO_ReadPin(B1_Port,B1_Pin);key[1].key_sta = HAL_GPIO_ReadPin(B2_Port,B2_Pin);key[2].key_sta = HAL_GPIO_ReadPin(B3_Port,B3_Pin);key[3].key_sta = HAL_GPIO_ReadPin(B4_Port,B4_Pin);for(uint8_t i =0;i<4;i++){switch(key[i].judge_sta){case 0:{if(key[i].key_sta == 0){key[i].judge_sta = 1;key[i].key_time = 0;}else {key[i].judge_sta = 0;}}break;case 1:{if(key[i].key_sta == 0){key[i].judge_sta = 2;}else{key[i].judge_sta = 0;}}break;case 2:{if(key[i].key_sta == 1){if(key[i].key_time< Short_time){key[i].single_flag = 1;key[i].judge_sta = 0;}}else{key[i].key_time++;if(key[i].key_time > Long_time){key[i].long_flag = 1;key[i].judge_sta = 0;}}}break;}}}if(htim->Instance == TIM7){static uint16_t time = 0;if(password_valid == 1){password_err_3 = 0;led_set(0x01);F= 2000;fre_2hz_duty_10_set();if(time>= 50-1){password_valid = 0;led_set(0x00);time = 0;menu = MENU_PSD;B1 = '@';B2 = '@';B3 = '@';}else{time ++;}}else if(password_err_3 == 1){static uint8_t cnt = 0;cnt ++;cnt %= 2;//led2翻转if(cnt == 0){led_set(0x02);}else{led_set(0x00);}//5s后接触报警if(time>= 50-1){password_err_3 = 0;led_set(0x00);time = 0;  //5s计时清零cnt = 0;}else{time ++;   //计时++}F= 1000;fre_1hz_duty_50_set();//方波1hz}else{time = 0;fre_1hz_duty_50_set();//方波1hz}                     }}//串口接收完成中断回调服务函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){led_set(0xaa);if(((recevie[0]-'0')*100+(recevie[1]-'0')*10+(recevie[2]-'0') == password)&&(recevie[3]) == '-'){password = (recevie[4]-'0')*100+(recevie[5]-'0')*10+(recevie[6]-'0');}HAL_UART_Receive_IT(&huart1,recevie,7);}
}

三、Usr.h

#ifndef __USR_H__
#define __USR_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "lcd.h"
#include "stdio.h"
#include "tim.h"
/* extern --------------------------------------------------------------------*/
extern uint8_t recevie[7];
//key    
struct keys{uint8_t judge_sta;uint8_t key_sta;uint8_t single_flag;uint8_t long_flag;uint8_t key_time;
};
/*key define-------------------------------------------------------------------*/   
#define B1_Port GPIOB
#define B2_Port GPIOB
#define B3_Port GPIOB  
#define B4_Port GPIOA#define B1_Pin  GPIO_PIN_0
#define B2_Pin  GPIO_PIN_1
#define B3_Pin  GPIO_PIN_2   
#define B4_Pin  GPIO_PIN_0#define Long_time  200   //2s
#define Short_time 50    //0.5s//led
void led_set(uint8_t led_dis);void led_2_toggle(void);
//key_control
void key_control(void);
void dispaly_init(void);
void menu_display(void);
void fre_2hz_duty_10_set(void);#ifdef __cplusplus
}
#endif
#endif 

四、串口中断接收

本题目要求接收7个ASCII码字符

定义uint8_t 类型接收数组

uint8_t recevie[7];

在while(1)前开启串口接收中断函数,接收7个字符后进入中断服务函数

HAL_UART_Receive_IT(&huart1,recevie,7);

 根据中断类型,调用中断回调函数

下面展示中断服务函数

//串口接收完成中断回调服务函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){led_set(0xaa);if(((recevie[0]-'0')*100+(recevie[1]-'0')*10+(recevie[2]-'0') == password)&&(recevie[3]) == '-'){password = (recevie[4]-'0')*100+(recevie[5]-'0')*10+(recevie[6]-'0');}HAL_UART_Receive_IT(&huart1,recevie,7);}
}

五、LED灯闪烁问题

计时应该是正确的5s

    if(htim->Instance == TIM7){static uint16_t time = 0;if(password_valid == 1){password_err_3 = 0;led_set(0x01);F= 2000;fre_2hz_duty_10_set();if(time>= 50-1){password_valid = 0;led_set(0x00);time = 0;menu = MENU_PSD;B1 = '@';B2 = '@';B3 = '@';}else{time ++;}}else if(password_err_3 == 1){static uint8_t cnt = 0;cnt ++;cnt %= 2;//led2翻转if(cnt == 0){led_set(0x02);}else{led_set(0x00);}//5s后接触报警if(time>= 50-1){password_err_3 = 0;led_set(0x00);time = 0;  //5s计时清零cnt = 0;}else{time ++;   //计时++}F= 1000;fre_1hz_duty_50_set();//方波1hz}else{time = 0;fre_1hz_duty_50_set();//方波1hz}                     }

六、 总结

本次只写一个usr.c usr.h,发现确实方便了许多!!相较于14届难度较小

比照LCD的cubemx配置引脚的时候,记得配置PD2(led锁存器引脚)

复制其他.h时后记得更改预编译

#ifndef __USR_H__        //记得更改
#define __USR_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"#ifdef __cplusplus
}
#endif
#endif 

如果没有改为__USR_H__,跳转函数跳转不进去usr.c文件,会显示C99_warning 

相关文章:

【蓝桥杯嵌入式】13届程序题刷题记录及反思

一、题目分析 考察内容&#xff1a; led按键&#xff08;短按&#xff09;PWM输出&#xff08;PA1&#xff09;串口接收lcd显示 根据PWM输出占空比调节&#xff0c;高频与低频切换 串口接收&#xff08;指令解析&#xff09;【中断接收】 2个显示界面 led灯闪烁定时器 二…...

C++类 单例模式

例子 请看如下的类和调用&#xff1a; 在您提供的代码片段中&#xff0c;CPathPlanMan 类使用了一个单例模式&#xff0c;这意味着这个类只需要一个实例&#xff0c;并且提供了全局访问点来获取这个实例。这通常用于控制对一个类实例的访问&#xff0c;尤其是在创建实例代价昂…...

prompt 工程案例

目录 prompt 工程是什么&#xff1f; 案例 vllm 推理加速框架 prompt 工程是什么&#xff1f; prompt&#xff1a;提示词&#xff0c;也就是我们使用网页版输入给大模型的内容就叫 prompt&#xff0c;那什么是 prompt 工程呢&#xff1f; 简单理解其实就是利用编写的 prom…...

燃气管网安全运行监测系统功能介绍

燃气管网&#xff0c;作为城市基础设施的重要组成部分&#xff0c;其安全运行直接关系到居民的生命财产安全和城市的稳定发展。然而&#xff0c;随着城市规模的不断扩大和燃气使用量的增加&#xff0c;燃气管网的安全运行面临着越来越大的挑战。为了应对这些挑战&#xff0c;燃…...

正则表达式(2)

文章目录 专栏导读1、贪婪与非贪婪2、转义匹配 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对大学生、初级数据分析工程师精…...

xv6源码分析 001

xv6源码分析 001 我们先看看xv6这个项目的基本结构&#xff08;只看代码部分&#xff09; 主要就是两个目录kernel 和 user。 user是一些用户程序&#xff0c;也就是我们平时在shell上面执行的命令&#xff0c;每执行一个命令就会创建一个新的用户进程来执行这个命令 在user目…...

90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装)

目录 摘要...

JS代码小知识(个人向)

JS 对象转数组 let obj {0:"a",1:"b",length:2 //加上这个就能转了 }; console.log(Array.from(obj)); // ["a", "b"] 数组的拼接 let a ["a","b"] let b ["c","d"] let c [...a , …...

MC34119

这份文件是关于MC34119线性集成电路的产品规格说明书&#xff0c;由Unisonic Technologies Co., Ltd生产。MC34119是一款低功耗音频放大器IC&#xff0c;主要用于电话应用&#xff0c;如扬声器电话。以下是该文件的核心内容概要&#xff1a; 产品描述&#xff1a; MC34119是一款…...

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现 文章目录 RabbitMQ3.13.x之十_流过滤的内部结构设计与实现1. 概念1. 消息发布2. 消息消费 2. 流的结构1. 在代理端进行过滤2. 客户端筛选3. JavaAPI示例4. 流过滤配置5. AMQP上的流过滤6. 总结 3. 相关链接 1. 概念 流过滤的思…...

Node爬虫:原理简介

在数字化时代&#xff0c;网络爬虫作为一种自动化收集和分析网络数据的技术&#xff0c;得到了广泛的应用。Node.js&#xff0c;以其异步I/O模型和事件驱动的特性&#xff0c;成为实现高效爬虫的理想选择。然而&#xff0c;爬虫在收集数据时&#xff0c;往往面临着诸如反爬虫机…...

Python如何解决“滑动拼图”验证码(8)

前言 本文是该专栏的第67篇,后面会持续分享python爬虫干货知识,记得关注。 做过爬虫项目的同学,或多或少都会接触到一些需要解决验证码才能正常获取数据的平台。 在本专栏之前的文章中,笔者有详细介绍通过python来解决多种“验证码”(点选验证,图文验证,滑块验证,滑块…...

MongoDB 启动异常

Failed to start up WiredTiger under any compatibility version. 解决方案: 删除WiredTiger.lock 和 mongod.lock两个文件&#xff0c;在重新启动。回重新生成新的文件。...

mysql 常见数据处理 dml

学习完&#xff0c;mysql正则表达式查询&#xff0c;把常见的数据处理&#xff0c;做一个汇总&#xff0c;便于查看。 数据操纵语言&#xff08;Data Manipulation Language, DML&#xff09;。 1&#xff0c;新增数据&#xff1a; 1&#xff0c;单个插入&#xff1a; insert…...

课时86:流程控制_函数基础_函数退出

2.1.2 函数退出 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 我们可以将函数代码块&#xff0c;看成shell脚本内部的小型脚本&#xff0c;所以说函数代码块也会有执行状态返回值。对于函数来说&#xff0c;它通常支持两种种状态返回…...

【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案

【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天寸铁…...

9(10)-1(2)-CSS 布局模型+CSS 浮动

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 一、CSS 布局模型1 流动模型&#xff08;标准流&#xff09; 二、CSS 浮动1 浮…...

RISC-V GNU Toolchain 工具链安装问题解决(含 stdio.h 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…...

[C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体

关于C版本帧差法可以参考博客 [C]OpenCV基于帧差法的运动检测-CSDN博客https://blog.csdn.net/FL1768317420/article/details/137397811?spm1001.2014.3001.5501 我们将参考C版本转成opencvsharp版本。 帧差法&#xff0c;也叫做帧间差分法&#xff0c;这里引用百度百科上的…...

Android Studio学习8——点击事件

在xml代码中绑定 在java代码中绑定 弹出一个toast 随机&#xff0c;数组...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...