栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场

突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场 一、题干


二、题目解析

所需:
PA7 PWM LED(锁存器) 串口9600 LCD 按键4个,整体难在逻辑,我们先配置好硬件,进入工程

PA7要求:2KHZ,初始化占空比0 串口一,打开接收中断

首先我们大概想一下轮廓,首先一辆车进来,我们第一要判断他这个车在不在我们的停车场里,然后如果在的话,就给他结账,如果不在的话,我们需要判断现在停车场里是否有车位,如果有,则保存其信息,如果没有,则不管。

先把八股文写一下:

按键:

uint8_t Key_Scan()
{
	static uint8_t value;
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET)	value = 1;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET)	value = 2;
	else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == GPIO_PIN_RESET)	value = 3;
	else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)	value = 4;
	else		value = 0;
	return value;
}

void Key_Proc()
{
	if(uwTick - uwTick_Key_Speed < 100)	return;
	else		uwTick_Key_Speed = uwTick;
	key_value = Key_Scan();
	key_up = -key_value&(key_value ^ key_old);
	key_down = key_value&(key_value ^ key_old);
	key_old = key_value;
	switch(key_down)
	{
		case 1:
				LCD_flag^=1;
		break;
		
		case 2:
			if(LCD_flag == 1)
			{
				CNBR_Price += 0.5;
				VNBR_Price += 0.5;
			}
		break;
		
		case 3:
			if(LCD_flag == 1)
			{
				CNBR_Price -= 0.5;
				VNBR_Price -= 0.5;
				if(VNBR_Price < 0)
				{
					VNBR_Price = 0;
				}
				if(CNBR_Price < 0)
				{
					CNBR_Price = 0;
				}
			}
		break;
		
		case 4:
			control_flag ^= 1;
		break;
	}

LCD

void LCD_DISPLAY_Data()
{
	sprintf((char *)str,"       Data       ");
	LCD_DisplayStringLine(Line1,str);
	sprintf((char *)str,"   CNBR:       ");
	LCD_DisplayStringLine(Line3,str);
	sprintf((char *)str,"   VNBR:       ");
	LCD_DisplayStringLine(Line5,str);
	sprintf((char *)str,"   IDLE:       ");
	LCD_DisplayStringLine(Line7,str);
}

void LCD_DISPLAY_Para()
{
	sprintf((char *)str,"       Para       ");
	LCD_DisplayStringLine(Line1,str);
	sprintf((char *)str,"   CNBR:%.2f       ",CNBR_Price);
	LCD_DisplayStringLine(Line3,str);
	sprintf((char *)str,"   VNBR:%.2f       ",VNBR_Price);
	LCD_DisplayStringLine(Line5,str);
	sprintf((char *)str,"                ");
	LCD_DisplayStringLine(Line7,str);
}



void LCD_Proc()
{
	if(uwTick - uwTick_LCD_Speed < 100)	return;
	else		uwTick_LCD_Speed = uwTick;
	if(LCD_flag == 0)	LCD_DISPLAY_Data();
	else		LCD_DISPLAY_Para();
	if( control_flag == 0)	TIM3->CCR2 = 0;
	else										TIM3->CCR2 = 100;
	if(process_flag == 1)	data_process(car_data[22]);
	else	return;
}

LED

void LED_Disp(uint8_t ucled)
{
	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(GPIOC,ucled<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

void LED_Proc()
{
	int sum = 0;
	if(uwTick - uwTick_LED_Speed < 100)	return;
	else		uwTick_LED_Speed = uwTick;
	for(int i = 0;i<8;i++)
	{
		sum += car_postion.idle[i]; 
	}
	if(sum !=8) LED_Disp(0x01);
	else				LED_Disp(0x00);
	sprintf((char *)str,"   NUMBER:%d       ",sum);
	LCD_DisplayStringLine(Line6,str);
}

串口

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	sprintf((char *)tx_buff,"uart");
	HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
//	sscanf((char *)rx_buff,"%4s:%4s",type,id);
//	sprintf((char *)tx_buff,"ID: %4s",id);
//	HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
	for(i = 0;i<22;i++)
	{	
		car_data[i] = rx_buff[i];
	}
	process_flag = 1;
	HAL_UART_Receive_IT(&huart1,rx_buff,22);
}

逻辑部分,先检查ID,在判断,是否有车位

uint8_t check_car_id()
{
	for( i = 0;i<8;i++)
	{
			if((car_postion.car_id[4*i+0] == id[0])&&(car_postion.car_id[4*i+1] == id[1])
					&&(car_postion.car_id[4*i+2] == id[2])&&(car_postion.car_id[4*i+3] == id[3]))
			{
				sprintf((char *)tx_buff,"i = %d",i);
				HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
				return i;
			}
	}
	return 30;
}

数据处理

void data_process(uint8_t data)
{
	uint8_t check = check_car_id();
	if(check !=30)
	{
		 
		 sscanf((char *)data,"%4s:%4s:%2d%2d%2d%2d%2d",&car_postion.type[4*check],&car_postion.car_id[4*check],
                                                                                                                                                                                        &car_postion.Start_Year[check],&car_postion.Start_Month[check],
                                                                                                                                                                                        &car_postion.Start_Min[check],&car_postion.Start_Hour[check]);
		 put_price();
		 for(i = 0;i<4;i++)
		 {
	   		car_postion.car_id[4*check+i] = 28;
			  car_postion.type[4*check+i] = 28;
		 }
			car_postion.idle[check] = 0;
//			sprintf((char *)tx_buff,"haaa");
//			HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
	}
	else								//reach the park
	{
		for(i = 0;i<8;i++)
		{
			sum += car_postion.idle[i]; 
		}
		if(sum !=8)
		{
//				sprintf((char *)tx_buff,"idle = %d",car_postion.idle[0]);
//				HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
				for(i= 0;i<8;i++)
				{
					if(car_postion.idle[i] == 0)
					{
						car_postion.idle[i] = 1;
						sprintf((char *)str,"  bomm  ");
						LCD_DisplayStringLine(Line9,str);
//						sscanf((char *)data,"%4s:%4s",&car_postion.type[4*i],&car_postion.car_id[4*i]);
						for(j = 0;j<4;j++)
						{
							car_postion.car_id[4*i+j] = rx_buff[5+j];
							
						}
//						sscanf((char *)rx_buff,"%4s:%4s",&car_postion.type[4*i],&car_postion.car_id[4*i]);
						sprintf((char *)str,"      %4s  ",&car_postion.car_id[4*i]);
						LCD_DisplayStringLine(Line8,str);
						LED_Disp(0x55);
						break;
					}
				}
	  }
	}
	process_flag = 0;
}

put_price俺就不写了,具体就是清算费用,然后把对应的idle置0,明天就是国赛了,俺感觉RTC、长短按、局部高亮、EEPROM存取多字节数据,这几个会考,今天看看客观题,睡个好觉,明天希望大家都拿国一。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976450.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号