2015年嵌入式第六届省赛真题解析
发布日期:2025-06-19 06:16:27
浏览次数:6
分类:精选文章
本文共 2840 字,大约阅读时间需要 9 分钟。
一、题目
本项目旨在开发一个电压测量监控设备,该设备由多个模块组成,使用简便易懂。为了完成简单项目,需理清程序框架。功能主要分为显示界面、设置界面和串口接发三部分。
二、题目分析
设备的主要功能包括显示界面、设置界面和串口接发。
- 显示界面:由外设读取显示内容,设置界面则用于设置自动上报的时间。
- 界面控制:通过LCD_GUI变量控制界面切换。
- 0x00表示显示界面;
- 0x10表示小时;
- 0x11表示分钟;
- 0x12表示秒。
- 设置界面:用于设置时间,选中的时间分秒会以闪烁形式显示。
- 串口接发:在时间相等时刻自动向串口发送数据。
- 数据处理:确保数据正确接收和处理,需考虑错误情况下的恢复机制。
三、程序
#include "main.h"#include "RCC/bsp_rcc.h"#include "KEY_LED/bsp_key_led.h"#include "LCD/bsp_lcd.h"#include "UART/bsp_uart.h"#include "I2C/bsp_i2c.h"#include "ADC/bsp_adc.h"#include "RTC/bsp_rtc.h"uint32_t uwTick_Key_Set_Point = 0;uint32_t uwTick_Led_Set_Point = 0;uint32_t uwTick_Lcd_Set_Point = 0;uint32_t uwTick_Usart_Set_Point = 0;uint32_t uwTick_Set_time_Set_Point = 0;uint32_t uwTick_Uart_TI_time_Set_Point = 0;bool Start_Flag = false;uint8_t ucKey_Val, unKey_Down, ucKey_Up, ucKey_Old;uint8_t ucLed = 0;uint8_t Lcd_Disp_String[21];uint8_t str[40];uint8_t rx_buffer[100];uint8_t rx_buf = 0;uint8_t rx_buf_index = 0;uint8_t k_int = 1;RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef sDate = {0};uint8_t LCD_GUI = 0x00;uint8_t time_disp[3] = {0};uint8_t time_ctrl[3] = {0};uint8_t set_ctrl = 0;uint8_t led_ctrl = 1;uint8_t Ctrl_Uart_Send_Time_Data_Times = 0;// 减速变量__IO uint32_t uwTick_Key_Set_Point = 0;__IO uint32_t uwTick_Led_Set_Point = 0;__IO uint32_t uwTick_Lcd_Set_Point = 0;__IO uint32_t uwTick_Usart_Set_Point = 0;__IO uint32_t uwTick_Set_time_Set_Point = 0;__IO uint32_t uwTick_Uart_TI_time_Set_Point = 0;// 按键扫描专用变量uint8_t ucKey_Val, unKey_Down, ucKey_Up, ucKey_Old;// LED专用变量uint8_t ucLed = 0;// LCD显示专用变量uint8_t Lcd_Disp_String[21];// 串口专用变量uint8_t str[40];uint8_t rx_buffer[100];uint8_t rx_buf;uint8_t rx_buf_index = 0;// EEPROM相关变量uint8_t k_int = 1;// RTC时间RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef sDate = {0};uint8_t LCD_GUI = 0x00; // 默认显示界面// 子函数void Key_Proc(void);void Led_Proc(void);void Lcd_Proc(void);void Usart_Proc(void);// 主函数int main(void) { // 系统初始化 HAL_Init(); SystemClock_Config(); KEY_LED_Init(); LCD_Init(); LCD_Clear(White); LCD_SetBackColor(White); LCD_SetTextColor(Blue); UART1_Init(); I2CInit(); ADC1_Init(); ADC2_Init(); RTC_Init(); // 外设使用 // 串口接收中断打开 HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_buffer, 4); while (1) { Key_Proc(); Led_Proc(); Lcd_Proc(); Usart_Proc(); v1 = getADC2() / 4096.0 * 3.3; }} 四、功能实现
1. 串口接收
- 数据格式为
k0.x\n,转换为十六进制为6B 30 2E 31 5C 6E。 - 串口接收中断回调函数实现数据处理,确保数据正确接收和处理。
- 数据错误时,需恢复为初始状态,确保下次接收的准确性。
2. 界面控制
- 通过
LCD_GUI变量控制界面切换。 - 0x00为显示界面,0x10为小时,0x11为分钟,0x12为秒。
- 设置界面时,选中的时间分秒会闪烁显示。
3. 时间设置
- 通过
time_disp和time_ctrl变量控制时间显示和上报。 - 按下设置按键时,更新时间显示,并在界面返回时同步
time_ctrl变量。
4. 数据发送
- 自动上报时间数据,确保仅在时间相等时刻发送一次。
- 数据发送控制通过
Ctrl_Uart_Send_Time_Data_Times变量管理。
5. 键盘控制
- 按键按下时触发相应功能,包括界面切换、设置时间、LED控制等。
五、错误处理
- 数据接收错误时,需恢复为初始状态,确保系统稳定运行。
- 串口数据处理时间控制在 200ms~300ms 之间,确保数据完整接收。
六、总结
本项目通过模块化设计和简洁的代码实现,确保设备功能稳定可靠。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2026年06月19日 04时11分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP反射机制
2023-03-01
php取当天的最后一秒_Docker快速搭建PHP开发环境详细教程
2023-03-01
php取绝对值
2023-03-01
php各种常用的算法
2023-03-01
php各种缓存策略对比
2023-03-01
php后台“爬虫”模拟登录第三方系统
2023-03-01
php后台的在控制器中就可以实现阅读数增加
2023-03-01
php命令行生成项目结构
2023-03-01
php命名空间
2023-03-01
PHP命名空间带来的干扰
2023-03-01
PHP和MySQL Web开发从新手到高手,第1天-搭建PHP开发环境
2023-03-01
php商店管理系统,基于PHP的商店管理系统.doc
2023-03-01
PHP四大主流框架的优缺点总结
2023-03-01
PHP图片处理—PNG透明缩放并生成灰图
2023-03-01
php在liunx系统中设置777权限不起作用解决方法
2023-03-01
PHP基于openssl实现的非对称加密操作
2023-03-01
php基本符号大全
2023-03-01
php基础篇-二维数组排序 array_multisort
2023-03-01
php增删改查封装方法
2023-03-01
php多条件筛选功能的实现
2023-03-01