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

相关文章

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短