蓝桥杯嵌入式(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
目录 题目要求(真题): cubeMX配置: 小试牛刀: Keil代码: 效果演示: 题目要求(真题): 使用第十一届第二场真题,练习ADC波部分的代码 cubeMX配…...
最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1 行每行包含两个正整数x,y,表示 x 结点和 y 结点之间有一条直接连接的边(数据保证可以…...

ABBYY FineReader15免费电脑OCR图片文字识别软件
产品介绍:ABBYY FineReader 15 OCR图片文字识别软件 ABBYY FineReader 15是一款光学字符识别(OCR)软件,专门设计用于将扫描的文档、图像和照片中的文本转换成可编辑和可搜索的格式。这款软件利用先进的OCR技术,能够识别…...

2024年第十七届 认证杯 网络挑战赛 (A题)| 保暖纤维的保暖能力 |数学建模完整代码+建模过程全解全析
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (A题)!…...
算法训练营第37天|LeetCode 738.单调递增的数字 968.监控二叉树
LeetCode 738.单调递增的数字 题目链接: LeetCode 738.单调递增的数字 解题思路: 从后向前遍历,当不满足递增条件时,当前位置赋值为9,前一位减一。之后记录不满足位置,将后续全部赋值为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 …...

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

头歌-机器学习 第16次实验 EM算法
第1关:极大似然估计 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握: 什么是极大似然估计; 极大似然估计的原理; 极大似然估计的计算方法。 什么是极大似然估计 没有接触过或者没有听过”极大似然估计“的同学…...
电脑启动引导的两种方式
电脑启动引导的两种方式 电脑启动引导有两种方式:Legacy 传统模式 和 UEFI 新型模式。 一、Legacy:指 主板的 传统的 BIOS 传输模式引导启动加载操作系统。 1.只支持 MBR 分区表,支持 32位和64位操作系统(如:winXP&…...
用php编写网站源码的一些经验
一、var_dump()函数 var_dump()函数在有页面跳转的情况下会看不到信息。因为 var_dump()函数输出信息默认显示到本页面。因此要看到var_dump()函数的输出,在有页面跳转时,需要将页面跳转改成显示本页面。 放在var_dump()函数里的变量如果是空值&#x…...

海山数据库(He3DB)原理剖析:浅析OLAP数据库计算引擎中的统计信息
背景: 统计信息在计算引擎的优化器模块中经常被提及,尤其是在基于成本成本优化(CBO)框架中统计信息发挥着至关重要的作用。CBO旨在通过评估执行查询的可能方法,并选择最有效的执行计划来提高查询性能。而统计信息则提…...

视频图像的两种表示方式YUV与RGB(4)
本篇主要讲YUV与RGB之间的转换,包括YUV444 颜色编码格式 转为 RGB 格式 ,RGB颜色编码格式转为 YUV444 格式。 一、 YUV与RGB之间的转换 YUV与RGB颜色格式之间进行转换时 , 涉及一系列的数学运算 ; YUV 颜色编码格式转为RGB格式的转换公式 取决于 于 YUV …...

PostgreSQL入门到实战-第十四弹
PostgreSQL入门到实战 PostgreSQL数据过滤(七)官网地址PostgreSQL概述PostgreSQL中BETWEEN 命令理论PostgreSQL中BETWEEN 命令实战更新计划 PostgreSQL数据过滤(七) BETWEEN运算符允许您检查值是否在值的范围内。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…...
分布式数据库中间件 Mycat 和 ShardingSphere 对比
Mycat 和 ShardingSphere 都是流行的分布式数据库中间件,都可以用于实现数据分片、读写分离和分布式事务等功能,但它们在设计理念、特点和功能实现上有一些区别 1. 设计理念: Mycat: 基于 MySQL 协议的代理式架构,主要…...

Python实现BOA蝴蝶优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…...

3D Web轻量化引擎HOOPS Commuicator如何从整体装配中创建破碎的装配零件和XML?
前言 虽然可以从某些本机CAD格式(其子组件驻留在单独的文件中,例如CATIA V5、Creo - Pro/E、NX或SolidWorks)创建破碎装配,但无法从整体装配文件(例如IFC、Revit)创建或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服务端异常(所有用户登录不上) (1)登录192.168.**.**服务器,找到E:\仓库所在盘\VisualSVN-GlobalWinAuthz.ini (2)先备份VisualSVN-GlobalWinAuthz.ini文件 (3…...
gin+sse实现离散的消息通知
虽然网上的都是用sse实现将实时消息流不间断的推给前端,但是sse也可以模拟websocket进行突发的消息通知,而不是一直读取数据并返回数据。即服务端保存所有的连接对象,前端管理界面发送正常的http请求,在后端遍历所有的连接对象&am…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...