当前位置: 首页 > news >正文

蓝桥杯嵌入式(G431)备赛笔记——ADC+LCD

目录

题目要求(真题):

cubeMX配置:

小试牛刀:

 Keil代码:

效果演示:


题目要求(真题):

使用第十一届第二场真题,练习ADC波部分的代码

cubeMX配置:

配置PB12,PB15为ADC输入通道

PB12对应R38,配置为ADC1的通道11

PB15对应R37,配置为ADC2的通道15

 最好将采样时间拉到最高,防止出错。

小试牛刀:

 Keil代码:

user.c

#include "user.h" // 包含用户自定义头文件 user.hu32 adc_tick=0; // 定义 ADC 计时变量 adc_tick
u32 r37_value=0; // 定义变量存储 ADC1 读取的数值 r37_value
u32 r38_value=0; // 定义变量存储 ADC2 读取的数值 r38_value
float r37_volt=0; // 定义变量存储 ADC1 转换后的电压值 r37_volt
float r38_volt=0; // 定义变量存储 ADC2 转换后的电压值 r38_voltvoid ADC_proc() // 定义 ADC 处理函数 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; // 定义变量存储用户界面状态 ui
u8 pa6_duty=10; // 定义变量存储 PA6 的占空比 pa6_duty
u8 pa7_duty=10; // 定义变量存储 PA7 的占空比 pa7_dutyvoid KEY_proc() // 定义按键处理函数 KEY_proc
{// 对四个按键进行单击、长按、双击的处理if(single_key_flag[0]==1) // 如果按键1单次按下{ui+=1; // 切换 LCD 显示模式if(ui>=3) ui=1; // 如果超过最大模式数,回到第一个模式single_key_flag[0]=0; // 清除按键标志}if(single_key_flag[1]==1) // 如果按键2单次按下{pa6_duty+=10; // 增加 PA6 的占空比if(pa6_duty>=100) pa6_duty=10; // 如果占空比超过100%,重置为10%__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty); // 设置 PWM 输出的占空比single_key_flag[1]=0; // 清除按键标志}if(single_key_flag[2]==1) // 如果按键3单次按下{pa7_duty+=10; // 增加 PA7 的占空比if(pa7_duty>=100) pa7_duty=10; // 如果占空比超过100%,重置为10%__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, pa7_duty); // 设置 PWM 输出的占空比single_key_flag[2]=0; // 清除按键标志}
}u32 lcd_tick=0; // 定义 LCD 刷新计时变量 lcd_tickvoid Disp_proc () // 定义显示处理函数 Disp_proc
{if(uwTick-lcd_tick<100) // 如果当前时间与上次 LCD 刷新的时间间隔小于100msreturn; // 直接返回,不进行 LCD 刷新lcd_tick=uwTick; // 更新 LCD 刷新时间为当前时间if(ui==1) // 如果当前界面为模式1{u8 text[50]; // 定义字符数组用于存储显示的文本信息sprintf(text, "      DATE        "); // 格式化字符串,显示日期LCD_DisplayStringLine(Line1, (unsigned char *)text); // 在第1行显示文本信息sprintf(text, "    V:%.2f V      ", r37_volt); // 格式化字符串,显示 ADC1 电压值LCD_DisplayStringLine(Line3, (unsigned char *)text); // 在第3行显示文本信息sprintf(text, "    Mode:         "); // 格式化字符串,显示模式LCD_DisplayStringLine(Line5, (unsigned char *)text); // 在第5行显示文本信息sprintf(text, "    V:%.2f V      ", r38_volt); // 格式化字符串,显示 ADC2 电压值LCD_DisplayStringLine(Line4, (unsigned char *)text); // 在第4行显示文本信息}if(ui==2) // 如果当前界面为模式2{u8 text[50]; // 定义字符数组用于存储显示的文本信息sprintf(text, "      Para        "); // 格式化字符串,显示参数LCD_DisplayStringLine(Line1, (unsigned char *)text); // 在第1行显示文本信息sprintf(text, "    PA6:%d        ", pa6_duty); // 格式化字符串,显示 PA6 占空比LCD_DisplayStringLine(Line3, (unsigned char *)text); // 在第3行显示文本信息sprintf(text, "    PA7:%d        ", pa7_duty); // 格式化字符串,显示 PA7 占空比LCD_DisplayStringLine(Line5, (unsigned char *)text); // 在第5行显示文本信息}
}

ADC_proc 函数用于采样两个模拟输入通道的电压值并计算,KEY_proc 函数处理按键操作并控制相关功能,Disp_proc 函数根据当前界面状态和采样到的数据更新 LCD 显示。

user.h

#ifndef __USER_H // 如果未定义过 __USER_H 宏
#define __USER_H // 定义 __USER_H 宏,防止头文件重复包含#include "main.h" // 包含主头文件 main.h
#include "lcd.h" // 包含 LCD 相关头文件 lcd.h
#include "key.h" // 包含按键相关头文件 key.h
#include "led.h" // 包含 LED 相关头文件 led.h
#include "tim.h" // 包含定时器相关头文件 tim.hvoid ADC_proc(void); // 声明按键处理函数 ADC_proc
void KEY_proc(void); // 声明按键处理函数 KEY_proc
void Disp_proc(void); // 声明显示处理函数 Disp_proc#endif // 结束条件编译指令

main.c

int main(void)
{/* USER CODE BEGIN 1 */ // 在这里插入用户自定义的代码段1/* USER CODE END 1 */ // 用户自定义的代码段1结束/* MCU Configuration--------------------------------------------------------*/ // MCU 配置/* Reset of all peripherals, Initializes the Flash interface and the Systick. */ // 复位所有外设,初始化 Flash 接口和 SysTick 定时器HAL_Init(); // HAL 库初始化/* USER CODE BEGIN Init */ // 用户自定义的代码段2开始/* USER CODE END Init */ // 用户自定义的代码段2结束/* Configure the system clock */ // 配置系统时钟SystemClock_Config(); // 调用系统时钟配置函数/* USER CODE BEGIN SysInit */ // 用户自定义的代码段3开始/* USER CODE END SysInit */ // 用户自定义的代码段3结束/* Initialize all configured peripherals */ // 初始化所有配置的外设MX_GPIO_Init(); // 初始化 GPIO 外设MX_TIM3_Init(); // 初始化定时器 TIM3MX_TIM16_Init(); // 初始化定时器 TIM16MX_TIM17_Init(); // 初始化定时器 TIM17/* USER CODE BEGIN 2 */ // 用户自定义的代码段4开始LED_disp (0); // 调用 LED 显示函数,将 LED 初始状态设置为关闭HAL_TIM_Base_Start_IT(&htim3); // 启动 TIM3 定时器的基本定时器模式并启用定时器中断LCD_Init(); // LCD 初始化HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1); // 启动 TIM16 定时器的 PWM 模式,并启用通道1HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1); // 启动 TIM17 定时器的 PWM 模式,并启用通道1/* USER CODE END 2 */ // 用户自定义的代码段4结束/* Infinite loop */ // 无限循环/* USER CODE BEGIN WHILE */ // 用户自定义的代码段5开始LCD_Clear(Black); // 清屏,将背景色设置为黑色LCD_SetBackColor(Black); // 设置背景色为黑色LCD_SetTextColor(White); // 设置文本颜色为白色while (1) // 进入无限循环{/* USER CODE END WHILE */ // 用户自定义的代码段5结束/* USER CODE BEGIN 3 */ // 用户自定义的代码段6开始ADC_proc(); // ADC处理函数KEY_proc(); // 处理按键事件Disp_proc (); // 控制 LCD 显示内容}/* USER CODE END 3 */ // 用户自定义的代码段6结束
}

关键函数:

HAL_ADC_Start(&hadc2);  //开启ADC

HAL_ADC_GetValue(&hadc2); //获取ADC的值

效果演示:

蓝桥杯嵌入式ADC效果演示

相关文章:

蓝桥杯嵌入式(G431)备赛笔记——ADC+LCD

目录 题目要求&#xff08;真题&#xff09;&#xff1a; cubeMX配置&#xff1a; 小试牛刀&#xff1a; Keil代码&#xff1a; 效果演示&#xff1a; 题目要求&#xff08;真题&#xff09;&#xff1a; 使用第十一届第二场真题&#xff0c;练习ADC波部分的代码 cubeMX配…...

最近公共祖先(LCA)

题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1 行每行包含两个正整数x,y,表示 x 结点和 y 结点之间有一条直接连接的边(数据保证可以…...

ABBYY FineReader15免费电脑OCR图片文字识别软件

产品介绍&#xff1a;ABBYY FineReader 15 OCR图片文字识别软件 ABBYY FineReader 15是一款光学字符识别&#xff08;OCR&#xff09;软件&#xff0c;专门设计用于将扫描的文档、图像和照片中的文本转换成可编辑和可搜索的格式。这款软件利用先进的OCR技术&#xff0c;能够识别…...

2024年第十七届 认证杯 网络挑战赛 (A题)| 保暖纤维的保暖能力 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (A题&#xff09;&#xff01…...

算法训练营第37天|LeetCode 738.单调递增的数字 968.监控二叉树

LeetCode 738.单调递增的数字 题目链接&#xff1a; LeetCode 738.单调递增的数字 解题思路&#xff1a; 从后向前遍历&#xff0c;当不满足递增条件时&#xff0c;当前位置赋值为9&#xff0c;前一位减一。之后记录不满足位置&#xff0c;将后续全部赋值为9. 代码&#x…...

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …...

大恒相机-程序异常退出后显示被占用

心跳时间代表多久向相机发送一次心跳包&#xff0c;如果超时则设备会认为断开了&#xff0c;停止工作并主动释放占用资源。 在相机打开后添加代码&#xff1a; #ifdef _DEBUG//设置心跳超时时间 3sObjFeatureControlPtr->GetIntFeature("GevHeartbeatTimeout")-&…...

头歌-机器学习 第16次实验 EM算法

第1关:极大似然估计 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握: 什么是极大似然估计; 极大似然估计的原理; 极大似然估计的计算方法。 什么是极大似然估计 没有接触过或者没有听过”极大似然估计“的同学…...

电脑启动引导的两种方式

电脑启动引导的两种方式 电脑启动引导有两种方式&#xff1a;Legacy 传统模式 和 UEFI 新型模式。 一、Legacy&#xff1a;指 主板的 传统的 BIOS 传输模式引导启动加载操作系统。 1.只支持 MBR 分区表&#xff0c;支持 32位和64位操作系统&#xff08;如&#xff1a;winXP&…...

用php编写网站源码的一些经验

一、var_dump()函数 var_dump()函数在有页面跳转的情况下会看不到信息。因为 var_dump()函数输出信息默认显示到本页面。因此要看到var_dump()函数的输出&#xff0c;在有页面跳转时&#xff0c;需要将页面跳转改成显示本页面。 放在var_dump()函数里的变量如果是空值&#x…...

海山数据库(He3DB)原理剖析:浅析OLAP数据库计算引擎中的统计信息

背景&#xff1a; 统计信息在计算引擎的优化器模块中经常被提及&#xff0c;尤其是在基于成本成本优化&#xff08;CBO&#xff09;框架中统计信息发挥着至关重要的作用。CBO旨在通过评估执行查询的可能方法&#xff0c;并选择最有效的执行计划来提高查询性能。而统计信息则提…...

视频图像的两种表示方式YUV与RGB(4)

本篇主要讲YUV与RGB之间的转换&#xff0c;包括YUV444 颜色编码格式 转为 RGB 格式 &#xff0c;RGB颜色编码格式转为 YUV444 格式。 一、 YUV与RGB之间的转换 YUV与RGB颜色格式之间进行转换时 , 涉及一系列的数学运算 ; YUV 颜色编码格式转为RGB格式的转换公式 取决于 于 YUV …...

PostgreSQL入门到实战-第十四弹

PostgreSQL入门到实战 PostgreSQL数据过滤(七)官网地址PostgreSQL概述PostgreSQL中BETWEEN 命令理论PostgreSQL中BETWEEN 命令实战更新计划 PostgreSQL数据过滤(七) BETWEEN运算符允许您检查值是否在值的范围内。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…...

分布式数据库中间件 Mycat 和 ShardingSphere 对比

Mycat 和 ShardingSphere 都是流行的分布式数据库中间件&#xff0c;都可以用于实现数据分片、读写分离和分布式事务等功能&#xff0c;但它们在设计理念、特点和功能实现上有一些区别 1. 设计理念&#xff1a; Mycat&#xff1a; 基于 MySQL 协议的代理式架构&#xff0c;主要…...

Python实现BOA蝴蝶优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…...

3D Web轻量化引擎HOOPS Commuicator如何从整体装配中创建破碎的装配零件和XML?

前言 虽然可以从某些本机CAD格式&#xff08;其子组件驻留在单独的文件中&#xff0c;例如CATIA V5、Creo - Pro/E、NX或SolidWorks&#xff09;创建破碎装配&#xff0c;但无法从整体装配文件&#xff08;例如IFC、Revit&#xff09;创建或3DXML。 本文介绍了一个示例&#…...

关于运行阿里云直播Demo pub get 报的错

flutter --version dart --version 如何使用Flutter框架推流_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心 终端输入 dart pub --trace get --no-precompile 打印详细报错信息 详细咨询chatgpt pub.dev 中已经是最新版本了 项目中已经是最新版本了 最终定位到 终端…...

C语言调用Python

目录 1.直接调用python语句 头文件引用 2.调用无参有参函数 1、调用无参函数 1.建立nopara.py文件 2.使用c语言根据上面流程进行调用 2、调用有参函数 1.建立nopara.py文件 2.使用c语言根据上面流程进行调用 C语言调用python需要我们已经安装好了libpython3的 dev依赖…...

SVN客户端异常问题处理

1、如遇svn服务端异常&#xff08;所有用户登录不上&#xff09; &#xff08;1&#xff09;登录192.168.**.**服务器&#xff0c;找到E:\仓库所在盘\VisualSVN-GlobalWinAuthz.ini &#xff08;2&#xff09;先备份VisualSVN-GlobalWinAuthz.ini文件 &#xff08;3&#xf…...

gin+sse实现离散的消息通知

虽然网上的都是用sse实现将实时消息流不间断的推给前端&#xff0c;但是sse也可以模拟websocket进行突发的消息通知&#xff0c;而不是一直读取数据并返回数据。即服务端保存所有的连接对象&#xff0c;前端管理界面发送正常的http请求&#xff0c;在后端遍历所有的连接对象&am…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...