博客
关于我
2015年嵌入式第六届省赛真题解析
阅读量:798 次
发布时间:2023-04-16

本文共 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_disptime_ctrl 变量控制时间显示和上报。
  • 按下设置按键时,更新时间显示,并在界面返回时同步 time_ctrl 变量。

4. 数据发送

  • 自动上报时间数据,确保仅在时间相等时刻发送一次。
  • 数据发送控制通过 Ctrl_Uart_Send_Time_Data_Times 变量管理。

5. 键盘控制

  • 按键按下时触发相应功能,包括界面切换、设置时间、LED控制等。

五、错误处理

  • 数据接收错误时,需恢复为初始状态,确保系统稳定运行。
  • 串口数据处理时间控制在 200ms~300ms 之间,确保数据完整接收。

六、总结

本项目通过模块化设计和简洁的代码实现,确保设备功能稳定可靠。

转载地址:http://nygfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现BellmanFord贝尔曼-福特算法(附完整源码)
查看>>
Objective-C实现BF算法 (附完整源码)
查看>>
Objective-C实现binary exponentiation二进制幂运算算法(附完整源码)
查看>>
Objective-C实现binomial coefficient二项式系数算法(附完整源码)
查看>>
Objective-C实现bogo sort排序算法(附完整源码)
查看>>
Objective-C实现CaesarsCiphe凯撒密码算法(附完整源码)
查看>>
Objective-C实现cartesianProduct笛卡尔乘积算法(附完整源码)
查看>>
Objective-C实现check strong password检查密码强度算法(附完整源码)
查看>>
Objective-C实现circle sort圆形排序算法(附完整源码)
查看>>
Objective-C实现coulombs law库仑定律算法(附完整源码)
查看>>
Objective-C实现DBSCAN聚类算法(附完整源码)
查看>>
Objective-C实现dijkstra银行家算法(附完整源码)
查看>>
Objective-C实现Dinic算法(附完整源码)
查看>>
Objective-C实现disjoint set不相交集算法(附完整源码)
查看>>
Objective-C实现DisjointSet并查集的算法(附完整源码)
查看>>
Objective-C实现djb2哈希算法(附完整源码)
查看>>
Objective-C实现DNF排序算法(附完整源码)
查看>>
Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
查看>>
Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
查看>>
Objective-C实现double hash双哈希算法(附完整源码)
查看>>