【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解

这篇具有很好参考价值的文章主要介绍了【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原题展示

蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件

原题分析

  本届国赛试题主要包含LCDLED按键EEPROM串口模拟电压输入脉冲输入输出七大部分,其中前面三个部分是蓝桥杯嵌入式的“亲儿子”(必考部分),而剩下的四个部分都为“干儿子”(考频相对较高)。

  相对于本届省赛两套试题:

  •   本套试题串口数据接收出现一个较为复杂的问题:如何接收PC端发送变长数据?省赛的两套试题PC发送的数据类型与长度都比较单一,要不发送7个字符的新旧密码,要不直接发送一个"?"号,而本套试题PC发送的数据长度不定,要不是1位数据,要不是3位数据, 那么这就涉及到串口接收不定长度数据,至于到底该怎么处理,此处小编先保密。😁😁😁

  •   本套试题中还出现了一个较为“新鲜的旧知识点”——LCD显示数据翻转,问题新鲜在于可能屏幕前的你是第一次碰到这个操作,旧知识点是因为很多LCD或LED都可以进行翻转。其实,官方提供的LCD显示代码中提供了反向显示的LCD翻转指令: 0x01000xA700,具体使用方法大家可以看下文。😜😜😜

  •   本届试题还出现了一个可能困惑大家的地方:SRAM至少记录100条数据
    蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件
      小编咋一看,还以为是需要将数据存储在一个掉电也不会丢失的内存中呢。(小编忘记ROM与RAM的区别啦😅😅😅)百度后才知道:SRAM,一种静态随机存取存储器存储器只要保持通电,里面储存的数据就可以恒常保持;掉电后,数据还是会消失,这与在断电后还能储存资料的ROM或闪存是不同的。所以,也就是说,将这100条以上的数据存储到数据中就好啦!🤔🤔🤔

  •   本届试题中的模拟电压输入也值得关注,因为本届赛题考察的是ADC多通道采集,而并非十一届赛题那种单通道采集。

  •   至于脉冲输入输出,主要还是定时器配置与使用,只要定时器配置与使用熟练掌握并且合理运用,脉冲输入输出问题不大。


详细题解

在正式题解前,大家需要注意以下几点:

  • 由于LCD与LED有部分引脚是共用的,因此初始化完成LCD后最好手动关闭LED或者保存上一次LED的引脚的值;
  • 由于每次LCD显示的长度可能不同,因此在本次显示前,要不先清屏,要不跟上次显示一样长;
  • 使用CubeMX配置完成串口USART1后需要更改默认引脚为PA9PA10

LED模块

    通过查询产品手册知,LED的引脚为PC8~PC15,外加锁存器74HC573需要用到的引脚PD2。(由于题目要求除LED1、LED2、LED3、LED4外的其他LED都处于熄灭状态,此处特意将所有的LED都初始化以便于管理其他的LED灯)
CubeMX配置:
蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件
代码样例
    由于G431的所有LED都跟锁存器74HC573连接,因此每次更改LED状态时都需要先打开锁存器,写入数据后再关闭锁存器。

/*****************************************************
* 函数功能:改变所有LED的状态
* 函数参数:
*			char LEDSTATE: 0-表示关闭 1-表示打开
* 函数返回值:无
******************************************************/
void changeAllLedByStateNumber(char LEDSTATE)
{
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
					|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12,(LEDSTATE==1?GPIO_PIN_RESET:GPIO_PIN_SET));
	//打开锁存器    准备写入数据
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	//关闭锁存器 锁存器的作用为 使得锁存器输出端的电平一直维持在一个固定的状态
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

/*****************************************************
* 函数功能:根据LED的位置打开或者是关闭LED
* 函数参数:
*			uint16_t LEDLOCATION:需要操作LED的位置
*			char LEDSTATE: 0-表示关闭 1-表示打开
* 函数返回值:无
******************************************************/
void changeLedStateByLocation(uint16_t LEDLOCATION,char LEDSTATE)
{
	HAL_GPIO_WritePin(GPIOC,LEDLOCATION,(LEDSTATE==1?GPIO_PIN_RESET:GPIO_PIN_SET));
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

  试题要求中除了LED3,其他的LED灯要求比较简单,只需要点亮即可;而LED3则需要计时闪烁,每次间隔100ms就需要闪烁,因此,计时最好将其放在定时器中完成

/**************************************************
* 函数功能:LED工作函数
* 函数参数:
*		   int mod1:LED3的工作模式
*		   int mod2:LED4的工作模式
* 函数返回值:无
***************************************************/
void ledPro(int mod1,int mod2)
{
	// 倍频
	if(keyB4[0]%2 == 0)
		changeLedStateByLocation(LED1,1);
	else
		changeLedStateByLocation(LED1,0);
	
	// 分频
	if(keyB4[0]%2 == 1)
		changeLedStateByLocation(LED2,1);
	else
		changeLedStateByLocation(LED2,0);
	
	// 电压
	if(mod1%2 == 1)
	{
		rollbackLedByLocation(LED3);
		LED3TimeFlag = 0;
	}
	else
		changeLedStateByLocation(LED3,0);
	
	// LCD正反
	if(mod2%2 == 0)
		changeLedStateByLocation(LED4,1);
	else
		changeLedStateByLocation(LED4,0);
}

按键模块

    通过查询产品手册知,开发板上的四个按键引脚为PB0~PB2、PA0
CubeMX配置
蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件
代码样例
    本次试题涉及到按键单击以及长按短按,因此,按键扫描时就不能单一的按键按下后就返回按键值;而是在按键按下后,还需要记录按键按下时间,以此来判断按键是长按或者是短按。

  • 第一步,获取按键当前状态,并且判断按键是否按下,如果按键松开,则不做任何处理;否则,重置按键时间,进入下一步。(这实际上是一个消抖步骤
  • 第二步,再次获取按键状态,判断按键是否按下,如果没有按下,就重置程序状态,返回步骤一;否则,就跳转到步骤三,开始判断按键长短按、单双。;
  • 第三步,记录按键按下时间,按键松开后,开始通过按键的时间判断按键类别,如果在时间T1内按键按下了两次,那么就属于按键双击;否则,就为按键单击。如果在时间T2(T2>>T1)内,按键一直处于按下状态,此时就属于按键长按。如果按键不属于这两大类情况,那么按键就无效。
/****************************************************************************************************
 * 函数功能:按键扫描函数 注意此函数放在定时器中断(10ms)中的使用效果最佳 否则双击与长按会出现问题
 * 函数参数:无
 * 函数返回值:无 
*****************************************************************************************************/
void scanKeyUseStructAndTime(void)
{
	static struct keyState _key[4];
	
	//获取按键的最新状态
	_key[0].keyState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
	_key[1].keyState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
	_key[2].keyState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
	_key[3].keyState = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	
	//处理按键的最新状态
	for(int i=0;i<4;i++){
		switch (_key[i].judgeSate){
			//按键第一次按下
			case 0:
				if(_key[i].keyState == 0){
					//跳转按键的状态
					_key[i].judgeSate=1;
					//清空按键时间
					_key[i].keyTime=0;
				}
				break;
			//按键第二次按下 两次相隔10ms可以起到消抖作用	
			case 1:
				//按键再次按下 跳转按键状态
				if(_key[i].keyState == 0)
					_key[i].judgeSate=2;
				//上一次按键按下是抖动按下 属于无效状态 应该退回最开始的状态
				else 
					_key[i].judgeSate=0;
				break;
			//确定按键按下后的处理过程
			case 2:
				//等待松开过程,且非长按键
				if((_key[i].keyState==1) && _key[i].keyTime<30){	
					//可能双击按键的第一次,进入计时
					if(_key[i].doubleClickTimerFlag == 0) {
						_key[i].doubleClickTimerFlag = 1;
						_key[i].doubleClickTime = 0;
					}
					//在计时范围内又按了一次
					else{
						key[i].doubleFlag=1;//双击情况
						_key[i].doubleClickTimerFlag = 0;
					}
					_key[i].judgeSate = 0;
				}
				//松开且是长按键
				else if(_key[i].keyState==1 && _key[i].keyTime>=30)
				{
					_key[i].judgeSate = 0;
					key[i].longFlag = 1;
				
				}
				//按下 且为长按键
				else 
					_key[i].keyTime++;
				break;
		}
		//按键单次按下
		if(_key[i].doubleClickTimerFlag == 1 && _key[i].doubleClickTime >= 25) {
			key[i].flag = 1;
			_key[i].doubleClickTimerFlag = 0;
		}
		//按键双击 双击计时
		else if(_key[i].doubleClickTimerFlag == 1){
			_key[i].doubleClickTime++;
		}
	}
}

串口

    本次试题中,串口功能比较简单,但是接收PC发送过来的数据时需要注意:PC发送不定长的数据。这时就需要按位储存PC发送过来的数据,每次处理完成后就清空历史数据。
CubeMX配置
    配置时一定一定记得改引脚!!!
蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件
代码样例
    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函数解析:

  • UART_HandleTypeDef *huart:串口通道;
  • uint8_t *pData:存放数据的buff;
  • uint16_t Size:一次接收数据的长度
        不过使用时还需要初始化,否则不能够进入中断接收数据;
// 定义变量存储PC发送的数据
char Rxbuff[20],_Rxbuff;
uint16_t count = 0;

/***使用HAL_UART_Receive_IT中断接收数据 每次接收完成数据后就会执行该函数***/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1){
		Rxbuff[count++%20] = _Rxbuff;
		// 重新使能中断
		HAL_UART_Receive_IT(huart,(uint8_t *)&_Rxbuff,sizeof(_Rxbuff)); 
	}
}

    这里需要注意,下图中的代码句1与代码句2一定不要交换,不然串口接收的数据集就不会是你想要的。😢😢😢

蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件
    为了更加贴近本届试题,小编特意将上述串口接收代码进行定制改进。
/***使用HAL_UART_Receive_IT中断接收数据 每次接收完成数据后就会执行该函数***/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{	
	if(huart->Instance == USART1){
		// 重新使能中断
		if(ucRxbuff[0]=='P' && _ucRxbuff[0]=='A') 
			ucRxbuff[1] = _ucRxbuff[0];
		else if((ucRxbuff[0]=='P' && ucRxbuff[1]=='A') && (_ucRxbuff[0]=='1' || _ucRxbuff[0]=='4' || _ucRxbuff[0]=='5'))
			ucRxbuff[2] = _ucRxbuff[0];
		else
			ucRxbuff[0] = _ucRxbuff[0];
		HAL_UART_Receive_IT(huart,(uint8_t *)&_ucRxbuff,sizeof(_ucRxbuff));
	}
}

    这样,串口数据接收就可以不必每次都接收到数据可能出现的最大值,大大提高了串口数据接收的精确性,但是也降低了串口数据接收的灵活性。

串口数据处理
  串口数据处理,是根据PC发送过来的数据进行特殊数据匹配,一旦匹配到合适的数据,就给PC发送数据或者是执行其他的一系列操作。

/**************************************************
* 函数功能:串口数据处理函数
* 函数参数:无
* 函数返回值:无
***************************************************/
void usartPro(void)
{
	char usartTemp[10];
	
	// 验证是否收到串口信息以及串口信息长度
	// 参数
	if(ucRxbuff[0] == 'X')
		sprintf(usartTemp,"X:%d\r\n",para[0]);
	else if(ucRxbuff[0] == 'Y')
		sprintf(usartTemp,"Y:%d\r\n",para[1]);
	// 显示切换
	else if(ucRxbuff[0] == '#')
		setDisplayMod(++LCDMod%2);
	
	// 数据
	if(ucRxbuff[0] == 'P')
	{
		if(strcmp((char*)ucRxbuff,"PA1") == 0)
			sprintf(usartTemp,"PA1:%d\r\n",P1));
		else if(strcmp((char*)ucRxbuff,"PA4") == 0)
			sprintf(usartTemp,"PA4:%.2f\r\n",data[0]);
		else if(strcmp((char*)ucRxbuff,"PA5") == 0)
			sprintf(usartTemp,"PA5:%.2f\r\n",data[1]);	
	}
	
	// 是否发送数据
	if(usartTemp[0]=='P' || usartTemp[0]=='X' || usartTemp[0]=='Y')
		HAL_UART_Transmit(&huart1,(uint8_t*)usartTemp,sizeof(char)*strlen(usartTemp),10);
	
	memset(ucRxbuff,0,sizeof(ucRxbuff));
}

LCD模块

    LCD模块官方会提供源码,内含初始化,大家会用即可。如下面是一段将LCD初始化成——文字颜色为白色、背景为黑色的LCD屏:

/******************************************************************************
* 函数功能:LCD初始化
* 函数参数:无
* 函数返回值:无
*******************************************************************************/
void lcdInit(void)
{
	//HAL库的初始化
	LCD_Init();
	//设置LCD的背景色
	LCD_Clear(Blue);
	//设置LCD字体颜色
	LCD_SetTextColor(White);
	//设置LCD字体的背景色
	LCD_SetBackColor(Black);
}

LCD显示翻转
    LCD显示翻转,实质就是改变LCD刷新时数据刷新方向。详细讲解大家可以参考小编的这篇文章【蓝桥杯】讲述蓝桥杯嵌入式开发板的LCD翻转显示。小编在此处就直接给出代码啦:😜😜😜

/***************************************************
* 函数功能:设置LCD显示模式
* 函数参数:
*			int mod:显示模式 0-正向显示 1-翻转显示
* 函数返回值:无
***************************************************/
void setDisplayMod(int mod)
{
	// 反向显示
	if(mod == 1)
	{
		LCD_WriteReg( R1 ,0x0100 );
		LCD_WriteReg( R96,0xA700 );
		LCD_Clear(Black);
	}
	// 反向显示
	else
	{
		LCD_WriteReg( R1 ,0x0000 );
		LCD_WriteReg( R96,0x2700 );
		LCD_Clear(Black);
	}
}

    不知道大家在LCD与LED同时显示时,有没有碰到LED显示紊乱,这个是因为LCD与LED共用了部分引脚,每次LCD刷新时都有可能改变这些引脚的值,因此LCD显示会出现紊乱。解决这个现象的方案小编放在这篇文章中辣,大家可以参考玩一玩。😁😁😁【蓝桥杯】解决蓝桥杯嵌入式开发板LCD与LED显示冲突问题解决这个问题的实质就是:先保存本次LED显示的值,再刷新LCD显示,最后恢复LED显示。

模拟电压读取(ADC)

    试题中要求时测量PA4和PA5的模拟电压,咋一看是不是都不知道要干啥?😣😣😣可以先去CubeMX里看看这两个引脚的配置项有没有ADC的通道,如果有直接配置使用就完事啦!

CubeMX配置

蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件

代码样例
    通过CubeMX配置咱可以清楚的知道:本次采集需要使用ADC多通道采集,而不是多ADC单通道采集。

/*******************************************************************
* 函数功能:获取ADC多个通道的值
* 函数参数:
*			ADC_HandleTypeDef *hadc:ADC
*			double*data:保存ADC的值
*			int n:ADC通道的个数	
* 函数返回值:无
*******************************************************************/
void getManyADC(ADC_HandleTypeDef *hadc,double*data,int n)
{
	int i=0;
	for(i=0;i<n;i++)
	{
		HAL_ADC_Start(hadc);
		//等待转换完成,第二个参数表示超时时间,单位ms
		HAL_ADC_PollForConversion (hadc,50);
		data[i] = ((double)HAL_ADC_GetValue(hadc)/4096)*3.3;
	}
	HAL_ADC_Stop(hadc);
}

  调用函数getManyADC()来获取一个ADC两个通道的值,并且存储到指定的结构体中。

/**************************************************
* 函数功能:电压读取函数
* 函数参数:无
* 函数返回值:无
***************************************************/

void elePro(void)
{	
	int i=0;
	
	// 获取ADC数据
	getManyADC(&hadc2,data,2);
	// 将获取到的ADC数据储存到数组中
	while(i < 2)
	{	
		if(data[i] > paText[i].a)
			paText[i].a = data[i];
		if(data[i] < paText[i].t || paText[i].n==0)
			paText[i].t = data[i];
		paText[i].data[paText[i].n++%100] = data[i];
		paText[i].h = (paText[i].h*(paText[i].n-1)+data[i])*1.0/paText[i].n;
		i++;
	}
}

脉冲输入输出

脉冲输入
  脉冲输入,采用定时器的输入捕获功能。
CubeMX配置

蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件

代码样例
  脉冲输入,是通过定时器的输入捕获功能捕获一定时间内的上升沿或者是下降沿的个数,以此来测量输入的频率。详细讲解大家可以参考小编的这篇文章当我们身边没有示波器就无法测量频率与占空比了?一招教你解决身边没有示波器时如何测量STM32定时器产生PWM的频率与占空比

//输入捕获回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	uint32_t temp = 0;
	//发生中断的定时器为定时器2通道2
	if(htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
	{
		//读取定时器的计数值
		temp = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
		//将定时器的计数值设置成0
		__HAL_TIM_SetCounter(htim,0);
		//频率<100时 钳制在100
		if(P1 < 100)
			P1 = 100;
		//频率>10k时 钳制在10k
		else if(P1 > 10000)
			P1 = 10000;
		//重新开启定时器
		HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_2);
	}
}

脉冲输出
  此处的脉冲输出可以理解为PWM输出
CubeMX配置
蓝桥杯嵌入式真题,# 蓝桥杯嵌入式,单片机,蓝桥杯,单片机,stm32,嵌入式硬件
代码样例
  由于配置完成定时器的PWM输出后,定时器可以周期性工作,因此们可以不用显示调用。题目中要求脉冲输出能够完成分频与倍频操作,也只需要修改定时器的重装载值来完成,具体代码可见下述:

/**************************************************
* 函数功能:频率工作函数
* 函数参数:
*			int mod: mod=0为倍频  mod=1为分频
* 函数返回值:无
***************************************************/
void FrePro(int mod)
{
	int frd = 0;

	// 倍频  keyB4[0]%2
	if(mod == 0)
		frd = (int)(P1/para[0]-1);
	// 分频
	else
		frd = (int)(P1*para[0]-1);
	//设置频率
	__HAL_TIM_SetAutoreload(&htim17,frd);
	HAL_TIM_GenerateEvent(&htim17, TIM_EVENTSOURCE_UPDATE);
}

文章福利

下边是小编个人整理出来免费的蓝桥杯嵌入式福利,有需要的童鞋可以自取哟!🤤🤤🤤

  • 【蓝桥杯嵌入式】第十一届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解
  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛程序设计试题以及详细题解
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛程序设计试题及其详细题解
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解
  • 【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示

也欢迎大家留言或私信交流,共同进步哟!😉😉😉文章来源地址https://www.toymoban.com/news/detail-781508.html

到了这里,关于【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十三届蓝桥杯嵌入式省赛第二场真题(基于HAL库的巨简代码+超级详解)

    相关说明: 开发板:CT117E-M4(STM32G431RBT6) 开发环境: CubeMX+Keil5 涉及题目:第十三届蓝桥杯嵌入式省赛第二场真题 CubeMX配置、主要函数代码及说明: 1.使能外部高速时钟: 2.配置时钟树: 3.GPIO: 4.TIM2(通道2 PA1输出脉冲信号): 5.UART: 6.NVIC优先级配置    博主参加的是第一场

    2023年04月09日
    浏览(42)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛2]程序设计试题及详细题解

    这次的模拟赛试题模块还是一些常见模块: LCD 、 LED 、 按键 、 定时器 以及 串口 ,相对比较常规,相比于真正的省赛也比较简单。但是它 适合刚刚学完各个模块需要做真题的同学 ,可以借此来巩固自己之前所学;对于已经能够掌握各个模块的同学也是有帮助的,就是平台

    2023年04月13日
    浏览(44)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛1]程序设计试题及详细题解

    模拟赛1的题目中需要的准备的知识点不多,其中只用到了 串口 、 LCD 、 LED 、 按键 、 定时器的PWM输出 、以及 ADC 等几个模块,题目要求也简单详细并且数量不多,非常适合入门比赛,以及整合自己比赛的模块。 与模拟赛2相比,当然是模拟赛2的试题比较难啦,虽然需要的模

    2023年04月13日
    浏览(37)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式省赛[第一场]程序设计题以及详细题解

      今年的第一场比赛绝对np,官方将串口直接省掉了,将其替换成很多小功能,如:切换计时、频率均匀变化、锁机制等等,总的来说本届赛题的难度提升了不少。   本届试题需要用到的功能模块有 LCD 、 LED 、 按键 、 定时器输入捕获 、 定时器PWM输出 、 ADC获取 ,虽然这

    2023年04月17日
    浏览(46)
  • 【蓝桥杯】【嵌入式组别】第十三节:PWM输入捕获编程

    目的就是测量输入到特定管脚上的PWM波的频率和占空比。 下面是PWM部分的电路图: PWM由XL555芯片产生,由滑动变阻器R40连接到PA15,滑动变阻器不同的阻值对应不同的PWM波的频率。下面一个也是一样的原理。 可以看到板子上的PA15引脚的功能分别有:TIM2_CH1和TIM8_CH1,我们在板

    2023年04月11日
    浏览(88)
  • 蓝桥杯第十三届单片机国赛程序

    写在前面: 做完总体来说感觉一年比一年难了(估计是被骂的),虽然十三届用的底层少,但是做起来困难重重。 最难的难点在于定时器安排问题。15F2K60S2系列单片机只有三个定时器,本届题目考到了频率测量、超声波、PWM输出,再加上刷新,每一个都需要一个定时器,比

    2024年02月08日
    浏览(41)
  • 第十三届蓝桥杯C++B组j国赛

    题目 2693: 这天,小明在整理他的卡牌。 他一共有 n 种卡牌,第 i 种卡牌上印有正整数数 i(i ∈ [1, n]),且第 i 种卡牌 现有 ai 张。 而如果有 n 张卡牌,其中每种卡牌各一张,那么这 n 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌,拿出了 m 张空白牌,他可以在上面写

    2024年02月08日
    浏览(34)
  • [蓝桥杯嵌入式]STM32G431——第十二届第一场省赛停车计费系统真题及程序设计代码详解

    最近,我报名了今年的蓝桥杯嵌入式比赛,为此刷了一下以往的真题。以下是我对十二届蓝桥杯省赛真题的一些思路和心得,还有一些具体代码的实现。 1、相关模块 第十二届比赛主要用到的模块包括:LED、KEY、LCD、TIM、USART 2、重难点分析 这道题主要目的是做一个停车管理

    2024年01月18日
    浏览(85)
  • 第十三届省赛蓝桥杯物联网程序设计试题

    1、配置根据试题的要求配置STM32CubeMX (1)引脚配置 将PC14引脚配置为输入模式 PC14 用户按键引脚 将PA10引脚配置为中断模式 PA10 LoRa模块DIO0引脚 将以下引脚配置为输出模式 PC15 用户LED引脚 PB5 OLED 电源控制引脚 PA11和PA12 继电器控制引脚 PA4和PA9 LoRa模块片选和复位引脚,初始为高电

    2023年04月10日
    浏览(35)
  • 第十三届蓝桥杯国赛 Web 前端组(大学组) 真题练习及答案解析

    考点:数组方法 思路:利用splice()方法 考点:flex布局 思路:照着写就行 考点: DOM 操作 思路:1 先做需求:隐藏开始按钮,方格上的图片显示后又隐藏。 2 再做第一次点击图片翻转效果。 3 做第二次点击的逻辑判断,若水果相同则,进行消除,加分操作,水果不同,进行隐

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包