【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

目录


题目

硬件框图

功能描述

题目分析

代码实现

adc模块

LCD与LED模块

按键模块


正文


题目


硬件框图


9999.png


功能描述


1基本功能

       1)测量竞赛板上电位器R37输出的模拟电压信号Via;,并通过液晶屏实时显示数据。


       2)通过LED指示灯实现超出上限、低于下限的提醒功能。


       3)通过按键实现阈值范围和输出提醒指示灯的设置功能。


2显示功能

       1)数据显示界面

       数据显示界面包含三个显示要素:界面名称、采集的实时电压数据和状态。

8888.png

备注:

       上述界面供设计参考,选手可根据试题要求对界面进行设计,界面需包含试题要求的全部显示要素。


       电压单位为伏特,数据保留小数点后两位有效数字。


       状态(Status):超过上限(Upper)、低于下限(Lower)和正常(Normal)。


       2)参数配置界面

       参数配置界面包含五个显示要素:界面名称、电压的上限值、电压的下限值、电压超过上限的提醒指示灯、电压低于下限的提醒指示灯。

       备注:


       上述界面供设计参考,选手可根据试题要求对界面进行设计,界面需包含试题要求的全部显示要素。


       电压上、下限值设置范围为0-3.3V,设备应具备错误设置的保护功能。


       电压提醒指示灯设置范围为LD1到LD8,设备应禁止将上、下限指示灯设置为同一个指示灯。


3按键功能


       1)B1:定义为“设置”按键,按下此按键,切换选择数据显示界面和参数设置界面,按键工作流程如下图所示:


     2)B2:定义为“选择”按键,在参数设置界面按下此按键,切换选择参数项(电压的上限值、电压的下限值、电压超过上限的提醒指示灯、低于下限的提醒指示灯),被选择的参数项“高亮”显示。

      按键工作流程如下图所示:


   3)B3:定义为“加”按键。


       进行电压参数设置时,当前选择的电压参数加0.3V。


       进行LED提醒指示灯参数设置时,LED指示灯序号加1。


       4)B4:定义为“减”按键。


       进行电压参数设置时,当前选择的电压参数减0.3V。


       进行LED提醒指示灯参数设置时,LED指示灯序号减1。


       备注:

       B2、B3、B4仅在设置界面下有效。


       参数设置功能需保护数据边界,电压参数可设置范围0-3.3V,LED提醒指示灯可设置范围LD1—LD8。


       4LED指示灯功能

       1)R37输出电压值超过电压上限值时(>V的上限),上限提醒指示灯以0.2秒为间隔闪烁,下限指示灯熄灭。

       2)R37输出电压值低于电压下限值时(<V的下限),下限提醒指示灯以0.2秒为间隔闪烁,上限指示灯熄灭。

       3)R37输出电压值介于上限和下限电压之间时(V的下限≤≤V的上限),上限、下限提醒指示灯熄灭。

       4)竞赛板上除当前用做超出上限、低于下限提醒功能的指示灯外,其它指示灯应处于熄灭状态。


       5初始状态说明

       1)默认输出提醒指示灯。

               超过上限提醒指示灯:LD1

               低于下限提醒指示灯:LD2


       2)默认电压阈值参数。

               电压的上限值:2.4V

               电压的下限值:1.2V


题目分析


硬件框图分析


       我们通过硬件框图可以看出本题需要哪些基础模块,如本题可看出涉及LCD,LED,按键,模拟电压(也就是模数转换),并因为LCD,LED,按键几乎每年都考,所以显而易见这一年的考试重点在于模拟电压。通过硬件框图知道这些信息后,来我们再来仔细看题。


功能描述分析


       最主要的是测量R37输出的模拟信号,也就是模数转换的过程,然后其他的就是老三样,常见的LCD屏显示,设置了电压的上下限阈值,与阈值相关的功能有LCD屏显示与LED灯,然后就是按键控制,按键只要将条件判断语句写好就行了。其中有一个新点,就是屏幕高亮显示。


总体设计思路


       先将R37的模拟信号获取,定义全局变量,方便其他.c文件使用。 根据按键功能将按键的逻辑实现好。LCD屏也是如此,注意变量的定义即可,实现好高亮显示。LED就是获取按键相关操作之后,判断电压值是否超过阈值,是则亮。


代码实现


adc模块


double getADC(ADC_HandleTypeDef *pin)
{
  uint adc;
  HAL_ADC_Start(pin);
  adc = HAL_ADC_GetValue(pin);
  return adc*3.3/4096;
}


LCD与LED模块


       其中包含高亮显示,高亮显示原理也很简单,在要显示高亮的那一行之前,将LCD背景换成你想要的高亮颜色,这里换成了黄色,然后在显示这一行的信息,注意一行没满用空格填充,否则这一行后面部分会没有高亮显示。显示完成后,再将LCD的背景色改为黑色。

void disp_proc()
{
  double V = getADC(&hadc2);
  if(view==0)
  {
    char text[30];
    sprintf(text,"      Main   ");
    LCD_DisplayStringLine(Line2, (uint8_t *)text);
    sprintf(text,"   Volt:%.2f",getADC(&hadc2));
    LCD_DisplayStringLine(Line4, (uint8_t *)text);
    if(V > max_v)
    {
      sprintf(text,"   Status:Upper");
      LCD_DisplayStringLine(Line5, (uint8_t *)text);
    }
    else if(V < min_v)
    {
      sprintf(text,"   Status:Lower");
      LCD_DisplayStringLine(Line5, (uint8_t *)text);
    }
    else
    {
      sprintf(text,"   Status:Normal");
      LCD_DisplayStringLine(Line5, (uint8_t *)text);
    }
  }
  else if(view==1)
  {
    char text[30];
    //disp_clear();
    sprintf(text,"    Setting    ");
    LCD_DisplayStringLine(Line1, (uint8_t *)text);
    if(hang == 1)
    {
      LCD_SetBackColor(Yellow);
      sprintf(text,"   Max Volt:%.2f     ",max_v);
      LCD_DisplayStringLine(Line3, (uint8_t *)text);
      LCD_SetBackColor(Black);
    }
    else
    {
      sprintf(text,"   Max Volt:%.2f     ",max_v);
      LCD_DisplayStringLine(Line3, (uint8_t *)text);
    }
    if(hang == 2)
    {
      LCD_SetBackColor(Yellow);
      sprintf(text,"   Min Volt:%.2f     ",min_v);
      LCD_DisplayStringLine(Line4, (uint8_t *)text);
      LCD_SetBackColor(Black);
    }
    else
    {
      sprintf(text,"   Min Volt:%.2f     ",min_v);
      LCD_DisplayStringLine(Line4, (uint8_t *)text);
    }
    if(hang == 3)
    {
      LCD_SetBackColor(Yellow);
      sprintf(text,"   Upper:LD%d        ",up_led);
      LCD_DisplayStringLine(Line6, (uint8_t *)text);
      LCD_SetBackColor(Black);
    }
    else
    {
      sprintf(text,"   Upper:LD%d        ",up_led);
      LCD_DisplayStringLine(Line6, (uint8_t *)text);
    }
    if(hang == 4)
    {
      LCD_SetBackColor(Yellow);
      sprintf(text,"   Lower:LD%d        ",lo_led);
      LCD_DisplayStringLine(Line7, (uint8_t *)text);
      LCD_SetBackColor(Black);
    }
    else
    {
      sprintf(text,"   Lower:LD%d        ",lo_led);
      LCD_DisplayStringLine(Line7, (uint8_t *)text);
    }
  }
  LED_mie();
  if(V < min_v)
  {
    TurnOn_LED(lo_led);
  }
  else
  {
    TurnOff_LED(lo_led);
  }
  if(V > max_v)
  {
    TurnOn_LED(up_led);
  }
  else
  {
    TurnOff_LED(up_led);
  }
}


按键模块


void key_proc()
{
  if(key[0].key_flag == 1)
  {
    view = !view;
    LCD_Clear(Black);
    key[0].key_flag = 0;
  }
  if(key[1].key_flag == 1)
  {
    if(view == 1)
    {
      hang++;
      if(hang == 5)
      {
        hang = 1;
      }
    }
    key[1].key_flag = 0;
  }
  if(key[2].key_flag == 1)
  {
    if(view == 1)
    {
      if(hang == 1 && max_v < 3.3)    //不超过3.3
      {
        max_v = max_v + 0.3;
      }
      else if(hang == 2 && min_v < 3.3 && min_v < max_v)      //不超过3.3,并且不超过max_v
      {
        min_v = min_v + 0.3;
      }
      else if(hang == 3)
      {
        if(up_led+1 == lo_led)
            up_led++;
        if(++up_led >= 9)
        {
          up_led = 1;
        }
        if(up_led == lo_led)
            up_led++;
      }
      else if(hang == 4)
      {
        if(up_led == lo_led+1)
            lo_led++;
        if(++lo_led >= 9)
        {
          lo_led = 1;
        }
        if(up_led == lo_led)
            lo_led++;
      }
    }
    key[2].key_flag = 0;
  }
  if(key[3].key_flag == 1)
  {
    if(view == 1)
    {
      if(hang == 1 && max_v > 0 && max_v > min_v)
      {
        max_v = max_v - 0.3;
      }
      else if(hang == 2  && min_v > 0)
      {
        min_v = min_v - 0.3;
      }
      else if(hang == 3)
      {
        if(up_led-1 == lo_led)
            up_led--;
        if(--up_led <= 0)
        {
          up_led = 8;
        }
        if(up_led == lo_led)
            up_led--;
      }
      else if(hang == 4)
      {
        if(up_led == lo_led-1)
            lo_led--;
        if(--lo_led <= 0)
        {
          lo_led = 8;
        }
        if(up_led == lo_led)
            lo_led--;
      }
    }
    LED_mie();
    key[3].key_flag = 0;
  }
}
相关文章
|
2天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
27 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
21天前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
18 1
|
29天前
|
机器学习/深度学习 存储 人工智能
强化学习与深度强化学习:深入解析与代码实现
本书《强化学习与深度强化学习:深入解析与代码实现》系统地介绍了强化学习的基本概念、经典算法及其在深度学习框架下的应用。从强化学习的基础理论出发,逐步深入到Q学习、SARSA等经典算法,再到DQN、Actor-Critic等深度强化学习方法,结合Python代码示例,帮助读者理解并实践这些先进的算法。书中还探讨了强化学习在无人驾驶、游戏AI等领域的应用及面临的挑战,为读者提供了丰富的理论知识和实战经验。
54 5
|
1月前
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
78 3
|
1月前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
135 10
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
40 1
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
103 2
|
2月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
78 0

推荐镜像

更多