十五届蓝桥杯嵌入式代码解析(省一)

一. 获奖证书

在这里插入图片描述

二. 真题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三. 题目解析

3.1 难度分析

博主在考场看到这套题的时候,感觉有点难度,做下去发现难度并不大(相较于14届),以前还预估蓝桥杯赛事题目难度会只增不减,现在看来想法错误了。

3.2 考察要点

这套题目也比较常规,考察LED,LCD,按键,PWM,输入捕获。而这套题目重点要求即是读懂题目,别混淆题意
实际代码并不多,主要是思路问题。

四. 代码

4.1 main.c

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_TIM2_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  LCD_Init();
  LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);
  led_init();
  HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
	//HAL_TIM_Base_Start_IT(&htim4);
  T_init=uwTick;
  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
		 lcd_proc();
	   	 scan_key();
		 key_proc();
     	 led_proc();
		 cal_proc();		
		
  }
  /* USER CODE END 3 */
}

4.2 config.c

#include "config.h"
extern int T_init;
uchar LED_s=0;
struct key keys[4]={0};
int T_key;
uchar UI=0;
int f_A=0;
int f_B=0;
uchar f_t=0;
int PD=1000,PH=5000,PX=0;
int NDA=0,NDB=0,NHA=0,NHB=0;
uchar para_mode=0;
int T_lcd;
int B3_time;
int temp_fa,temp_fb;
void lcd_proc(void)
{
   if(uwTick-T_lcd<100)return;
   T_lcd=uwTick;
   float temp;
 	char text[20];
	f_A=temp_fa;
	f_B=temp_fb;
   if(UI==0)
	 {  		 
	    LCD_DisplayStringLine(Line1,(unsigned char *)"        DATA");
	 if(f_t==0)
	{
	  if(f_A<0)
		sprintf(text,"     A=NULL       ");
		
   else if(f_A<1000)
		  sprintf(text,"     A=%dHz    ",f_A);
	 else 
	 { 
		  temp=f_A/1000.0;
			sprintf(text,"     A=%.2fKHz    ",temp);
	 }
		 
	    LCD_DisplayStringLine(Line3,(unsigned char *)text);
	 
	 if(f_B<0) sprintf(text,"     B=NULL    ");
	 else if(f_B<1000)
		  sprintf(text,"     B=%dHz    ",f_B);
	 else
	 { 
		  temp=f_B/1000.0;
			sprintf(text,"     B=%.2fKHz    ",temp);
	 }
			 
	 LCD_DisplayStringLine(Line4,(unsigned char *)text);
	 }
	
	  else if(f_t==1)
		{  
			if(f_A<0)sprintf(text,"     A=NULL    ");
		    else if(f_A<1000)
				{  
					 temp=1000.0/f_A;
				   sprintf(text,"     A=%.2fmS    ",temp);
				
				}
				else
				{ 
					
				  sprintf(text,"     A=%duS    ",1000000/f_A);  
				
				}
				LCD_DisplayStringLine(Line3,(unsigned char *)text);
				
			 if(f_B<0) sprintf(text,"     B=NULL      ");
			 else if(f_B<1000)
				{  
					temp =1000.0/f_B;
				   sprintf(text,"     B=%.2fmS    ",temp);
				
				}
				else
				{
				  sprintf(text,"     B=%duS    ",1000000/f_B);  
				
				}
				LCD_DisplayStringLine(Line4,(unsigned char *)text);
		  
		}
	  
	
	 
	 }
	 else if(UI==1)
	 {
	     LCD_DisplayStringLine(Line1,(unsigned char *)"        PARA");
		   sprintf(text,"     PD=%dHz   ",PD);
	     LCD_DisplayStringLine(Line3,(unsigned char *)text);
		    sprintf(text,"     PH=%dHz   ",PH);
	     LCD_DisplayStringLine(Line4,(unsigned char *)text);
		     sprintf(text,"     PX=%dHz   ",PX);
	     LCD_DisplayStringLine(Line5,(unsigned char *)text);
		  
	 
	 
	 }
	 else if(UI==2)
	 {
	 
	     LCD_DisplayStringLine(Line1,(unsigned char *)"        RECD");
		                                                         
		   sprintf(text,"     NDA=%d      ",NDA);
		                      
	     LCD_DisplayStringLine(Line3,(unsigned char *)text);
		    sprintf(text,"     NDB=%d      ",NDB);
	     LCD_DisplayStringLine(Line4,(unsigned char *)text);
		     sprintf(text,"     NHA=%d      ",NHA);
	     LCD_DisplayStringLine(Line5,(unsigned char *)text);		   
		    sprintf(text,"     NHB=%d      ",NHB);
	     LCD_DisplayStringLine(Line6,(unsigned char *)text);
	   
	 
	 }

	 

}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
	{
		temp_fa=1000000 /HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+PX;
		__HAL_TIM_SET_COUNTER(htim,0);
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
	}
if(htim->Instance==TIM3)
	{
		temp_fb=1000000 /HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+PX;
		__HAL_TIM_SET_COUNTER(htim,0);
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
	}
}
void cal_proc(void)
{   
	  static int state1=1,state2=1;
    int temp1,temp2;
	  static int A_min=1000000;
	  static int A_max=0;
	  static int B_min=1000000;
	  static int B_max=0;
    if(f_A-PH<0)temp1=0;
	  else temp1=1;
	  if(state1==0&&temp1==1)NHA++;
    state1=temp1;
	
	  if(f_B-PH<0)temp2=0;
	  else temp2=1;
	  if(state2==0&&temp2==1)NHB++;
    state2=temp2;
	  if(uwTick-T_init<3000)
		{
		    
		  if(f_A<A_min)A_min=f_A;
			
			if(f_A>A_max)A_max=f_A;
			
			if(f_B<B_min)B_min=f_B;
			
			if(f_B>B_max)B_max=f_B;
			
		
		}
		else 
		{
			T_init=uwTick;
			if(A_max-A_min>PD)NDA++;
			if(B_max-B_min>PD)NDB++;
			    
			 A_min=1000000;
	     A_max=0;
	     B_min=1000000;
	     B_max=0;
			
			
		}
	  
   


}

void key_proc(void) {
	if(keys[0].press==1) {
		keys[0].press=0;
		if(para_mode==0)
		{
		    if(PD<1000)PD+=100;
		}
		else if(para_mode==1)
		{
		     if(PH<10000)PH+=100;
				
		}
		else if(para_mode==2)
		{
		     if(PX<1000)PX+=100;
		
		}
		
	} 
	else if(keys[1].press==1) {
		keys[1].press=0;
		if(para_mode==0)
		{
		    if(PD>100)PD-=100;
		}
		else if(para_mode==1)
		{
		     if(PH>1000)PH-=100;
				
		}
		else if(para_mode==2)
		{
		     if(PX>-1000)PX-=100;
		
		}
		
		
	} 
	else if(keys[2].press==1) {
		keys[2].press=0;
		if(UI==1)
		{
		   para_mode=(para_mode+1)%3;
		}
		if(UI==0)
		{
		  f_t=(f_t+1)%2;
		 
		}
	
		
	} 
	else if(keys[3].press==1) {
		keys[3].press=0;
		UI=(UI+1)%3;
	  if(UI==0)f_t=0;
		if(UI==1)para_mode=0;
		LCD_Clear(Black);
	}
}


void led_proc(void) {
	
	if(UI==0)LED_s|=0x01;
	else LED_s&=0xfe;
	if(f_A>PH)LED_s|=0x02;
	else LED_s&=0xfd;
	if(f_B>PH)LED_s|=0x04;
	else LED_s&=0xFB;
	if(NDA>=3||NDB>=3)
		LED_s|=0x80;
	else LED_s&=0x7f;
	HAL_GPIO_WritePin(GPIOC,(uint16_t)(0xff<<8),GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,(uint16_t)(LED_s<<8),GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

void scan_key(void) {
	if(uwTick-T_key<20)return ;
	T_key=uwTick;
	keys[0].level=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
	keys[1].level=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
	keys[2].level=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
	keys[3].level=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	for(int i=0; i<4; i++) {
		switch(keys[i].count) {
			case 0:
				if(keys[i].level==0)keys[i].count++;
				break;

			case 1:
				if(keys[i].level==0) {
					keys[i].count++;
					if(UI==2&&i==2)B3_time=uwTick;
				}

				else keys[i].count=0;
				break;

			case 2:
				if(keys[i].level==1) {
					keys[i].count=0;
					keys[i].press=1;
					if(UI==2&&uwTick-B3_time>=1000&&i==2)
					{
					   NDA=0,NDB=0,NHA=0,NHB=0;
					   keys[i].press=0;
					}
				}

				break;
			default :
				break;
		}
	}
}

void led_init(void) {
//初始化
	HAL_GPIO_WritePin(GPIOC,(uint16_t)(0xff<<8),GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}


五. 结语

最后博主希望你们每一个人都能在蓝桥杯赛事中取得好成绩,上天不会辜负每一个努力的人,加油!

### 蓝桥杯嵌入式第15届国赛的信息 #### 比赛题目 对于蓝桥杯嵌入式第15届国赛的比赛题目,官方通常会在比赛当天公布具体的考题内容。不过,从以往的经验来看,每期考题均为全新设计,旨在考察选手的实际编程能力和解决复杂问题的能力[^1]。 #### 参赛规则 参赛者需注意,蓝桥杯大赛有着严格的参赛规定。比赛时长设定为4小时,在此期间内考生需要完成指定的任务。考试的形式、环境设置以及题目的类型都尽可能贴近实际的工程应用场景,以此来全面评估学生的综合能力。此外,为了确保公平公正,考场纪律严格,任何作弊行为都将受到严厉处罚。 #### 备考资料 针对备考方面,建议参考往年的真题进行练习,这有助于熟悉可能遇到的技术难点并提高解题速度。同时,可以关注些在线资源平台上的教程和技术文档,特别是那些涉及算法优化、数据结构等方面的内容。另外,参加学校组织的各种形式的培训活动也是非常有益的选择,比如启动动员会、竞赛辅导课程等都能提供宝贵的学习机会和实战演练。 关于具体的知识点复习方向,可以从基础的数据结构与算法入手,逐步深入到更复杂的领域如动态规划(DP),深度优先搜索(DFS)以及其他常用技巧的应用实践。值得注意的是,虽然某些高级主题如树套树或莫比乌斯反演较少出现在比赛中,但对于想要取得更好成绩的同学来说,广泛涉猎不同类型的题目仍然是十分必要的[^2]。 ```python # 示例代码用于说明如何通过Python实现简单的DFS遍历功能 def dfs(graph, start): visited = set() def _dfs(node): if node not in visited: print(f'Visiting {node}') visited.add(node) for next_node in graph[node]: _dfs(next_node) _dfs(start) graph_example = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': [], 'D': [], 'E': [] } dfs(graph_example, 'A') ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

VersionGod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值