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

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键

一.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引脚冲突问题,方法在我的其他文章中CSDN

  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);
}

四.界面显示

购买界面

按照要求把其显示的东西先显示出来

价格界面

界面转换

写好三个界面的显示函数后需要写一个界面转换的函数,按要求B1按键负责界面转换,用一个标志位来解决界面转换。

五.按键功能实现

B2按键

B1按键的功能我们在界面转换哪里已经完成,现在完成B2按键

在C语言中,1.0f表示一个单精度浮点数(float类型)的字面值。

具体来说:‌ ‌1.0f的含义‌

1.0f中的f后缀明确表示这是一个单精度浮点数(float类型)。如果不加f,默认情况下1.0会被视为双精度浮点数(double类型)。
‌与1.0的区别‌

1.0是双精度浮点数(double类型),占用64位内存,精度更高。
1.0f是单精度浮点数(float类型),占用32位内存,精度较低,但计算速度可能更快。

库存界面

B3按键

B4按键

六.EEPROM存储功能(不熟)

去资源包中把IIC_hal.c与.h添加到code文件中,添加头文件,main中初始化

写好之后测试一下是否正确

七.串口输出接收功能(不熟)

需要把PA9设置为TX   PA10为RX,开启中断后生成代码

添加头文件,在usart.h中找到

输出

HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout),串口发送函数

定义一个数组存放要发送的数据char send[20];

接收

细节不会请看CSDN

 在头文件中找到串口接收回调函数HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)写接收函数;

在函数中先if判断串口,定义的uint8_t rec_data;在headfile.h中加一个外部声明extern,便于数据跨文件使用

找到串口接收函数HAL_UART_Receive_IT();

第一个参数为串口句柄

第二个参数为接收的数据

第三个参数接收数据的字节数

写好的接收函数要在main中声明,相当于使能,代码执行到此时发生串口中断,把数据存到rec-data中然后跳到串口中断函数中

在函数中将刚才储存的数据发送出去后又接收新的数据,这也就是为什么接收函数中发送数据的代码要在接收代码上面

八.灯

题目要求灯的亮灭有时间要求,这就需要去配置一个0.1s的定时器,定时器记得使能中断后生成代码

九.PWM输出功能(不熟)

输出PWM

PA1配置为PWM输出,计算f'为2000hz,不需要开启中断

生成代码,开启PWM,设置占空比

输入捕获

还需要一个引脚来捕获频率,这个题目没有要求。但是我们需要用来查看自己的PWM和占空比是否正确,输入捕获是需要用中断的

生成代码,开启

找到回调函数写输入捕获函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);

占空比计算的时候,如果输出用%d,CCR/ARR是的小数的,这个输出是会出错的,CCR*100再除

相关文章:

  • 【R语言】 文件,vector, matrix,dataframe 的基本操作
  • STM32---FreeRTOS软件定时器
  • 修改HuggingFace模型默认缓存路径
  • C 语言中 typedef struct 与 struct 的区别详解
  • 射频组件、度量和数学计算
  • F8 逐行执行(Step Over) F7 进入方法(Step Into) Shift+F8 跳出方法(Step Out)
  • 合React宝宝体质的自定义防抖hook
  • 相对路径跳转和绝对路径跳转有什么区别?
  • Vue3一个组件绑定多个 v-model,自定义 prop 和 event 名称
  • 【区块链 + 金融服务】寿险业直保再保协同平台 | FISCO BCOS 应用案例
  • 【计算机网络】一二章
  • java面试题之多线程
  • 怎么鉴别金媒v10.51和v10.5的区别!单单从CRM上区分!
  • Git 新建本地分支并关联到远程仓库
  • 在制作电脑的过程中,如何区分整机性能问题和应用自身性能问题
  • 【2025 最新 Cursor AI 教程 05】用 Cursor AI 解决常见开发问题
  • SpringMVC-登录校验
  • 【Leetcode】328. 奇偶链表
  • element-ui progress 组件源码分享
  • 初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
  • 国家发改委:建立实施育儿补贴制度
  • 气温“过山车”现象未来或更频繁且更剧烈
  • 铁路上海站五一假期预计发送446万人次,同比增长8.4%
  • 首映|《人生开门红》:段子背后都是案子
  • 地下管道密布成难题,道路修整如何破局?
  • 伊朗港口爆炸最新情况:14死700多伤,大火延烧,调查困难