蓝桥杯嵌入式(G431)备赛笔记——第十一届第二场真题

2024-04-11 08:20

本文主要是介绍蓝桥杯嵌入式(G431)备赛笔记——第十一届第二场真题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关键代码:、

user.c:

u32 adc_tick = 0; // 定义一个无符号32位整型变量 adc_tick,用于记录上次ADC处理的时间戳
u32 r37_value = 0; // 定义一个无符号32位整型变量 r37_value,用于存储ADC通道2的采样值
u32 r38_value = 0; // 定义一个无符号32位整型变量 r38_value,用于存储ADC通道1的采样值
float r37_volt = 0; // 定义一个浮点型变量 r37_volt,用于存储ADC通道2的电压值
float r38_volt = 0; // 定义一个浮点型变量 r38_volt,用于存储ADC通道1的电压值void ADC_proc()
{if (uwTick - adc_tick < 100) // 如果当前系统时间与上次ADC处理的时间差小于100msreturn; // 退出函数,不执行ADC处理adc_tick = uwTick; // 更新ADC处理时间为当前系统时间HAL_ADC_Start(&hadc1); // 启动ADC1的转换r38_value = HAL_ADC_GetValue(&hadc1); // 获取ADC1的采样值r38_volt = r38_value * 3.3 / 4096; // 计算ADC1的电压值HAL_ADC_Start(&hadc2); // 启动ADC2的转换r37_value = HAL_ADC_GetValue(&hadc2); // 获取ADC2的采样值r37_volt = r37_value * 3.3 / 4096; // 计算ADC2的电压值
}u8 ui = 1; // 定义一个无符号8位整型变量 ui,用于控制LCD显示页面,默认值为1(数据页面)
u8 mode = 1; // 定义一个无符号8位整型变量 mode,用于控制工作模式,默认值为1(自动模式)
u8 pa6_duty = 10; // 定义一个无符号8位整型变量 pa6_duty,用于控制PWM输出占空比,默认值为10
u8 pa7_duty = 10; // 定义一个无符号8位整型变量 pa7_duty,用于控制PWM输出占空比,默认值为10void KEY_proc()
{// 处理按键操作,包括单击、长按、双击等情况// 如果按键1单次按下if (single_key_flag[0] == 1){ui += 1; // 控制 LCD 显示页面切换if (ui >= 3)ui = 1; // 循环切换到第一页LCD_Clear(Black); // 清除LCD屏幕single_key_flag[0] = 0; // 清除按键1单击标志}// 如果按键2单次按下if (single_key_flag[1] == 1){if (ui == 2 && mode == 2) // 如果当前在参数页面且为手动模式{pa6_duty += 10; // 调节 PA6 的占空比,步进值为 10if (pa6_duty >= 100)pa6_duty = 10; // 循环设置占空比__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty); // 设置 TIM16 的通道1的PWM占空比single_key_flag[1] = 0; // 清除按键2单击标志}else{single_key_flag[1] = 0; // 清除按键2单击标志}}// 如果按键3单次按下if (single_key_flag[2] == 1){if (ui == 2 && mode == 2) // 如果当前在参数页面且为手动模式{pa7_duty += 10; // 调节 PA7 的占空比,步进值为 10if (pa7_duty >= 100)pa7_duty = 10; // 循环设置占空比__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, pa7_duty); // 设置 TIM17 的通道1的PWM占空比single_key_flag[2] = 0; // 清除按键3单击标志}else{single_key_flag[2] = 0; // 清除按键3单击标志}}// 如果按键4单次按下if (single_key_flag[3] == 1){mode += 1; // 切换工作模式if (mode >= 3)mode = 1; // 循环切换工作模式single_key_flag[3] = 0; // 清除按键4单击标志}
}u8 pa6_duty_manu = 0; // 定义一个无符号8位整型变量 pa6_duty_manu,用于手动模式下控制PWM输出占空比
u8 pa7_duty_manu = 0; // 定义一个无符号8位整型变量 pa7_duty_manu,用于手动模式下控制PWM输出占空比void PWM_AUTO()
{if (mode == 1) // 如果当前工作模式为自动模式{pa6_duty_manu = r37_volt * 1000 / 33; // 根据ADC2的电压值计算PWM输出占空比pa7_duty_manu = r37_volt * 1000 / 33; // 根据ADC2的电压值计算PWM输出占空比__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty_manu); // 设置TIM16通道1的PWM占空比__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, pa7_duty_manu); // 设置TIM17通道1的PWM占空比}
}u8 led_num = 0; // 定义一个无符号8位整型变量 led_num,用于控制LED显示
u32 led_tick = 0; // 定义一个无符号32位整型变量 led_tick,用于记录上次LED处理的时间戳void LED_proc ()
{if (uwTick - led_tick < 100) // 如果当前系统时间与上次LED处理的时间差小于100msreturn; // 退出函数,不执行LED操作led_tick = uwTick; // 更新LED处理时间为当前系统时间if (mode == 1) // 如果当前工作模式为自动模式led_num |= 0x01; // 设置 led_num 的最低位为1,表示LED1亮;其他位保持不变else // 如果当前工作模式为手动模式led_num &= ~0x01; // 设置 led_num 的最低位为0,表示LED1灭;其他位保持不变if (ui == 1) // 如果当前LCD显示页面为数据页面led_num |= 0x02; // 设置 led_num 的次低位为1,表示u32 lcd_tick = 0;void Disp_proc()
{// 检查距离上次LCD更新是否已经超过100msif (uwTick - lcd_tick < 100)return; // 如果未超过100ms,则不执行LCD更新操作lcd_tick = uwTick; // 更新LCD更新计时器// 根据当前页面选择更新LCD显示内容if (ui == 1){u8 text[50];// 在第一行显示日期sprintf(text, "      DATE        ");LCD_DisplayStringLine(Line1, (unsigned char *)text);// 在第三行显示电压值sprintf(text, "    V:%.2f V      ", r37_volt);LCD_DisplayStringLine(Line3, (unsigned char *)text);// 根据工作模式在第五行显示模式信息if (mode == 1){sprintf(text, "    Mode:AUTO     ");LCD_DisplayStringLine(Line5, (unsigned char *)text);}else if (mode == 2){sprintf(text, "    Mode:MANU     ");LCD_DisplayStringLine(Line5, (unsigned char *)text);}}else if (ui == 2){u8 text[50];// 在第一行显示参数页面标题sprintf(text, "      Para        ");LCD_DisplayStringLine(Line1, (unsigned char *)text);// 根据工作模式显示对应参数值if (mode == 1){// 如果为自动模式,则显示自动模式下的参数值sprintf(text, "    PA6:%d        ", pa6_duty_manu);LCD_DisplayStringLine(Line3, (unsigned char *)text);sprintf(text, "    PA7:%d        ", pa7_duty_manu);LCD_DisplayStringLine(Line5, (unsigned char *)text);}else if (mode == 2){// 如果为手动模式,则显示手动模式下的参数值sprintf(text, "    PA6:%d        ", pa6_duty);LCD_DisplayStringLine(Line3, (unsigned char *)text);sprintf(text, "    PA7:%d        ", pa7_duty);LCD_DisplayStringLine(Line5, (unsigned char *)text);}}
}

main.c:

int main(void)
{/* USER CODE BEGIN 1 */// 用户自定义代码段1/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*/// MCU配置/* Reset of all peripherals, Initializes the Flash interface and the Systick. */// 重置所有外设,初始化Flash接口和SystickHAL_Init();/* USER CODE BEGIN Init */// 用户自定义初始化代码段/* USER CODE END Init *//* Configure the system clock */// 配置系统时钟SystemClock_Config();/* USER CODE BEGIN SysInit */// 用户自定义系统初始化代码段/* USER CODE END SysInit *//* Initialize all configured peripherals */// 初始化所有配置的外设MX_GPIO_Init();MX_TIM3_Init();MX_TIM16_Init();MX_TIM17_Init();MX_ADC1_Init();MX_ADC2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */// 用户自定义代码段2LED_disp (0); // LED显示初始化HAL_TIM_Base_Start_IT(&htim3); // 启动定时器3并使能中断LCD_Init(); // LCD屏幕初始化HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1); // 启动TIM16通道1的PWM输出HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1); // 启动TIM17通道1的PWM输出/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */// 无限循环LCD_Clear(Black); // 清屏,背景色为黑色LCD_SetBackColor(Black); // 设置背景色为黑色LCD_SetTextColor(White); // 设置字体颜色为白色while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */// 用户自定义循环后代码段ADC_proc(); // ADC数据处理PWM_AUTO(); // PWM输出控制KEY_proc(); // 按键处理LED_proc (); // LED控制Disp_proc (); // 显示处理}/* USER CODE END 3 */
}

LED显示状态:

u8 led_num = 0; // 定义一个无符号8位整型变量 led_num,初始化为 0
u32 led_tick = 0; // 定义一个无符号32位整型变量 led_tick,初始化为 0void LED_proc()
{if (uwTick - led_tick < 100) // 如果当前系统时间与上次 LED 操作时间的时间差小于 100msreturn; // 退出函数,不执行 LED 操作led_tick = uwTick; // 更新 LED 操作时间为当前系统时间if (mode == 1) // 如果 mode 变量的值为 1led_num |= 0x01; // 将 led_num 的最低位设置为 1,即使 led_num 保持原值的其他位不变else // 否则(mode 不为 1)led_num &= ~0x01; // 将 led_num 的最低位设置为 0,其他位保持不变if (ui == 1) // 如果 ui 变量的值为 1led_num |= 0x02; // 将 led_num 的次低位设置为 1,其他位保持不变else // 否则(ui 不为 1)led_num &= ~0x02; // 将 led_num 的次低位设置为 0,其他位保持不变LED_disp(led_num); // 调用 LED_disp 函数,根据 led_num 的值控制 LED 的显示
}

|= 是 C 语言中的赋值运算符,表示按位或运算并赋值。具体来说,它将左边的变量与右边的值进行按位或运算,然后将结果赋值给左边的变量。

例如,led_num |= 0x01; 就是将 led_num 的当前值与 0x01 进行按位或运算,然后将结果赋值给 led_num。这会将 led_num 的最低位(即二进制的最右边一位)设置为 1,而其他位保持不变。

"&=" 是一个赋值运算符,它结合了按位与运算符 "&" 和赋值运算符 "="。它的作用是将左操作数和右操作数进行按位与运算,并将结果赋值给左操作数。而 "~" 是按位取反运算符,它将操作数的每一位取反,即将 0 变为 1,将 1 变为 0。

因此,led_num &= ~0x01; 表示将 led_num 的值与 0x01(二进制为 0000 0001)进行按位与运算,然后将结果赋值给 led_num。具体地,它会将 led_num 的最低位清零,其他位保持不变。

自动模式下的ADC:

void PWM_AUTO()
{if (mode == 1) // 如果当前工作模式为自动模式{pa6_duty_manu = r37_volt * 1000 / 33; // 根据ADC2的电压值计算PWM输出占空比pa7_duty_manu = r37_volt * 1000 / 33; // 根据ADC2的电压值计算PWM输出占空比__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty_manu); // 设置TIM16通道1的PWM占空比__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, pa7_duty_manu); // 设置TIM17通道1的PWM占空比}
}

完整工程:

https://download.csdn.net/download/WYW35416/89114759?spm=1001.2014.3001.5501&ydreferer=aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dZVzM1NDE2P3NwbT0xMDExLjI0MTguMzAwMS41MzQz

这篇关于蓝桥杯嵌入式(G431)备赛笔记——第十一届第二场真题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓