第十五届蓝桥杯嵌入式模拟考试I

news2024/12/24 21:13:23

第十五届蓝桥杯嵌入式模拟考试I

时隔多日,蓝桥杯比赛将之,听老师说还有模拟题这个东西(以前从没听说过),不模拟不知道,一模拟吓一跳,废话不多说直接上图,这是只做编程题的得分满分85,剩下的几分我实在拿不到了

image-20240323011933926

前面2次提交时没有注意lcd的行数,看了评测记录才知道又很多的评测都跟lcd有关,如果显示的行数出错那当然是拿不到分的,后面那次提交是因为题目中lcd是从第一行开始的,而我们的lcd 是从Line0开始的,还是会导致lcd差一行,应该庆幸没有直接比赛,而是进行了模拟,经过这次模拟后才发现了,自己有时粗心大意的毛病,大家做题的时候可不要学我,要仔细审题,不要放过任何一个细节。

下面进行此次题目的分析,其他部分就不多解释,主要是usart_process(),在这个函数中我使用switch case语句实现了一个状态机

下面是对各个状态的解释

状态0

这个状态是为了判断串口是否接收到了数据,如果接收到数据就解析该数据,同时进入状态2,如果没有接收到数据那就继续等待

状态1

这个状态是将收到的指令赋值给model,同时更新接收到数据的时间

状态2

这个状态用于等待5s内是否有按键按下,按键按下则说明左转或者右转成功,然后继续回到状态0,继续等待下一次数据,同时要return出去防止下面的5s内没有按键按下的逻辑也执行,如果5s内没有按键按下,那就要像串口助手发送警告信息,并且继续回到状态0等待

这个题目的状态机并不复杂稍加思考就能想到,关键在每个状态的转换条件以及每个状态应该做什么动作

题目

image-20240323011509614

image-20240323011524476

image-20240323011537863

image-20240323011550074

代码

这里只给出了主要的代码,key,led,myadc的代码,可以看我往期文章

蓝桥杯历年省赛合集

main.c
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "key.h"
#include "led.h"
#include "myadc.h"
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern Key key[4];
uint8_t menu = 0;
float distance;
uint8_t lcdtext[30];
char  model = 'S';
float Kval = 300.0f/3.0f;
extern uint8_t buffer[5];
extern uint8_t rxdata[1];
uint8_t printtext[40];
extern uint8_t pointer;
uint64_t rxtime;
uint8_t B3=0,B4=0;
uint32_t led1time,led2time;
uint8_t led;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void key_process(void)
{
	if(key[0].key_flag&&menu==1)
	{
		key[0].key_flag = 0;
		menu = 0;
		model = 'S';
		sprintf((char *)printtext, "Success\r\n");
    HAL_UART_Transmit(&huart1, printtext, strlen((char *)printtext), 100);
		LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);		
	}
	if(key[2].key_flag)
	{
		key[2].key_flag = 0;
		if(model=='S'&&menu==0)
		{
			sprintf((char *)printtext, "Warn\r\n");
      HAL_UART_Transmit(&huart1, printtext, strlen((char *)printtext), 100);
			menu = 1;
			
		}
		if(model=='L')
		{
			B3 = 1;
		}
		
		LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
	}
	
	if(key[3].key_flag)
	{
		key[3].key_flag = 0;
		if(model=='S'&&menu==0)
		{
			menu = 1;
			sprintf((char *)printtext, "Warn\r\n");
      HAL_UART_Transmit(&huart1, printtext, strlen((char *)printtext), 100);
		}
		if(model=='R')
		{
			B4 = 1;
		}
		
		LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
	}
}
void usart_process(void)
{
    static uint8_t state = 0;
    switch(state)
    {
        case 0: // 等待接收数据状态
            if(pointer > 0)
            {
                // 检查是否为'R'或'L'
								sprintf((char *)printtext,"WAIT\r\n");
								HAL_UART_Transmit(&huart1,printtext,strlen((char *)printtext),100);
                if(buffer[0] == 'R' || buffer[0] == 'L')
                {
                    state = 1; // 是'R'或'L',转移到解析数据状态
                }
                else
                {
                    // 不是'R'或'L',直接发送ERROR
                    sprintf((char *)printtext, "ERROR\r\n");
                    HAL_UART_Transmit(&huart1, printtext, strlen((char *)printtext), 100);
                    // 重置指针和缓冲区,准备下一次数据接收
                    pointer = 0;
                    memset(buffer, 0, sizeof(buffer));
                    // 不改变状态,留在0等待下一次数据
                }
            }
            break;
        case 1: // 解析数据状态
            model = buffer[0]; // 此时model已经确定是'R'或'L'
            rxtime = uwTick; // 更新接收时间
            state = 2; // 准备进行下一步的逻辑判断
            break;
        case 2: // 判断数据类型并等待按键按下状态
            if(uwTick - rxtime <= 5000) // 5秒内的逻辑处理
            {
                if((model == 'L' && B3) || (model == 'R' && B4))
                {
                    // 按键成功响应
                    sprintf((char *)printtext, "Success\r\n");
                    HAL_UART_Transmit(&huart1, printtext, strlen((char *)printtext), 100);
                    // 重置按键状态
                    B3 = 0;
                    B4 = 0;
										menu = 0;
										pointer = 0;
										memset(buffer, 0, sizeof(buffer));
										state = 0; // 重置状态,返回等待接收数据状态
										model = 'S';
										return;
                }
                else
                {
                    // 继续等待按键或超时
                    break;
                }
            }
            else
            {
                // 超过5秒,发送超时警告
							menu = 1;
							B3 = 0;
              B4 = 0;
							LCD_Clear(Black);
							LCD_SetBackColor(Black);
							LCD_SetTextColor(White);
              sprintf((char *)printtext, "Warn\r\n");
              HAL_UART_Transmit(&huart1, printtext, strlen((char *)printtext), 100);
            }
            // 重置指针和缓冲区,准备下一次数据接收
            pointer = 0;
            memset(buffer, 0, sizeof(buffer));
            state = 0; // 重置状态,返回等待接收数据状态
            break;
    }
}

	
	
void adc_process(void)
{
	float adcval = get_adc(&hadc2);
	if(adcval>=0&&adcval<=3.0f)
	{
		distance = adcval*Kval;
	}else if(adcval>3.0){
		distance = 300;
	}
}
void lcd_process(void)
{
	switch(menu)
	{
		case 0:
		{
			sprintf((char *)lcdtext,"       DATA  ");
			LCD_DisplayStringLine(Line1,lcdtext);
			
			sprintf((char *)lcdtext,"   N:%c",model);
			LCD_DisplayStringLine(Line3,lcdtext);
			sprintf((char *)lcdtext,"   D:%.1f",distance);
			LCD_DisplayStringLine(Line4,lcdtext);
		}break;
		case 1:
		{
			sprintf((char *)lcdtext,"        WARN");
			LCD_DisplayStringLine(Line4,lcdtext);
		}break;
	}
}
void led_process(void)
{
	static uint8_t led1state = 0;
	static uint8_t led2state = 0;
	if(menu==0&&model=='L')
	{
		
		
		if(uwTick-led1time>100)
		{
			led1time = uwTick;
			if(led1state)
			{
				led1state = 0;
				led&=~0x01;
			}else{
				led1state = 1;
				led|=0x01;
			}
			led_display(led);
		}
	}else{
		led&=~0x01;
		led_display(led);
	}
	
	if(menu==0&&model=='R')
	{
		if(uwTick-led2time>100)
	{
		led2time = uwTick;
		if(led2state)
		{
			led2state = 0;
			led&=~0x02;
		}else{
			led2state = 1;
			led|=0x02;
		}
		led_display(led);
	}
	
	}else{
		led&=~0x02;
		led_display(led);
	}
	
	if(menu==1)
	{
		led|=0x80;
		led_display(led);
	}else{
		led&=~0x80;
		led_display(led);
	}
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC2_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

    LCD_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
		HAL_TIM_Base_Start_IT(&htim2);
		HAL_UART_Receive_IT(&huart1,rxdata,1);
		led_display(0x00);
    while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			adc_process();
			led_process();
			key_process();
			usart_process();
			lcd_process();
    }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the peripherals clocks
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC12;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
    /* User can add his own implementation to report the HAL error return state */

  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
    /* User can add his own implementation to report the file name and line number,
       tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

usart1.c
#include "usart1.h"
#include <stdio.h>
#include <string.h>
uint8_t buffer[5];
uint8_t rxdata[1];
uint8_t pointer = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)
	{
		buffer[pointer++] = rxdata[0];
		HAL_UART_Receive_IT(huart,rxdata,1);
	}
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1538033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:数据在内存中的存储

目录 一、 整数在内存中的存储二、 大小端字节序和字节序判断1.什么是大小端2.为什么有大小端3.练习(1)练习1(2)练习2(3)练习3(4)练习4(5)练习5(6)练习6 三、 浮点数在内存中的存储1.练习2.浮点数的存储(1) 浮点数存的过程(2)浮点数取的过程 3.题目解析 一、 整数在内存中的存储…

亚马逊AWS展示高效纠错的全新量子比特!

亚马逊网络服务公司&#xff08;AWS&#xff09;在量子计算的纠错技术领域取得了显著成就&#xff0c;极大地简化了量子系统的复杂性和资源需求。他们的研究人员通过采用“双轨擦除”量子比特&#xff08;dual-rail erasure qubit&#xff09;技术&#xff0c;有效地克服了量子…

四川宏博蓬达法律咨询有限公司:法律服务安全的新标杆

在这个法治社会&#xff0c;法律服务行业扮演着越来越重要的角色。四川宏博蓬达法律咨询有限公司&#xff0c;作为行业内的佼佼者&#xff0c;始终坚持以客户为中心&#xff0c;为客户提供专业、高效、安全的法律服务。 一、公司背景与实力展示 四川宏博蓬达法律咨询有限公司自…

python的BBS论坛系统flask-django-nodejs-php

为了更好地发挥本系统的技术优势&#xff0c;根据BBS论坛系统的需求&#xff0c;本文尝试以B/S架构设计模式中的django/flask框架&#xff0c;python语言为基础&#xff0c;通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法&#xff…

Python 将HTML转为PDF、图片、XML、XPS格式

网页内容是信息传播的主要形式之一。在Web开发中&#xff0c;有时候我们需要将HTML文件以不同的格式保存或分享&#xff0c;比如PDF、图片&#xff08;如PNG或JPEG&#xff09;、XML或XPS等。这些格式各有优势&#xff0c;适合不同的用途。在这篇文章中&#xff0c;我们将介绍如…

【OpenCV C++Python】(五)图像平滑(模糊)

文章目录 图像平滑均值滤波高斯滤波中值滤波双边滤波(Bilateral Filtering ) PythonC 图像线性平滑空间滤波&#xff08;加权均值滤波器&#xff0c;几何均值滤波&#xff0c;谐波均值滤波&#xff0c;逆谐波均值滤波&#xff09;&#xff0c;非线性平滑空间滤波&#xff08;中…

mysql 索引原理为什么用b+树而不用二叉树

在数据库中&#xff0c;索引是一种数据结构&#xff0c;它能够快速定位到存储在数据库表中特定行的数据。MySQL等数据库管理系统通常使用B树作为索引的数据结构&#xff0c;而不使用二叉树&#xff0c;主要基于以下几个原因&#xff1a; 高度平衡&#xff1a;B树是一种多路搜索…

【python】python3基础

文章目录 一、安装pycharm 二、输入输出输出 print()文件输出&#xff1a;格式化输出&#xff1a; 输入input注释 三、编码规范四、变量保留字变量 五、数据类型数字类型整数浮点数复数 字符串类型布尔类型序列结构序列属性列表list &#xff0c;有序多维列表列表推导式 元组tu…

三角形单元悬臂梁Matlab有限元编程 【程序源码+PPT讲义】|平面单元 | 三节点

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

虚拟机安装Linux系统,FinalShell远程连接Linux

1.虚拟机安装CentOS系统 2. 查看CentOS系统的ip地址 3. FinalShell远程连接Linux 3.虚拟机快照&#xff08;存档&#xff09; 确保虚拟机关机&#xff0c;找到快照模拟器 恢复快照

字符函数与字符串函数

目录 一.字符分类函数 二.字符转化函数 三.strlen函数 函数的介绍 strlen函数的模拟实现 1.计算器法 2.递归 三.指针-指针的方式 四.strcpy函数 函数介绍 strcmp的模拟实现 五.strcat函数 函数介绍 strcat的模拟实现 六.strcmp函数 函数介绍 返回值 strcm…

论文阅读-MIPD:一种用于分布式深度神经网络训练的自适应梯度稀疏化框架

摘要—基于参数服务器架构的异步训练广泛应用于大规模数据集和深度神经网络模型的扩展训练。在大规模分布式深度学习系统中&#xff0c;通信一直被认为是主要瓶颈。最近的研究尝试通过梯度稀疏化和量化方法来减少通信流量。我们发现前期研究存在三个限制。首先&#xff0c;他们…

pycharm中anaconda虚拟环境下进行matlab函数调用设置

1&#xff0c;具体的matlab版本对应的engine参考 matlab安装路径下的“extern\engines\python”文件夹内&#xff0c;setup.py文件打开可以查看 例如我的安装路径是“C:\Program Files\Polyspace\matlabR2021a\extern\engines\python”&#xff0c;matlab版本是2021a&#xf…

c++的学习之路:2、入门(1)

一、 C关键字 c的关键字要比c语言要多31个足足有63个&#xff0c;这里我只是了解了下每个有啥作用&#xff0c;具体使用方法以及更多的知识将在后续学习中&#xff0c;慢慢扩展使用&#xff0c;下方表格就是c的63个关键字 asmdoifreturntryautodoubleinlinetypedefdynamic_ca…

新能源汽车BMS应用设计

新能源汽车BMS应用设计 电池管理系统&#xff08;BMS&#xff09; 概述 电池管理系统&#xff08;BMS&#xff09;为一套保护动力电池使用安全的控制系统&#xff0c;时刻监控电池的使用状态&#xff0c;通过必要措施缓解电池组的不一致性&#xff0c;为新能源车辆的使用安全…

Android Studio 编译报错 ( Could not find com.android.tools.build:gradle:4.2.1.)

检查下根目录下的 build.gradle 配置 , 是否只配置了 jcenter 仓库 &#xff0c;加上 google()mavenCentral() 重新编译试一下

RuoYi 自定义字典列表页面编码翻译

“字典数据”单独维护&#xff0c;而不是使用系统自带的字典表&#xff0c;应该如何使用这样的字典信息呢&#xff1f; 系统字典的使用&#xff0c;请参考&#xff1a; 《RuoYi列表页面字典翻译的实现》 https://blog.csdn.net/lxyoucan/article/details/136877238 需求说明…

案例精选 | 新疆科技学院下一代智慧安全运营中心建设项目

新疆科技学院&#xff0c;是新疆维吾尔自治区人民政府举办的全日制普通本科高校。学校始建于2002年&#xff0c;前身为新疆财经大学商务学院&#xff0c;2019年12月经教育部批准转设为新疆科技学院。学校分为东、西两个校区&#xff0c;总占地面积3070亩&#xff0c;开设24个本…

在Windows中安装wsl2和ubuntu22.04

目录 一、概述二、安装wsl22.1 虚拟化设置2.2 虚拟化设置2.3 切换和更新wsl2 三、安装ubuntu3.1 下载Ubuntu22.043.2 配置Ubuntu22.04 一、概述 wsl2是一种面向Windows操作系统的虚拟化技术&#xff0c;可以让我们在Windows操作系统中“丝滑”的运行Linux系统。wsl2由微软团队…

VScode手动安装vsix格式插件,提示安装插件与code版本不兼容问题

问题描述: vscode手动按装插件提示"插件不兼容code版本 原因方案:修改安装包内的package.json文件中的版本号与vscode版本号对应即可 解决步骤 以(adpyke.codesnap-1.3.4.vsix)安装包为例 手动安装vscode弹出 无法安装扩展“adpyke.codesnap-1.3.4”&#xff0c;它与 …