【蓝桥杯嵌入式】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);//关闭所有led
    HAL_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);//1hz
    F= 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){
            //led2翻转
            led_2_toggle();
            //5s后接触报警
            if(time>= 50-1){
                password_err_3 = 0;
                led_set(0x00);
                time = 0;  //5s计时清零
            }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,但是感觉led灯闪烁时间不够

    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){
            //led2翻转
            led_2_toggle();
            //5s后接触报警
            if(time>= 50-1){
                password_err_3 = 0;
                led_set(0x00);
                time = 0;  //5s计时清零
            }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 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python读取Excel根据每行信息生成一个PDF——并自定义添加文本,可用于制作准考证

文章目录 有点小bug的:最终代码(无换行):有换行最终代码无bug根据Excel自动生成PDF,目录结构如上 有点小bug的: # coding=utf-8 import pandas as pd from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter from reportlab.pdfbase import pdf…

go的orm框架-Gorm

官网文档 特点 全功能 ORM 关联 (拥有一个&#xff0c;拥有多个&#xff0c;属于&#xff0c;多对多&#xff0c;多态&#xff0c;单表继承) Create&#xff0c;Save&#xff0c;Update&#xff0c;Delete&#xff0c;Find 中钩子方法 支持 Preload、Joins 的预加载 事务&…

linux通过进程pid查询容器docker

我遇到的问题是在docker中启动了进行&#xff0c;占用显卡&#xff0c;如下nvidis-smi查看&#xff1a; 现在要查询pid16325属于哪个容器ID&#xff0c;指令&#xff1a; ps -e -o pid,cmd,comm,cgroup | grep 16325查到如下结果&#xff0c;其中12:cpuset:/docker/ 后面的 8…

Qt_Note20_QML_自定义Grid控件与OpacityMask的使用

import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 import QtGraphicalEffects 1.14Window {visible: truewidth: 640height: 480title: qsTr("Hello World")// 自定义Grid控件与OpacityMask的使用Grid {id: gridwidth: 15height: 200co…

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

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

车载以太网AVB交换机 gPTP透明时钟 6口 DB9接口 千兆车载以太网交换机

SW1100千兆车载以太网交换机 一、设备简要分析 8端口千兆和百兆混合车载以太网交换机&#xff0c;其中包含2个通道的1000BASE-T1接口&#xff0c;5通道100BASE-T1接口和1个通道1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现车载以太网多通道交换&#xff0c;千兆和百兆…

加速科技高性能数模混合信号测试设备ST2500EX精彩亮相SEMICON China 2024

芯片是现代信息技术发展的重要支柱&#xff0c;半导体设备则是芯片产业发展的重要基石。近年来&#xff0c;半导体设备领域开启了国产自研的黄金浪潮&#xff0c;其中&#xff0c;测试机作为芯片测试中至关重要的核心设备之一&#xff0c;国产自研率较低&#xff0c;一直是国内…

面试题:MySQL 事务 日志 MVCC

事务的特性 ACID 事务的隔离级别 并发事务问题 脏读&#xff1a;一个事务读到另一个事务还没有提交的数据不可重复读&#xff1a;一个事务先后读取同一条记录&#xff0c;但两次读取的数据不同幻读&#xff1a;一个事务按照条件查询数据时&#xff0c;没有对应的数据行&#xf…

微软云学习环境

微软公有云 - Microsoft Azure 本文介绍通过微软学习中心Microsoft Learn来免费试用Azure上的服务&#xff0c;也不需要绑定信用卡。不过每天只有几个小时的时间。 官网 https://docs.microsoft.com/zh-cn/learn/ 实践 比如创建虚拟机&#xff0c;看到自己的账号下多了Learn的…

FFmpeg获取视频详情

话不多说&#xff0c;直接上代码&#xff1a; pom依赖&#xff1a; <!--视频多媒体工具包 包含 FFmpeg、OpenCV--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.3</versi…

UE4_碰撞_碰撞蓝图节点——Get/Set Collision Object Type

一、get collision object type set collision object type 二、 使用方法&#xff1a; 通过对射线检测命中物体的碰撞中的对象类型object type进行判定来重新设置碰撞的对象类型&#xff0c;来更改碰撞响应的物体响应的方式。比方说一开始不让你进门&#xff0c;你可以通…

debian的使用笔记

1. XP风格任务栏 安装 debian-live-12.5.0-amd64-xfce.iso 后&#xff0c;把下面的任务栏删除&#xff0c;把上面的任务栏移到下面&#xff0c;然后设置如下选项 2. 命令自动补全 sudo apt install bash-completion 3. 找不到命令 sudo apt install command-not-found sudo…

【c++】类和对象(七)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来到类和对象的最后一部分 目录 1.static成员1.1特性 2.友元2.1引入&#xff1a;<<和>>的重载2.2友元函数2.3友元类 3.内部类4.匿名对象5.拷…

Tuxera NTFS for Mac2023绿色免费版 免费的ntfs for mac 免费读写硬盘U盘工具

Tuxera NTFS 2023 Mac免费版是款适合Mac用户使用的磁盘读写工具。Tuxera NTFS 2023 Mac可以很好的帮助用户在Mac上打开、编辑、复制、移动或删除存储在Windows NTFS格式的USB驱动器上的文件。并且Tuxera NTFS 2023 Mac还可以无阻碍地使用各种文件系统磁盘&#xff0c;还能解决磁…

【HTML】制作一个简单的动态SVG图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;该代码用于创建一个动态的SVG图形&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文…

基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站

基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站 一、安装 geoip2 扩展依赖 [rootfxkj ~]# yum install libmaxminddb-devel -y二、下载 ngx_http_geoip2_module 模块 [rootfxkj tmp]# git clone https://github.com/leev/ngx_http_geoip2_module.git三、解压模…

mysql忘记密码

起因是忘记了mysql的密码&#xff0c;cmd那里显示mysql不是内部命令&#xff0c;于是先把mysql加入到环境变量当中&#xff1a;设置-高级系统设置-环境变量-系统变量那里编辑&#xff0c;将mysql的路径加入到path当中。 然后遇到报错&#xff1a;ERROR 2003 (HY000): Cant conn…

Adobe Bridge 2024:连接创意,探索无限可能 mac/win版

Adobe Bridge 2024&#xff0c;作为Adobe家族中的一款强大的创意管理工具&#xff0c;再次革新了数字资产管理和工作流程优化的标准。这款软件不仅继承了Adobe Bridge一贯的直观界面和强大功能&#xff0c;更在多个方面进行了突破性的改进。 Bridge 2024软件获取 全面的资源管…

iOS开发进阶(十四):xcodebuild 命令应用详解

文章目录 一、前言二、xcodebuild 命令汇总三、xcodebuild 可选命令四、exportOptionsPlist文件内容配置说明五、项目实操六、拓展阅读 一、前言 关于iOS组包&#xff0c;详参博文《ReactNative进阶&#xff08;三十四&#xff09;&#xff1a;Jenkins 流水线 组包 iOS 应用包…

如何提bug?

很多公司都有提bug的标准&#xff0c;对于新人刚介入测试行业时&#xff0c;提bug的时候&#xff0c;描述的清晰与否就很重要&#xff0c;那一个很明朗清晰的bug应该包含那些呢&#xff1f; bug包含的要素有那些&#xff1f;&#xff08;以jira工具为例&#xff09; 1、项目名…