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

目录

题目要求(真题):

cubeMX配置:

小试牛刀:

 Keil代码:

效果演示:


题目要求(真题):

使用第十一届第二场真题,练习PWM波部分的代码,实现可以通过按键进行页面切换,加减PWM波占空比,并显示在LCD屏幕上

 

cubeMX配置:

配置pa6,pa7为pwm输出引脚

启用定时器为pwm输出,占空比可以先随便设置一下,这里为20

 

配置pwm频率,计算公式为:

根据题目,PA6输出100hz,PA7输出200hz:

PA6:

PA7:

 

小试牛刀:

 Keil代码:

注意:首先要开启PWM输出通道

HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);

 user.c

#include "user.h" // 包含用户定义的头文件 user.hu8 ui=1; // 定义全局变量 ui,用于控制 LCD 显示
u8 pa6_duty=10; // 定义全局变量 pa6_duty,用于控制 PA6 引脚的 PWM 占空比
u8 pa7_duty=10; // 定义全局变量 pa7_duty,用于控制 PA7 引脚的 PWM 占空比void KEY_proc() // 定义按键处理函数 KEY_proc
{// 对四个按键进行单击、长按、双击的处理if(single_key_flag[0]==1) // 如果按键1单次按下{ui+=1; // 控制 LCD 显示界面切换if(ui>=3) ui=1; // 如果 ui 大于等于3,重置为1single_key_flag[0]=0; // 用完标记清零}if(single_key_flag[1]==1) // 如果按键2单次按下{pa6_duty+=10; // 增加 PA6 引脚的 PWM 占空比if(pa6_duty>=100) pa6_duty=10; // 如果占空比大于等于100,重置为10__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty); // 设置 TIM16 的通道1 PWM 占空比single_key_flag[1]=0; // 用完标记清零}if(single_key_flag[2]==1) // 如果按键3单次按下{pa7_duty+=10; // 增加 PA7 引脚的 PWM 占空比if(pa7_duty>=100) pa7_duty=10; // 如果占空比大于等于100,重置为10__HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1, pa7_duty); // 设置 TIM17 的通道1 PWM 占空比single_key_flag[2]=0; // 用完标记清零}
}u32 lcd_tick=0; // 定义 LCD 刷新计时变量 lcd_tickvoid Disp_proc () // 定义 LCD 显示处理函数 Disp_proc
{if(uwTick-lcd_tick<100) // 如果当前时间与上次刷新时间间隔小于100ms,返回return;lcd_tick=uwTick; // 更新 LCD 刷新时间if(ui==1) // 如果显示界面为1{u8 text[50]; // 定义存放文本的数组 textsprintf(text, "      DATE        "); // 设置第一行显示文本为 "      DATE        "LCD_DisplayStringLine(Line1, (unsigned char *)text); // 在第一行显示文本sprintf(text, "    V:            "); // 设置第三行显示文本为 "    V:            "LCD_DisplayStringLine(Line3, (unsigned char *)text); // 在第三行显示文本sprintf(text, "    Mode:         "); // 设置第五行显示文本为 "    Mode:         "LCD_DisplayStringLine(Line5, (unsigned char *)text); // 在第五行显示文本}if(ui==2) // 如果显示界面为2{u8 text[50]; // 定义存放文本的数组 textsprintf(text, "      Para        "); // 设置第一行显示文本为 "      Para        "LCD_DisplayStringLine(Line1, (unsigned char *)text); // 在第一行显示文本sprintf(text, "    PA6:%d        ",pa6_duty); // 根据 PA6 占空比设置第三行显示文本LCD_DisplayStringLine(Line3, (unsigned char *)text); // 在第三行显示文本sprintf(text, "    PA7:%d        ",pa7_duty); // 根据 PA7 占空比设置第五行显示文本LCD_DisplayStringLine(Line5, (unsigned char *)text); // 在第五行显示文本}
}

在 KEY_proc 中,根据按键的单击事件更新全局变量 ui(控制 LCD 显示界面切换)和两个 PWM 占空比参数 pa6_duty 和 pa7_duty;在 Disp_proc 中,根据 ui 的值选择显示不同的界面,其中界面1显示固定文本,界面2显示带有动态参数的文本。

注意:

__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, pa6_duty); // 设置 TIM16 的通道1 

一定要有这句代码,是它将pa6_duty这个参数的值更新到了PWM的输出中。

 

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 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开始KEY_proc(); // 处理按键事件Disp_proc (); // 控制 LCD 显示内容}/* USER CODE END 3 */ // 用户自定义的代码段6结束
}

效果演示:

 

蓝桥杯嵌入式PWM输出效果演示

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

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

相关文章

德国FSL18罗德与施瓦茨频谱分析仪

181/2461/8938产品概述&#xff1a; 频率范围:9 kHz至18 GHz&#xff08;超范围至20 GHz&#xff09;频率分辨率:1赫兹28 MHz的信号分析带宽低测量不确定性&#xff0c;即使在微波范围内通用测量应用&#xff0c;例如光谱图轻巧紧凑&#xff0c;便于现场安装、维护和服务 9 kH…

什么是企业邮箱?企业邮箱和个人邮箱的区别是什么?

拥有一个企业邮箱究竟能给公司带什么益处&#xff1f;这是许多中小企业管理者好奇的&#xff0c;很多人觉得邮箱只要用来收发邮件就够了。但实际上&#xff0c;什么是企业邮箱&#xff1f;企业邮箱和个人邮箱在功能范围有着很大的区别。好的企业邮箱不仅能提高公司内部的沟通效…

【电控笔记5】电流环pi参数整定

旋转坐标系下的电压方程&#xff0c;由id和iq计算出ud和uq 把常数项&#xff08;上面两个红框&#xff09;拿出来解耦合&#xff0c;作为前馈&#xff0c;如下 电流环传递函数 电流带宽 响应时间 另一种方法&#xff1a;内膜控制器

RISC-V特权架构 - 中断注入

中断注入 1 中断注入的作用2 mip寄存器3 中断注入后的处理过程 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断注入的作用 中断注入&#xff0c;就是在M模式下&#xff0c;手动向S模式去产生一个中断。 比如&#xff1a;向mip寄存器的bit5…

Web前端开发——Vue概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! Vue Vue是一套前端框架&#xff0c;基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的专注点放在数据上&#xff0c;可以免除原生JavaScript中的DOM操作&am…

600MA线性锂电池充电芯片 - YB4054DJ

描述: YB4054一款完整的单节锂离子电池充电器。其SOT23-5的封装与较少的外部元件数使得YB4054成为便携式应用的理想选择。采用了内部PMOSFET架构&#xff0c;加上防倒充电路&#xff0c;不需要外部检测电阻器和隔离二极管。热反馈可对充电电流进行自动调节&#xff0c;以便在大…

基于Linux C++多线程服务器 + Qt上位机开发 + STM32 + 8266WIFI的智慧无人超市

前言 针对传统超市购物车结账排队时间长、付款效率低的问题&#xff0c;提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账&#xff0c;理由显而易见&#xff1a;自助收银机结账很方便&#xff0c;几乎不用排队&am…

“反正你又看不到,少写一行又何妨......”

单链表专题 1.链表的概念及结构2. 实现单链表3. 链表的分类 1.链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 链表的结构跟火车车厢相似&#xff0c;淡季时⻋次的⻋厢…

GraphQL API-通过未被净化的参数获取隐私信息

GraphQL API-通过未被净化的参数获取隐私信息 Lab: Accessing private GraphQL posts实验前置必要知识点 在GraphQL端点发送任何query{__typename}&#xff0c;它将在其响应中的某处包含{"data": {"__typename": "query"}}字符串&#xff0c;这…

JZM-A系列机械隔膜计量泵

引言&#xff1a; 在现代工业生产过程中&#xff0c;对流体材料的精准计量和输送需求日益提高。面对这一挑战&#xff0c;JZM-A系列机械隔膜计量泵以其卓越的设计、准确的计量能力和高效的性能&#xff0c;为各行各业提供了一种可靠的解决方案。本文将详细解析JZM-A系列计量泵的…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活的重要组成部分&#xff0c;而Facebook作为最知名的社交媒体平台之一&#xff0c;其成功之处备受瞩目。本文将深入解析Facebook的成功密码&#xff0c;探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

6.1Python之字典的初识

【1】字典的创建与价值 字典&#xff08;Dictionary&#xff09;是一种在Python中用于存储和组织数据的数据结构。元素由键和对应的值组成。其中&#xff0c;键&#xff08;Key&#xff09;必须是唯一的&#xff0c;而值&#xff08;Value&#xff09;则可以是任意类型的数据。…

ue4打包多模块

首先&#xff0c;每个模块&#xff0c;包含插件内的模块在内&#xff0c;都要用IMPLEMENT_MODULE(类名, 模块名)的方式&#xff0c;模块名就是带.build.cs的第一个单词。 build.cs里就说了这个模块该怎么用&#xff0c;用c#编写。 打包中要考虑到target.cs,将工程中相应的模块…

花花省V6淘宝客APP社交电商自营商城聚合优惠券系统

首页广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加油、阿里巴巴、去哪网、电影票、飞猪旅行、美团酒店、当当网、肯德基、热门抖货、商品推荐、商品详情、…

基于Springboot + vue +MySQL 留守儿童爱心网站 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;系统架构 &#x1f4da; 数据库设计 &#x1f4ac; 志愿活动属性图 &#x1f4ac; 爱心捐赠实体属性 &#x1f4da; 系统功能的具体实现 &#x1f4ac; 系统功能模块 宣传新闻 志愿活动 &#x1f4ac; 管理员功…

基于java+springboot+vue实现的售楼管理系统(文末源码+Lw)23-255

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本售楼管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

312_C++_QT表格的剪切、拷贝、粘贴,轻量化操作

:拷贝 + 粘贴 :剪切 + 粘贴 void CustomTableWidget::cut() {copy();// 获取所有选定的单元格项QList<QTableWidgetItem*> selectedItemsList

SpringBoot学习之Kibana下载安装和启动(三十二)

一、简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。 …

Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范&#xff0c;这里写一下只是记录几年前自己遇到的问题&#xff0c;好久都忘了&#xff0c;还是写下来比较好。 问题记录&#xff1a;由于变量使用了boolean&#xff0c;并且变量名是is开头的&#xff0c;由于java机制boolean默认是false&#…

FASTAPI系列 20-异常处理器exception_handler

FASTAPI系列 20-异常处理器exception_handler 文章目录 FASTAPI系列 20-异常处理器exception_handler前言一、HTTPException 异常&#xff1f;二、覆盖默认的HTTPException 异常三、覆盖请求验证异常RequestValidationError 源码分析 总结更多内容&#xff0c;请关注公众号 前言…