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

2024-04-03 02:28

本文主要是介绍【蓝桥杯嵌入式】11届程序题刷题记录及反思,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目介绍

 按键输入:短按

模拟电压输出:ADC

LCD显示

PWM输出:PA6,PA7

二、usr.c

#include "usr.h"
#include "lcd.h"
#include "stdio.h"
#include "tim.h"
#include "adc.h"
/*value-------------------------------------------------*/
uint8_t menu = 0;
uint8_t mode = 0;
float V;/*define------------------------------------------------*/
#define MENU_DATA 0
#define MENU_PARA 1#define MODE_AUTO 0
#define MODE_MANU 1
/*define */
#define B4_Pin GPIO_PIN_0
#define B4_GPIO_Port GPIOA
#define B1_Pin GPIO_PIN_0
#define B1_GPIO_Port GPIOB
#define B2_Pin GPIO_PIN_1
#define B2_GPIO_Port GPIOB
#define B3_Pin GPIO_PIN_2
#define B3_GPIO_Port GPIOB
/*define */
#define KEY_LONG_TIME  200
#define KEY_SHORT_TIME 50
/*define */
#define PA7_BASE (500-1)
#define PA6_BASE (1000-1)
#define PA6_BUJIN 1000
#define PA7_BUJIN 500struct keys key[4]={0,0,0,0};
float PA6_duty = 10;
float PA7_duty = 10;
//led
void led_set(uint8_t display)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,display<<8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
//display
void display_init(void)
{LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);
}
void menu_display(void)
{uint8_t text[25];if(menu == MENU_DATA){sprintf((char*)text,"      Data          ");LCD_DisplayStringLine(Line0,text);sprintf((char*)text,"    V:%.2f",V);LCD_DisplayStringLine(Line2,text);if(mode == MODE_MANU)  {sprintf((char*)text,"    Mode:MANU       ");}else {sprintf((char*)text,"    Mode:AUTO       ");}LCD_DisplayStringLine(Line4,text);}else if(menu == MENU_PARA){sprintf((char*)text,"      Para          ");LCD_DisplayStringLine(Line0,text);if(mode == MODE_AUTO){sprintf((char*)text,"    PA6:%.f%%            ",PA6_duty*100);LCD_DisplayStringLine(Line2,text);sprintf((char*)text,"    PA7:%.f%%            ",PA7_duty*100);LCD_DisplayStringLine(Line4,text);}else{sprintf((char*)text,"    PA6:%.f%%            ",PA6_duty);LCD_DisplayStringLine(Line2,text);sprintf((char*)text,"    PA7:%.f%%            ",PA7_duty);LCD_DisplayStringLine(Line4,text);}}                                                             if((mode == MODE_AUTO)&&(menu == MENU_DATA)){led_set(0x03);}else if((mode != MODE_AUTO)&&(menu == MENU_DATA)){led_set(0x02);}else if((mode == MODE_AUTO)&&(menu == MENU_PARA)){led_set(0x01);}else if((mode == MODE_MANU)&&(menu == MENU_PARA)){led_set(0x00);}                                                  if(mode == MODE_AUTO){PA6_duty = V/3.3;PA7_duty = V/3.3; if(V <= 0){__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,0);                  __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,0);}else if(V >= 3.3){__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,5000-1);__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,10000-1);}else{__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,10000*PA6_duty - 1);__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,5000*PA7_duty - 1);}}
}
void get_ADCvalue()
{HAL_ADC_Start(&hadc2);uint32_t val = HAL_ADC_GetValue(&hadc2);V = val*3.3/(4096.0-1.0);
}//按键控制函数
void key_proc(void)
{get_ADCvalue();         //adc获取电压值if(key[0].single_flag == 1){key[0].single_flag = 0;menu ++;if(menu > 1){menu = MENU_DATA;}}else if(key[1].single_flag == 1){key[1].single_flag = 0;//PA6占空比调整static uint8_t num_pa6 = 0;num_pa6 ++;num_pa6 %= 9;PA6_duty = (num_pa6 + 1)*10;__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,PA6_BASE+num_pa6*PA6_BUJIN);}else if(key[2].single_flag == 1){key[2].single_flag = 0;//PA7占空比调整static uint8_t num_pa7 = 0;num_pa7 ++;num_pa7 %= 9;PA7_duty = (num_pa7 + 1)*10;__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,PA7_BASE+num_pa7*PA7_BUJIN);}else if(key[3].single_flag == 1){key[3].single_flag = 0;mode ++;if(mode > MODE_MANU){mode = MODE_AUTO;}}
}
//定时器中断服务回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim -> Instance == TIM6){key[0].key_sta = HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin);key[1].key_sta = HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin);key[2].key_sta = HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin);key[3].key_sta = HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin);for(uint8_t i = 0;i < 4;i++){switch(key[i].key_judge_sta){case 0:{if(key[i].key_sta == 0){key[i].key_judge_sta = 1;}else{key[i].key_judge_sta = 0;} }break;case 1:{if(key[i].key_sta == 0){key[i].key_judge_sta = 2;}else{key[i].key_judge_sta = 0;}}break;case 2:{if(key[i].key_sta == 1){key[i].key_judge_sta = 0;key[i].single_flag = 1;}}break;}}}}

三、usr.h

#ifndef __USR_H__
#define __USR_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* struct --------------------------------------------------------------------*/    
struct keys{uint8_t single_flag;// uint8_t long_flag;uint8_t key_sta;uint8_t key_judge_sta;uint8_t key_time;
};void led_set(uint8_t display);
//display
void display_init(void);
void menu_display(void);    
void display_init(void);   
//按键控制函数
void key_proc(void);    #ifdef __cplusplus
}
#endif
#endif 

四、 开启函数

  LCD_Init();display_init();led_set(0x00);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);  //PA6--PWM输出HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1); //PA7--PWM输出HAL_TIM_Base_Start_IT(&htim6);            //开启按键扫描函数

五、while内容 

      menu_display();
      key_proc();

六、总结

虽然只有PWM输出,但是在比赛中也最好也写输入捕获,来查看pwm输出是否频率和占空比是否正确

这篇关于【蓝桥杯嵌入式】11届程序题刷题记录及反思的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871684

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

基于Spring Boot 的小区人脸识别与出入记录管理系统功能

《基于SpringBoot的小区人脸识别与出入记录管理系统功能》文章介绍基于SpringBoot框架与百度AI人脸识别API的小区出入管理系统,实现自动识别、记录及查询功能,涵盖技术选型、数据模型... 目录系统功能概述技术栈选择核心依赖配置数据模型设计出入记录实体类出入记录查询表单出入记录 VO 类(用于

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr