首页 > 其他分享 >蓝桥杯嵌入式2023年第十四届省赛主观题解析

蓝桥杯嵌入式2023年第十四届省赛主观题解析

时间:2024-04-08 09:29:25浏览次数:16  
标签:主观题 HAL PIN 蓝桥 TIM LCD key 2023 GPIO

1  题目

2  代码

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "rtc.h"
#include "tim.h"
#include "gpio.h"

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

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
double v;
char buf1[20],buf2[20],buf3[20],buf4[20],buf5[20],buf6[20],buf7[20],buf8[20],buf9[20],buf10[20],buf11[20],buf12[20],buf13[20];
struct keys{
	int state;
	int step;
	int cnt;
	int cnt2;
}key[5];
double f=250,duty=0.2;
int N;
uint32_t OCcnt=0;
int state;
int start,end,R=1,K=1,TR=1,TK=1;
double V,f7,cnt,hmax,lmax;
int time,SR;
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
RTC_AlarmTypeDef sAlarm = {0};
/* 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 */
void getADC()
{
	HAL_ADC_Start(&hadc2);
	v=HAL_ADC_GetValue(&hadc2)*3.3/4096;
}
void LED_Close()
{
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3&&htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
	{
		cnt=HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
		f7=1000000/cnt;
		__HAL_TIM_SetCounter(&htim3,0);
		HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
	}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM1)
	{
		key[1].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[2].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[3].state=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[4].state=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		switch(key[1].step)
		{
			case 0:
			{
				if(key[1].state==GPIO_PIN_RESET)
				{
					key[1].step=1;
				}
			}
			break;
			case 1:
			{
				if(key[1].state==GPIO_PIN_RESET)
				{
					key[1].step=2;
					key[1].cnt++;
					LCD_Clear(White);
					if(key[1].cnt%3==0)
					{
						LCD_DisplayStringLine(Line1,(uint8_t*)buf1);
						LCD_DisplayStringLine(Line3,(uint8_t*)buf2);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf3);
						LCD_DisplayStringLine(Line5,(uint8_t*)buf4);
					}
					if(key[1].cnt%3==1)
					{
						LCD_DisplayStringLine(Line1,(uint8_t*)buf5);
						LCD_SetBackColor(Green);
						LCD_ClearLine(Line3);
						LCD_DisplayStringLine(Line3,(uint8_t*)buf6);
						LCD_SetBackColor(White);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf7);
					}
					if(key[1].cnt%3==2)
					{
						LCD_DisplayStringLine(Line1,(uint8_t*)buf8);
						LCD_DisplayStringLine(Line3,(uint8_t*)buf9);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf10);
						LCD_DisplayStringLine(Line5,(uint8_t*)buf11);
					}
				}
				else
				{
					key[1].step=0;
				}
			}
			break;
			case 2:
			{
				if(key[1].state==GPIO_PIN_SET)
				{
					key[1].step=0;
				}
			}
			break;
		}
		
		switch(key[2].step)
		{
			case 0:
			{
				if(key[2].state==GPIO_PIN_RESET&&key[1].cnt%3!=2)
				{
					key[2].step=1;
				}
			}
			break;
			case 1:
			{
				if(key[2].state==GPIO_PIN_RESET)
				{
					key[2].step=2;
					if(key[1].cnt%3==0)
					{
						if(state==1)
						{
							end=uwTick;
							if(end-start>=1000*5)
							{
								state=0;
							}
						}
						if(state==0)
						{
							key[2].cnt++;
							
						}
					}
					if(key[1].cnt%3==1)
					{
						key[2].cnt2++;
					}
				}
				else
				{
					key[2].step=0;
				}
			}
			break;
			case 2:
			{
				if(key[2].state==GPIO_PIN_SET)
				{
					key[2].step=0;
				}
			}
			break;
		}
		
		switch(key[3].step)
		{
			case 0:
			{
				if(key[3].state==GPIO_PIN_RESET)
				{
					key[3].step=1;
				}
			}
			break;
			case 1:
			{
				if(key[3].state==GPIO_PIN_RESET)
				{
					key[3].step=2;
					if(key[2].cnt2%2==0)
					{
						TR++;
						if(TR>10) TR=1;
						sprintf(buf6,"     R=%d",TR);
						LCD_ClearLine(Line3);
						LCD_DisplayStringLine(Line3,(uint8_t*)buf6);
					}
					else
					{
						TK++;
						if(TK>10) TK=1;
						sprintf(buf7,"     K=%d",TK);
						LCD_ClearLine(Line4);
						LCD_DisplayStringLine(Line4,(uint8_t*)buf7);
					}
				}
				else
				{
					key[3].step=0;
				}
			}
			break;
			case 2:
			{
				if(key[3].state==GPIO_PIN_SET)
				{
					key[3].step=0;
				}
			}
			break;
		}
		if(key[1].cnt%3==1)
		{
			switch(key[4].step)
			{
				case 0:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						key[4].step=1;
					}
				}
				break;
				case 1:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						key[4].step=2;
						if(key[2].cnt2%2==0)
						{
							TR--;
							if(TR<=0) TR=10;
							sprintf(buf6,"     R=%d",TR);
							LCD_ClearLine(Line3);
							LCD_DisplayStringLine(Line3,(uint8_t*)buf6);
						}
						else
						{
							TK--;
							if(TK<=0) TK=10;
							sprintf(buf7,"     K=%d",TK);
							LCD_ClearLine(Line4);
							LCD_DisplayStringLine(Line4,(uint8_t*)buf7);
						}
					}
					else
					{
						key[4].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[4].state==GPIO_PIN_SET)
					{
						key[4].step=0;
					}
				}
				break;
			}
		}
		if(key[1].cnt%3==0)
		{
			switch(key[4].step)
			{
				case 0:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						key[4].step=1;
						time=0;
					}
				}
				break;
				case 1:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						key[4].step=2;
					}
					else
					{
						key[4].step=0;
					}
				}
				break;
				case 2:
				{
					if(key[4].state==GPIO_PIN_RESET)
					{
						time++;
					}
					if(key[4].state==GPIO_PIN_SET)
					{
						if(time>200)
						{
							SR=1;
						}
						else
						{
							SR=0;
						}
						key[4].step=0;
					}
				}
				break;
			}
		}
	}
	if(htim->Instance==TIM4)
	{
		V=f7*2*3.14*R/100/K;
		sprintf(buf4,"     V=%.1lf",V);
		sprintf(buf3,"     P=%.0lf%%",duty*100);
		if(key[1].cnt%3==0)
		{
			LCD_ClearLine(Line4);
			LCD_ClearLine(Line5);
			LCD_DisplayStringLine(Line5,(uint8_t*)buf4);
			LCD_DisplayStringLine(Line4,(uint8_t*)buf3);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		if(key[1].cnt%3!=0)
		{
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		if(key[1].cnt%3!=1)
		{
			R=TR;
			K=TK;
			key[2].cnt2=0;
		}
		if(key[2].cnt%2==0)
		{
			if(V>lmax)
			{
				lmax=V;
				sprintf(buf11,"     NL=%.1lf",lmax);
			}
		}
		if(key[2].cnt%2==1)
		{
			if(V>hmax)
			{
				hmax=V;
				sprintf(buf10,"     NH=%.1lf",hmax);
			}
		}
		if(key[1].cnt%3==2)
		{
			LCD_ClearLine(Line3);
			LCD_ClearLine(Line4);
			LCD_ClearLine(Line5);
			LCD_DisplayStringLine(Line5,(uint8_t*)buf11);
			LCD_DisplayStringLine(Line4,(uint8_t*)buf10);
			LCD_DisplayStringLine(Line3,(uint8_t*)buf9);
		}
		if(SR==1)
		{
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		if(key[1].cnt%3==1)
		{
			LCD_ClearLine(Line3);
			LCD_ClearLine(Line4);
			LCD_SetBackColor(Green);
			if(key[2].cnt2%2==0)
			{
				LCD_ClearLine(Line3);
				LCD_DisplayStringLine(Line3,(uint8_t*)buf6);
				LCD_SetBackColor(White);
				LCD_DisplayStringLine(Line4,(uint8_t*)buf7);
			}
			else
			{
				LCD_ClearLine(Line4);
				LCD_DisplayStringLine(Line4,(uint8_t*)buf7);
				LCD_SetBackColor(White);
				LCD_DisplayStringLine(Line3,(uint8_t*)buf6);
			}
		}
	}
	if(htim->Instance==TIM6)
	{
		if(f>125&&f<250)
		{
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
		else
		{
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		}
	}
}
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2&&htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
	{
		OCcnt=__HAL_TIM_GetCompare(&htim2,TIM_CHANNEL_2);
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)==GPIO_PIN_RESET)
		{
			__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,OCcnt+f*(1-duty));
		}
		else
		{
			__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,OCcnt+f*duty);
		}
	}
}
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
	HAL_RTC_GetDate(hrtc,&sDate,RTC_FORMAT_BIN);
	HAL_RTC_GetTime(hrtc,&sTime,RTC_FORMAT_BIN);
	
	sprintf(buf13,"   TIME:%02d-%02d-%02d",sTime.Hours,sTime.Minutes,sTime.Seconds);
	sprintf(buf12,"   DATE:%02d-%02d-%02d",sDate.Year,sDate.Month,sDate.Date);
	LCD_ClearLine(Line8);
	LCD_ClearLine(Line9);
	LCD_DisplayStringLine(Line8,(uint8_t*)buf13);
	LCD_DisplayStringLine(Line9,(uint8_t*)buf12);
}
/* 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_TIM1_Init();
  MX_TIM2_Init();
  MX_ADC2_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  MX_RTC_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
	LCD_Init();
	LED_Close();
	LCD_Clear(White);
	LCD_SetBackColor(White);
	LCD_SetTextColor(Black);
	HAL_TIM_Base_Start_IT(&htim1);
	HAL_TIM_Base_Start_IT(&htim4);
	HAL_TIM_Base_Start_IT(&htim6);
	HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_2);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
	__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,500);
	sprintf(buf1,"        DATA");
	sprintf(buf2,"     M=L");
	sprintf(buf8,"        RECD");
	sprintf(buf5,"        PARA");
	sprintf(buf6,"     R=1");
	sprintf(buf7,"     K=1");
	sprintf(buf10,"     NH=0.0");
	LCD_DisplayStringLine(Line1,(uint8_t*)buf1);
	LCD_DisplayStringLine(Line3,(uint8_t*)buf2);
	LCD_DisplayStringLine(Line4,(uint8_t*)buf3);
	LCD_DisplayStringLine(Line5,(uint8_t*)buf4);
  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
		getADC();
		if(SR==0)
		{
			if(v>=1&&v<=3) duty=0.375*v-0.275;
			if(v<1) duty=0.1;
			if(v>3) duty=0.85;
		}
		if(key[1].cnt%3==0&&key[2].cnt%2==1&&state==0)
		{
			N++;
			state=1;
			start=uwTick;
			for(int i=4000;i<=8000;i+=100)
			{
				f=1000000/i;
				HAL_Delay(100);
			}
			sprintf(buf2,"     M=H");
			LCD_ClearLine(Line3);
			LCD_DisplayStringLine(Line3,(uint8_t*)buf2);
		}
		if(key[1].cnt%3==0&&key[2].cnt%2==0&&key[2].cnt>0&&state==0)
		{
			N++;
			state=1;
			start=uwTick;
			for(int i=8000;i>=4000;i-=100)
			{
				f=1000000/i;
				HAL_Delay(100);
			}
			sprintf(buf2,"     M=L");
			LCD_ClearLine(Line3);
			LCD_DisplayStringLine(Line3,(uint8_t*)buf2);
		}
		sprintf(buf9,"     N=%d",N);
  }
  /* USER CODE END 3 */
}

标签:主观题,HAL,PIN,蓝桥,TIM,LCD,key,2023,GPIO
From: https://blog.csdn.net/m0_71934846/article/details/137358880

相关文章

  • 蓝桥杯练习系统(算法训练)ALGO-963 转圈游戏
    资源限制内存限制:128.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s问题描述n个小伙伴(编号从0到n-1)围坐一圈玩游戏。按照顺时针方向给n个位置编号,从0到n-1。最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置,……,依此类推。游戏规......
  • 蓝桥杯练习系统(算法训练)ALGO-962 积木大赛
    资源限制内存限制:128.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s问题描述THU幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi。在搭建开始......
  • 蓝桥杯—DS1302
    目录1.管脚2.时序&官方提供的读写函数3.如何使用读写函数4.如何在数码管中显示在DS1302中读取出的数据?1.管脚2.时序&官方提供的读写函数/* # DS1302代码片段说明 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。 2. 参赛选手可以自行编写相关代码或......
  • 洛谷B3835 [GESP202303 一级] 每月天数
    这道题是让我们输出给定的月份有多少天#include<bits/stdc++.h>usingnamespacestd;intmain(){ intyear,month;cin>>year>>month;if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){cout<<31;......
  • 洛谷B3840 [GESP202306 二级] 找素数
    这道题让我们找A 和 B 之间(包括 A 和 B)有多少个素数。#include<bits/stdc++.h>usingnamespacestd;boolisprime(intn){if(n==0||n==1)returnfalse;for(inti=2;i*i<=n;i++){if(n%i==0)returnfalse;}returntrue;}intmain(){......
  • 『Dynamo教程目录整理2023.01』BIM的乐趣By九哥
    你好,我是九哥~经常发现,很多小伙伴问的问题,其实以前文章里都讲过,所以为了方便小伙伴们查找和学习,我将公众号里的Dynamo相关文章整理了出来,查找资料就不用来回的翻历史记录了~一、基础教程Dynamo初学常识梳理Dynamo初学常识梳理(二)Dynamo初学常识梳理(三)——节点Dyna......
  • 螺旋矩阵(蓝桥杯-Python)
    importosimportsys#请在此输入您的代码n,m=input().split()n=int(n)m=int(m)arr=[[0forjinrange(m)]foriinrange(n)]r,c=input().split()r=int(r)c=int(c)defdo_l():globaln,m,r,c,arr#四个方向#右下左上......
  • FQQQ的蓝桥杯
    蓝桥杯15届备战Day213届蓝桥杯省赛文章目录蓝桥杯15届备战Day2前言主观题程序设计1.CUBEMAX配置2.代码部分(分享思路和简单实现任务)总结前言备战蓝桥杯嵌入式,刷题第二天,对象为13届蓝桥杯省赛题工程代码在此网盘提取码:xrpg提示:以下是本篇文章正文内容,下面案......
  • P9732 [CEOI2023] Trade
    题意一个区间,你需要在其中选出一段大于\(k\)的区间。使得前\(k\)大的\(s_i\)减去区间\(c_i\)之差最大。问,价值最大是多少,以及哪些点可以成为被选择的价值最大的区间的前\(k\)大的点。Sol摆摆摆,颓颓颓。注意到有决策单调性,考虑怎么证明。显然,设\(f_i=\maxw(i,......
  • 【每周例题】蓝桥杯 C++ 鸡哥的蛋糕大作战
    鸡哥的蛋糕大作战题目鸡哥的蛋糕大作战 题目分析1.使用一个for循环遍历全数,寻找最大洞的数2.使用一个while进行数位拆分,寻找洞的数量3.使用if从两个条件寻找最大洞的最小数符合最大洞的数洞数相同中的最小数代码#include<iostream>#include<bits/stdc++.h>using......