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

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

相关推荐

  1. 2023C/C++大学A组题解

    2024-04-10 12:20:02       12 阅读
  2. 2023真题----棋盘

    2024-04-10 12:20:02       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-10 12:20:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-10 12:20:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-10 12:20:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-10 12:20:02       18 阅读

热门阅读

  1. 【Livox激光MID-360】调试记录

    2024-04-10 12:20:02       17 阅读
  2. 深入剖析OR与UNION的区别及应用场景

    2024-04-10 12:20:02       14 阅读
  3. python实现pdf的页面替换

    2024-04-10 12:20:02       10 阅读
  4. 【SQL】mysql数据库常见函数功能、适用场景

    2024-04-10 12:20:02       12 阅读
  5. swagger记录

    2024-04-10 12:20:02       12 阅读
  6. NPM常用命令及详解

    2024-04-10 12:20:02       11 阅读
  7. 用ChatGPT4.0生成美观的PDF

    2024-04-10 12:20:02       11 阅读