【蓝桥杯嵌入式】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

相关文章

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J