蓝桥杯嵌入式(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处理的时间差小于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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用Python给PDF文档设置背景色或背景图

PDF作为一种跨平台、高保真的文件格式被广泛应用&#xff0c;尤其在报告、手册、电子书、合同等场景中&#xff0c;其重要性不言而喻。然而&#xff0c;在满足基本内容展示需求的同时&#xff0c;为了增强视觉效果&#xff0c;提升阅读体验&#xff0c;或者出于品牌标识、企业形…

IDE Eval Reset —— idea 重置试用期插件安装

idea 重置试用期插件安装 一、在线安装&#xff1a; 1、打开IntelliJ IDEA 2、file—> setting —> plugins 添加三方插件库 点击后&#xff0c;跳出弹框点击号&#xff0c;添加图中的网址 https://plugins.zhile.io3、搜索 IDE Eval Reset &#xff0c;安装插件 4…

东用科技助力5G+区域教育管理智慧平安校园建设

一、 方案背景 为深入贯彻党中央、国务院关于加快5G发展、加强教育信息化工作的决策部署&#xff0c;加快推进《5G应用“扬帆”行动计划》实施&#xff0c;促进5G与教育融合创新发展&#xff0c;按照“育人为本、多方协同、问题导向、深度融合”的原则&#xff0c;工业和信息化…

【算法练习】29:插入排序学习笔记

一、插入排序的算法思想 原理&#xff1a;将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。 时间复杂度&#xff1a;插入排序的时间复杂度在最坏、平均和最好情况下的表现相同&#xff0c;均为 &#xff0c;其中 n 是待排序数…

PS入门|如何让模糊的图片变得清晰?

前言 前段时间的PS入门讲的都是如何抠图、抠图、抠图。小白都快抠出三室一厅了&#xff0c;不知道学习的小伙伴如何了。 如果在学习过程中没有练习的照片&#xff0c;那直接使用每一篇文章的照片即可&#xff0c;学PS最忌讳的就是光看不练&#xff0c;眼睛会了&#xff0c;手…

基于WEB的水库水情自动测报系统的研究与设计(论文+源码)_kaic

摘要 水情信息是水利管理最重要的基础信息&#xff0c;是水文预报、水资源管理、防汛抗旱决策的主要依据。水情自动测报系统是一个自动采集、传输、处理水情信息的实时测报系统&#xff0c;可对水库流域内的水情、水文和气象数据&#xff0c;如雨量、流量、水位等&#xff0c;实…

利用AbortController,取消正在发送的请求

参考文章&#xff1a;https://blog.csdn.net/qq_45560350/article/details/130588101 解决问题&#xff1a;再图层中点击仓库的时候&#xff0c;点击后又取消掉&#xff0c;我们希望这个请求可以被取消掉&#xff0c;我们口可以利用AbortController控制器对象 实操&#xff1a…

linux 以jar包的方式部署后端程序

打包&#xff0c;以及linux上的位置 然后执行下面两个命令&#xff0c;一个多服务启动&#xff0c;一个是单服务启动 多服务启动命令 #!/bin/bash# 设置JAR包的目录 JAR_DIR"/bpm/app_jar"# 设置JAR包的名称&#xff0c;用空格分隔 # JAR_NAMES"platform-gate…

Paper Reading: MixTeacher:半监督目标检测中利用混合尺度教师挖掘有前景的标签

目录 简介目标/动机工作重点方法训练 实验总结 简介 题目&#xff1a;《MixTeacher: Mining Promising Labels with Mixed Scale Teacher for Semi-Supervised Object Detection》&#xff0c; CVPR 2023 日期&#xff1a;2023.3.16 单位&#xff1a;腾讯&#xff0c;上海交…

Ceph学习 -4.Ceph组件介绍

文章目录 1.Ceph组件介绍1.1 组件介绍1.2 流程解读1.2.1 综合效果图1.2.2 数据存储逻辑 1.3 小结 1.Ceph组件介绍 学习目标&#xff1a;这一节&#xff0c;我们从组件介绍、流程解读、小结三个方面来学习。 1.1 组件介绍 无论是想向云平台提供 Ceph 对象存储和 Ceph 块设备服务…

Go语言mac环境搭建详解

Go语言mac环境搭建详解见视频&#xff0c;视频下方也有讲解具体的操作步骤。 Golang Mac电脑环境搭建、开发工具Vscode配置 Go语言mac环境搭建步骤如下&#xff1a; 1、下载安装Golang Go官网下载地址&#xff1a;https://golang.org/dl/ Go官方镜像站&#xff08;推荐&…

大数据架构的演变与多种大数据架构类型说明——解读大数据架构(一)

文章目录 前言数据架构的演变关系型数仓数据湖现代数仓数据网络数据湖仓数据网格 前言 在搭建和使用大数据组件前&#xff0c;预先投入时间设计和构建正确的数据架构绝对至关重要。如果在前期没有设计正确的数据架构就开始实施方案&#xff0c;在后期想更改架构设计是十分困难…

uniapp-IOS自定义启动页面模版的修改

启动界面设置 在打包IOS包时&#xff0c;需要我们选择app的启动页面配置 在HBuilderX内&#xff0c;有三个样式的选择 第一个&#xff0c;是通用界面&#xff0c;就是一个启动页是一个圆形的应用图标加上应用名称 第二个&#xff0c;自定义的启动图&#xff0c;目前无法通过App…

企业级网络安全:入侵防御实时阻止,守护您的业务安全

随着互联网技术的快速发展&#xff0c;企业级网络安全问题日益凸显。在这个数字化时代&#xff0c;企业的业务安全不仅关系到企业的形象和声誉&#xff0c;还直接影响到企业的生存和发展。因此&#xff0c;加强企业级网络安全&#xff0c;预防和抵御各种网络攻击已成为企业的重…

lua学习笔记17(面相对象之继承)

print("*****************************面相对象继承*******************************") object{} object.id1 function object:new()local obj{}self.__indexself setmetatable(obj,self)return obj end function object:text()--面相对象的类其实就是基于table来实现…

备考ICA----Istio实验20---跨网络Primary-Remote主从架构部署

备考ICA----Istio实验20—跨网络Primary-Remote主从架构部署 按照本实验在 cluster1&#xff08;主集群&#xff09;上安装 Istio 控制平面&#xff0c;并将 cluster2&#xff08;远程集群&#xff09;配置为使用 cluster1 中的控制平面。群集 cluster1 在 network1 网络上&am…

基于Springboot的笔记记录分享网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的笔记记录分享网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

提升法律文书起草效率:AlphaGPT 助力律师快速生成诉讼和仲裁文件

法律文书起草对于法律专业人士而言是一项基础而关键的任务。无论是民事、刑事还是行政诉讼&#xff0c;以及仲裁案件&#xff0c;精确的法律文书撰写对于案件的成功至关重要。然而&#xff0c;这一过程往往既耗时又复杂&#xff0c;尤其是在处理复杂的案情和面对当事人难以理解…

浅谈网络安全威胁与防御策略

企业网络安全威胁概述 外部威胁&#xff1a;来自网络安全威胁&#xff0c;比如DDOS攻击&#xff0c;病毒&#xff0c;sql注入&#xff0c;木马&#xff0c;蠕虫&#xff0c;等网络入侵&#xff0c;网络扫描&#xff0c;垃圾邮件&#xff0c;钓鱼邮件&#xff0c;针对web的攻击…

Docker Redis Debian服务器版

1.使用官方安装脚本自动安装docker 安装命令如下&#xff1a; curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh 如果安装提示 -bash sudo command not found 则需要 #update sudo apt-get update sudo apt-get install sudo再执行安装脚本1 安装…