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

蓝桥杯第15届真题解析

 

 

由硬件框图可以知道我们要配置LED 和按键、lcd,解决lcd引脚冲突

LED

先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题

 

按键

按键配置,由原理图按键所对引脚要GPIO_Input

生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lcd.c、lcd.h、fonts.h添加到code中,然后去写按键控制灯亮灭的程序,看是否有问题

按键控制led没有问题后写lcd显示代码,显示没问题后,解决lcd与led引脚冲突问题,方法在我的其他文章中

  HAL_GPIO_WritePin (GPIOD,GPIO_PIN_2,GPIO_PIN_RESET ); //为解决引脚冲突初始化lcd时    LCD_Init ();                                                                                                  要将锁存器锁存器来;
  LCD_Clear (Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);

LCD显示函数

void lcd_show(void)
{
    sprintf(text,"      hello world");
    LCD_DisplayStringLine (Line0 ,(uint8_t *)text);
}

脉冲捕获

PA15  PB4输入频率测量,使用pwm输入模式测量比较准确,题目要求频率10次/秒刷新,这里需要使用定时器,定时器可以用10ms,时间短的定时器便于使用。

配置pwm输入捕获

建立handlie.c handle.h文件

我分别选着TIM2 TIM3  combined channels

选择 PWM input on ch1

psc 80-1   记得去勾选中断

生成代码,添加.h文件,main中开启TIM

 HAL_TIM_IC_Start_IT(&htim2 ,TIM_CHANNEL_1)注意这里开启的是TIM_IC_Start

找到回调函数,写功能代码,这里回调函数也是要IC的

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    
}

计算公式又来请查看我的另一篇文章,PWM的输入捕获

这次代capture哪里加了1主要个好处
避免0错误
或者修正精度
单片机除数为0会死机~
 

频率要求10次/秒刷新这就要用到定时器,PX要求可正可负,定义时就要有int类型

tim配置如下,参数来源请参考我蓝桥杯第16届的模拟一解析,要开启中断再生成代码

注意定时器的配置、开启代码与前面定时器配置输入捕获的不同,回调函数也不一样

用led来判断一下定时器是否好使

定时器没有问题,我们去定时10次/秒更新频率,更新时把题目要求的频率校准做了

页面切换

用标志位进行页面切换,三个页面以上我们用switch来切换

 data界面

data页面中有单位切换,这个用if来实现,小于/大于多少变成什么单位,注意还有要求,f为负数时显示NULL

其中还要实现模式转换,模式的转换我们也用标志位实现

这里是频率界面

按照题目要求,B3按键是用来切换频率界面与周期界面的,去key中的B3按键中写切换的代码

频率转周期

注意我们频率单位是hz,t=1/f,这里周期的单位是s,题目要求是um,要进行单位换算,也就是t要✖1000 000才得到um

易错点:定义float fAT,它是浮点型,fA是无符号整型,计算fAT时被除数1要写成1.0,否则出错;fAT=fAT/1000;1000不用写成1000.0,因为商fAT都是是float;上面代码中FB=fB/1000.0,1000要写成1000.0是因为FB是float型,fB是uint。

para参数界面

recd统计页面

页面残留问题

para recd界面显示的行数比data界面的都多,从para recd两个界面切换回data界面就会有残留显示,则还需要去相应界面中把对应的行数显示为空白

频率超限设置

我们设置的频率fA/B超过设置的PH值一次,对应NHA/B就加一次,这里的一次是高于后又低于算一次,高于后不低于继续高于不能再算一次

频率突变

这里要求三秒内,这就需要我们去配置定时器了

定时器配置

1.选用哪一个

2.根据定时时长设置psc、arr值,启用中断

3.生成代码,开启定时器

4.定时器回调函数写功能代码

定时器我们上面已经定义了一个10ms的,可以选择直接在里面写

if(fA>0)语句是防止一开始就加一,因为上电时fAfB是0的,然后再10ms内更新了数据,就会没有操作就加1了

功能按键

加减按键

参数界面参数选择

要求进如参数界面时,默认选择PD,所以要去切换界面的按键四中写一个条件语句确保完成要求

按键清零(长按键)

这里长安一秒就需要用到定时B3prees记录按下的时间,如果B3按下,B3press=1开始计时,当放开按键的时候去比较按下的时间,超过一秒就清零;

led指示灯

在前面写的void change ()函数用if语句写led的亮灭

 

http://www.lryc.cn/news/547049.html

相关文章:

  • 19c rac-expdp备份异常处理
  • 轻松部署 Stable Diffusion WebUI 并实现局域网共享访问:解决 Conda Python 版本不为 3.10.6 的难题
  • 20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式
  • AIP-159 跨集合读
  • C++进阶(七)--STL--bitset(位图)的介绍与基本功能模拟实现
  • 清北deepseek8本手册
  • 如何将Promise.then中的值直接return出来
  • 利用golang embed特性嵌入前端资源问题解决
  • SPI驱动(二) -- SPI驱动程序模型
  • 【无标题】FrmImport
  • 深入浅出 Go 语言:协程(Goroutine)详解
  • vLLM代码推理Qwen2-VL多模态
  • DNS云解析有什么独特之处?
  • 视频流畅播放相关因素
  • Python实现一个类似MybatisPlus的简易SQL注解
  • linux一些使用技巧
  • 小模型和小数据可以实现AGI吗
  • io学习----->文件io
  • kubernetes介绍
  • 如何高效准备PostgreSQL认证考试?
  • 如何使用Briefing打造私有视频会议系统结合内网穿透异地远程连接
  • XHR请求解密:抓取动态生成数据的方法
  • 坐标变换介绍与机器人九点标定的原理
  • 串口调试助手Alien v5.198新版发布
  • 解锁Android RemoteViews:跨进程UI更新的奥秘
  • 编译可以在Android手机上运行的ffmpeg程序
  • Verilog学习方法—基础入门篇(一)
  • 本地jar包添加到 maven
  • C# Unity 唐老狮 No.6 模拟面试题
  • 项目工坊 | Python驱动淘宝信息爬虫