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

news2025/4/6 8:13:54

关键代码:、

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处理的时间差小于100ms
        return; // 退出函数,不执行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输出占空比,默认值为10

void 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 的占空比,步进值为 10
            if (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 的占空比,步进值为 10
            if (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处理的时间差小于100ms
        return; // 退出函数,不执行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更新是否已经超过100ms
    if (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接口和Systick
  HAL_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 */
  // 用户自定义代码段2
	LED_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,初始化为 0

void LED_proc()
{
    if (uwTick - led_tick < 100) // 如果当前系统时间与上次 LED 操作时间的时间差小于 100ms
        return; // 退出函数,不执行 LED 操作
    led_tick = uwTick; // 更新 LED 操作时间为当前系统时间

    if (mode == 1) // 如果 mode 变量的值为 1
        led_num |= 0x01; // 将 led_num 的最低位设置为 1,即使 led_num 保持原值的其他位不变
    else // 否则(mode 不为 1)
        led_num &= ~0x01; // 将 led_num 的最低位设置为 0,其他位保持不变

    if (ui == 1) // 如果 ui 变量的值为 1
        led_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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI常见关键术语

哈喽&#xff0c;大家好&#xff0c;我是小码哥&#xff0c;人工智能技术的快速发展带来了许多专业术语&#xff0c;这些词汇对于理解AI的工作原理和应用至关重要。以下是一些关键的AI术语&#xff0c;以及它们的专业解释和通俗总结。 一、核心概念 人工智能 (AI) 专业解释&am…

轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 &#xff0c;进行轻量带屏开发板的标准移植&#xff0c;开发了智能开关面板样例&#xff0c;同时实现了ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF等部件基于OpenHarmony LiteOS-M内…

AI预测体彩排3第3弹【2024年4月14日预测--第1套算法开始计算第3次测试】

今天咱们继续测试第1套算法和模型&#xff0c;今天是第3次测试&#xff0c;目前的测试只是为了记录和验证&#xff0c;不建议大家盲目跟买。我的目标仍旧是10次命中3-4次!~废话不多说了&#xff0c;直接上结果&#xff01; 2024年4月14日排3的七码预测结果如下 第一套&…

mybatis的一对多

业务&#xff1a;通常主表从表 查询&#xff0c;一对多关系&#xff0c;通常是先查主表&#xff0c;然后拿主表的 关联字段与从表关联。在代码中 通常用for 循环等方法给 从表的数据赋值&#xff0c;很麻烦&#xff0c;&#xff0c;&#xff0c;很麻烦。。。。 用mybatis的…

软考中级--网络工程师-计算机基础与理论第二节无线基础知识

IEEE802.11 规定了多种 WLAN 通信标准&#xff0c;其中&#xff08; &#xff09;与其他标准采用的频段不同&#xff0c;因而不能兼容。 A IEEE802.11a B IEEE802.11b C IEEE802.11g D IEEE802.11n 试题答案 正确答案&#xff1a; A 答案解析 IEEE 802.11a规定采用5GHz的 ISM频…

Python | Leetcode Python题解之第25题K个一组翻转链表

题目&#xff1a; 题解&#xff1a; class Solution:# 翻转一个子链表&#xff0c;并且返回新的头与尾def reverse(self, head: ListNode, tail: ListNode):prev tail.nextp headwhile prev ! tail:nex p.nextp.next prevprev pp nexreturn tail, headdef reverseKGroup…

关于时频分析的一些事-答知乎问(一)

从信号的时频谱图中可以提取什么特征&#xff1f; 基于时频谱图的特征一般包括能量特征、时域和频域拓展特征以及时频内禀特征。 基于时频图的能量特征 基于时频图的特征中&#xff0c;能量特征是最简单的一种&#xff0c;通过分析时频谱图中的能量分布特性而获取信号的时频…

振兴国腾GM8775C MIPIDSI桥接到双 PORT LVDS

GM8775C描述&#xff1a; GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单 / 双通道 LVDS 功能&#xff0c;MIPI 支持 1/2/3/4 通道可选&#xff0c;每通道最高支持 1Gbps 速率&#xff0c;最大支持 4Gbps 速率。LVDS 时钟频率高达 154MHz &a…

SqlServer专题

目录 1&#xff0c;连接数据库 2&#xff0c;连接池 1.何为连接池&#xff1f; 2.连接池运行原理。 3.如何查看连接池&#xff1f; 4.连接池注意事项。 3&#xff0c;一般SQL语句。 4&#xff0c;控制语句 1.判断语句 2.循环语句 5&#xff0c;视图 1.使用…

vue-router 原理【详解】hash模式 vs H5 history 模式

hash 模式 【推荐】 路由效果 在不刷新页面的前提下&#xff0c;根据 URL 中的 hash 值&#xff0c;渲染对应的页面 http://test.com/#/login 登录页http://test.com/#/index 首页 核心API – window.onhashchange 监听 hash 的变化&#xff0c;触发视图更新 window.onhas…

黑马 javaweb 实现小案例

黑马 javaweb 实现案例 环境搭建 配置文件代码&#xff1a; spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/demo0413username: rootpassword: 123456mybatis:configuration:#配置mybatis的日志, 指定输出到控制台log-impl…

Java-博客系统(前后端交互)

目录 前言 博客系统基本情况 1 创建项目&#xff0c;引入依赖 2 数据库设计 2.1 分析 2.2 建库建表 3 封装数据库 3.1 在java目录下创建DBUtil类&#xff0c;通过这个类对数据库进行封装 3.2 在java目录下创建实体类&#xff08;博客类Blog&#xff09; 3.2 在java目录下创建…

Python里安装了库却报错找不到是怎么回事?

你在写代码的时候有没有遇到过这样的问题&#xff1a; 明明已经用pip安装好了一个Python模块&#xff0c; 但当你在代码中使用时&#xff0c;却给你报错说找不到这个库。 出现这种情况&#xff0c;绝大多数都是因为你安装模块的那个pip&#xff0c;和你执行代码时的python&…

机器学习—特征预处理和降维(四)

什么是特征预处理&#xff1f; 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程 1包含内容 数值型数据的无量纲化&#xff1a; 归一化标准化 2特征预处理API sklearn. preprocessing为什么要进行归一化 or 标准化&#xff1f; 特征的单位或者大小相差较大…

UDP实现Mini版在线聊天室

实现原理 只有当客户端先对服务器发送online消息的时候&#xff0c;服务器才会把客户端加入到在线列表。当在线列表的用户发消息的时候&#xff0c;服务器会把消息广播给在线列表中的所有用户。而当用户输入offline时&#xff0c;表明自己要下线了&#xff0c;此时服务器把该用…

keil参数删除后补写没有代码提示

代码提示快捷键 ctrlalt空格 如果按了之后没有提示&#xff0c;那说明跟输入法的快捷键冲突了。

C++引用和右值引用

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

【vue】toRef,toRefs

toRef&#xff1a;把一个 响应式对象 转换为对应的ref变量toRefs&#xff1a;把一个 响应式对象 转换为对应的ref对象 代码 <template><P>mname: {{ mname }} </P><P>mage: {{ mage }} </P><P>msex: {{ msex }} </P><P>mhobb…

c语言中<string.h>的strstr与strtok函数

c语言中string.h的strstr与strtok函数 代码运行结果 代码 #include <stdio.h> #include <string.h>///1.在字符串str1里面,查找第一次出现str2的位置 //char * strstr(const char * str1,const char * str2)///2.sep为分割符,根据分割符来对str进行分割 //char * …

【计算机毕业设计】基于Java+SSM的实战开发项目150套(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f9e1;今天给大家分享150的Java毕业设计&#xff0c;基于ssm框架&#xff0c;这些项目都经过精心挑选&#xff0c;涵盖了不同的实战主题和用例&#xff0c;可做毕业设计和课程…