第十四届蓝桥杯真题

题目

硬件框图

image

功能要求

功能要求

功能概述

       1)通过PA1引脚输出频率、占空比可调节的脉冲信号。

       2)通过PA7引脚完成脉冲捕获功能,测量输入到该引脚的信号频率。

       3)通过微控制器的ADC 功能,检测电位器R37上输出的模拟电压信号。

       4)依试题要求,通过 LCD、LED完成数据显示、报警指示等功能。

       5)依试题要求,通过按键完成界面配置、参数设置等功能。

性能要求

       1)按键响应时间:≤0.1秒。

       2)指示灯动作响应时间:≤0.2秒。

PWM输出(PA1)

       1)低频模式:输出信号频率为4KHz。

       2)高频模式:输出信号频率为8KHz。

       PA1输出信号占空比可以通过电位器R37进行调节,关系如下图所示

image

       当模式切换时,在保证占空比不变的前提下,频率在5秒内均匀的升高或降低到目标频率,要求频率步进值小于200Hz。

频率测量(PA7)

       测量输入到PA7引脚的信号频率,并将其转换为速度值,速度值(v)与频率值(f)的对应关系:

6543.gif

       其中f 单位为Hz,R和K作为参数,可以通过按键进行调整,n取小数点后2位有效数字。

显示功能

       1)数据界面

               显示要素包括界面名称(DATA)、PWM输出模式(M、实时占空比(P)、实时速度(V)。

image

              实时速度取小数点后1位有效数字。

               输出模式以“H”表示高频模式、“L”表示低频模式,模式切换未完成前,屏幕显示的输出模式保持不变。

       2)参数界面

               显示要素包括界面名称(PARA)、参数R和K的当前值,R值和K值有效范围1-10,整数。

image

       3)统计界面

               显示要素包括:界面名称(RECD)、PWM输出模式切换次数(N)、高频和低频模式下的速度最大值。

image

               MH:高频模式最大速度,ML:低频模式最大速度,显示保留小数点后1位有效数字。

       4) LCD通用显示要求

               显示背景色(BackColor):黑色

               显示前景色(TextColor):白色

               数据项与对应的数据之间使用“=”间隔开。

               请严格按照图示3、4、5要求设计各个信息项的名称(区分字母大小写)和行列位置。

按键功能

       1)B1:定义为“界面”按键,按下Bl按键可以往复切换数据、参数和记录三个界面,切换模式如下图所示。

image

     2)B2:定义为“选择”按键。

               在数据界面下,用于切换选择低频或高频模式。按键按下后,5秒内不可再次触发切换功能。

               在参数界面下,按下B2按键,切换选择R或K参数。每次从数据界面进入参数界面,默认当前可调整的参数为R参数;从参数界面退出时,新的R参数和K参数生效。

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

               在参数界面下,按下B3按键,当前可调整的参数加1,参数调整模式:

… 1  2  3  4  …  10  1  2  3  …

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

               在参数界面下,按下B4按键,当前可调整的参数减1,参数调整模式:

… 2  1  10  9  …  2  1  10  9  …

               在数据界面下,长按B4按键超过2秒后松开(长按键),可以“锁定”占空比调整功能,此时输出信号占空比保持不变,不受R37电位器输出电压控制;处于“锁定”状态后,再次按下B4按键(短按键),实现“解锁”功能,恢复R37电位器对输出信号占空比的控制。

要求:

       按键应进行有效的防抖处理,避免出现一次按键动作触发多次功能等情形。

       按键动作不应影响数据采集过程和屏幕显示效果。

       有效区分长、短按键功能,互不影响。

       参数调整应考虑边界值,不出现无效参数。

       当前界面下无功能的按键按下,不触发其它界面的功能。

统计功能

       1)低频模式、高频模式切换次数(N)。

       2)高频、低频输出模式下的最大速度分开统计,保持时间不足2秒的速度值不纳入统计。

LED指示灯功能

       1) LD1:处于数据界面,指示灯LD1点亮,否则熄灭。

       2) LD2:低频模式、高频模式切换期间,指示灯LD2以0.1秒为间隔切换亮、灭状态,模式切换完成后熄灭。

       3) LD3:占空比调整处于“锁定”状态时,指示灯LD3点亮,否则熄灭。4)LD4-LD8指示灯始终处于熄灭状态。

初始状态说明

       请严格按照下列要求设计作品上电后的初始状态:

       1)参数R为1。

       2)参数K为1。

       3)切换次数N为0。

       4)PWM输出模式为低频模式。

       5)处于“解锁”状态,R37电位器可以控制信号占空比。

       6)处于数据显示界面。

主程序:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 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 "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "interrupt.h"
#include "led.h"
#include "myadc.h"
#include "stdio.h"
#include "string.h"
#include "lcd.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern struct key_t key[4];
extern struct frq_t frq;
extern struct myadc_t adc2;
extern struct interface_t interface;
extern  struct data_t data;
extern  struct led_t led;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
void lcd_process(void)
{
	  char buf[30];
		if(interface.flg == 0)//data
		{
				sprintf(buf,"        DATA");
			  LCD_DisplayStringLine(Line1,(uint8_t*)buf);
			  sprintf(buf,"     M=%c",frq.mode);
			  LCD_DisplayStringLine(Line3,(uint8_t*)buf);
			  sprintf(buf,"     P=%.1f%c",adc2.p,'%');
			  LCD_DisplayStringLine(Line4,(uint8_t*)buf);
			  sprintf(buf,"     V=%.1f",frq.v);
			  LCD_DisplayStringLine(Line5,(uint8_t*)buf);
		}
		else if(interface.flg == 1)//参数
		{
				sprintf(buf,"        PARA");
				LCD_DisplayStringLine(Line1,(uint8_t*)buf);
				sprintf(buf,"     R=%d  ",data.r);	

				LCD_DisplayStringLine(Line3,(uint8_t*)buf);
			  sprintf(buf,"     K=%d  ",data.k);
				LCD_DisplayStringLine(Line4,(uint8_t*)buf);
		}
		else if(interface.flg == 2)//统计
		{
				sprintf(buf,"        RECD");
				LCD_DisplayStringLine(Line1,(uint8_t*)buf);
				sprintf(buf,"     N=%d",frq.n);
				LCD_DisplayStringLine(Line3,(uint8_t*)buf);
				sprintf(buf,"     MH=%.1f",frq.mh);
				LCD_DisplayStringLine(Line4,(uint8_t*)buf);
				sprintf(buf,"     ML=%.1f",frq.ml);
				LCD_DisplayStringLine(Line5,(uint8_t*)buf);

		}
}

void key_peocess(void)
{
		//B1
	  if(key[0].short_flg == 1)
		{
			  LCD_Clear(Black);
			  interface.flg++;
			  data.flg = 0;
			  if(interface.flg > 2)
				{
						interface.flg = 0;
				}
				key[0].short_flg = 0;
		}
	  //B2
	  if(key[1].short_flg == 1 && interface.flg == 0)
		{
			  frq.flg = 1;
			  led.flg = 1;
				key[1].short_flg = 0;
		}
	  if(key[1].short_flg == 1 && interface.flg == 1)
		{
			  data.flg++;
			  if(data.flg > 1)
				{
				 data.flg = 0;
				}
				key[1].short_flg = 0;
		}
	  //B3
	  if(key[2].short_flg == 1 && interface.flg == 1)
		{
			  if(data.flg == 0)
				{
						data.r++;
					  if(data.r >=11)
						{
						  data.r = 1;
						}
				}
				else if(data.flg == 1)
				{
						data.k++;
					  if(data.k >=11)
						{
						  data.k = 1;
						}
				}
				key[2].short_flg = 0;
		}
	  //B4
	  if(key[3].short_flg == 1 && interface.flg == 1)
		{
			  if(data.flg == 0)
				{
						data.r--;
					  if(data.r == 0)
						{
						  data.r = 10;
						}
				}
				else if(data.flg == 1)
				{
						data.k--;
					  if(data.k == 0)
						{
						  data.k = 10;
						}
				}
				key[3].short_flg = 0;
		}
		if(key[3].long_flg == 1 && interface.flg == 0)
		{
			 adc2.lock = 1;
				key[3].long_flg = 0;
		}
	  if(key[3].short_flg == 1 && interface.flg == 0)
		{
			   adc2.lock = 0;
				key[3].short_flg = 0;
		}
		
}

void adc_peocess(void)
{
	  adc2.vol = get_adc();
		if(!adc2.lock)
		{
				if(adc2.vol <= 1.0f)
				{
						 adc2.p = 10.0f;
					   __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,frq.val*0.1f);
				}
				else if(adc2.vol >= 3.0f)
				{
					   adc2.p = 85.0f;
						   __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,frq.val*0.85f);
				}
				else
				{
						adc2.p = 37.5f*adc2.vol - 27.5f;
						__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,frq.val*(0.375*adc2.vol -0.275));
				}
		}
}

void frq_process(void)
{
		frq.v = (frq.f*2*3.14f*data.r)/100*data.k;
		frq.ml = (4000*2*3.14f*data.r)/100*data.k;
		frq.mh = (8000*2*3.14f*data.r)/100*data.k;
}

void led_process(void)
{
		uint8_t mode = 0;
	  if(interface.flg == 0)
		{
				mode |= 0x01;
		}
		else
		{
				mode &= 0xfe;
		}
		
		if(adc2.lock == 1)
		{
				mode |= 0x04;
		}
		else
		{
				mode &= 0xfb;
		}
		
		if(led.flg)
		{
				if(led.mode)
				{
						mode |= 0x02;
				}
				else
				{
						mode &= 0xfd;
				}
		}
		else
		{
				 mode&=0xfd;
		}
		
		LED_Disp(mode);
}


/* 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 */

/* 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_TIM4_Init();
  MX_TIM17_Init();
  /* USER CODE BEGIN 2 */
	frq.mode = 'L';
	frq.val = 200;
	data.k = 1;
	data.r = 1;
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	HAL_TIM_Base_Start_IT(&htim4);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	HAL_TIM_IC_Start_IT(&htim17,TIM_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		lcd_process();
		key_peocess();
		adc_peocess();
		frq_process();
		led_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 CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  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 busses 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_3) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the peripherals clocks 
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
  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****/

定时器处理:

#include "interrupt.h"
#include "tim.h"
struct key_t key[4];
struct frq_t frq;
 struct interface_t interface;
 struct data_t data;
 struct led_t led;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	  uint8_t i = 0;
		if(htim->Instance == TIM4)
		{
				key[0].flg = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
				key[1].flg = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
				key[2].flg = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
				key[3].flg = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
			  for(i = 0; i < 4; i++)
			  {
						switch(key[i].place)
						{
							case 0:
								if(key[i].flg == 0)
								{
										key[i].time = 0;
									  key[i].place = 1;
								}
								break;
							case 1:
								if(key[i].flg == 0)
								{
										key[i].place = 2;
								}
								else
								{
										key[i].place = 0;
								}
								break;
							case 2:
								if(key[i].flg == 1)
								{
										if(key[i].time < 200)
										{
												key[i].short_flg = 1;
										}
										key[i].place = 0;
								}
								else
								{
										key[i].time++;
									  if(key[i].time > 200)
										{
												key[i].long_flg = 1;
										}
								}
								break;
						}
				}
		if(frq.flg)
		{
				if(frq.time < 500 && frq.mode == 'L')
				{
						frq.time++;
						if(led.flg)
						{
								led.time++;
							  if(led.time == 10)
								{
									  led.time = 0;
										led.mode =! led.mode;
								}
						}
					  frq.val-=0.2f;
					  if(frq.time == 500)
						{
								frq.val = 100.0f;
								frq.mode = 'H';
								frq.time = 0;
								frq.flg = 0;
							  frq.n++;
							  led.flg = 0;
						
							
						}
						__HAL_TIM_SetAutoreload(&htim2,frq.val);
				}
				if(frq.time < 500 && frq.mode == 'H')
				{
						frq.time++;
						if(led.flg)
						{
								led.time++;
							  if(led.time == 10)
								{
									  led.time = 0;
										led.mode =! led.mode;
								}
						}
					  frq.val+=0.2f;
					  if(frq.time == 500)
						{
								frq.val = 200.0f;
								frq.mode = 'L';
								frq.time = 0;
								frq.flg = 0;
							  frq.n++;
							  led.flg = 0;
							 
							
						}
						__HAL_TIM_SetAutoreload(&htim2,frq.val);
				}
				
		}

		
		}
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	  uint16_t val = 0;
		if(htim->Instance == TIM17)
		{
				val = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
			  __HAL_TIM_SetCounter(htim,0);
			  frq.f = (80000000/80)/val;
			  HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
		}
}

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DENG YIRU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值