蓝桥杯嵌入式第十二届第一场(代查)

一. main.c

void Key_Proc(void)
{
	if(uwTick-uwTick_key<10) return;
	uwTick_key=uwTick;
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)//B1
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_state==0))//B1
		{
			Key_state=1;
			LCD_SHOW++;
			LCD_Clear(Black);
			if(LCD_SHOW>=2)
			{
				LCD_SHOW=0;
			}
		}
	}
	if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_state==1))//B1
	{
		Key_state=0;
	}
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)//B2
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)&&(Key_state==0)&&(LCD_SHOW==1))//B2
		{
			Key_state=2;
			Parking_fee[0]+=50;
			Parking_fee[1]+=50;
		}
	}
	if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)!=GPIO_PIN_RESET)&&(Key_state==2))//B2
	{
		Key_state=0;
	}
	
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)//B3
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)&&(Key_state==0)&&(LCD_SHOW==1))//B3
		{
			Key_state=3;
			Parking_fee[0]-=50;
			Parking_fee[1]-=50;
		}
	}
	if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)!=GPIO_PIN_RESET)&&(Key_state==3))//B3
	{
		Key_state=0;
	}
	
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)//B4
	{
		HAL_Delay(10);
		if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_state==0))//B4
		{
			Key_state=4;
			PA7_sign^=1;
		}
	}
	if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_state==4))//B4
	{
		Key_state=0;
	}
	
}
void LCD_Proc(void)
{
	if(LCD_SHOW==0)
	{
		sprintf((char *)LCD_STR,"123456789A123456789B");
		LCD_DisplayStringLine(Line0,LCD_STR);
		sprintf((char *)LCD_STR,"      Data");
		LCD_DisplayStringLine(Line1,LCD_STR);
		sprintf((char *)LCD_STR,"   CNBR:%d",Car_num[0]);
		LCD_DisplayStringLine(Line3,LCD_STR);
		sprintf((char *)LCD_STR,"   VNBR:%d",Car_num[1]);
		LCD_DisplayStringLine(Line5,LCD_STR);
		sprintf((char *)LCD_STR,"   IDLE:%d",Car_num[2]);
		LCD_DisplayStringLine(Line7,LCD_STR);
		sprintf((char *)LCD_STR," %d",Str_num);
		LCD_DisplayStringLine(Line8,LCD_STR);
		sprintf((char *)LCD_STR,"   %s%s ",packing[0].car_name,car_id);
		LCD_DisplayStringLine(Line9,LCD_STR);
	}
	else if(LCD_SHOW==1)
	{
		sprintf((char *)LCD_STR,"123456789A123456789B");
		LCD_DisplayStringLine(Line0,LCD_STR);
		sprintf((char *)LCD_STR,"      Para");
		LCD_DisplayStringLine(Line1,LCD_STR);
		sprintf((char *)LCD_STR,"   CNBR:%d.%d%d",Parking_fee[0]/100,Parking_fee[0]/10%10,Parking_fee[0]%10);
		LCD_DisplayStringLine(Line3,LCD_STR);
		sprintf((char *)LCD_STR,"   VNBR:%d.%d%d",Parking_fee[1]/100,Parking_fee[1]/10%10,Parking_fee[1]%10);
		LCD_DisplayStringLine(Line5,LCD_STR);
	}
}
void PA7_Proc(void)
{
	if(PA7_sign==0)
	{
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,100);
	}
	else
	{
		__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,0);
	}
}
void LED_Init(void)
{
	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, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
void LED_SHOW(uint8_t led)
{
	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, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
	
	HAL_GPIO_WritePin(GPIOC, led<<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 LED_Proc(void)
{
	LED_SHOW(LED);
	if(Pack_id()!=0xff)//有停车位
	{
		LED|=0x01;
	}
	else if(Pack_id()==0xff)
	{
		LED&=0xfe;
	}
	if(PA7_sign==0)//有脉冲
	{
		LED|=0x02;
	}
	else
	{
		LED&=0xfd;
	}
}
/* 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_TIM3_Init();
  MX_TIM6_Init();
  MX_USART1_UART_Init();
  MX_RTC_Init();
  /* USER CODE BEGIN 2 */
	LCD_Init();
	LCD_SetTextColor(White);
	LCD_SetBackColor(Black);
	LCD_Clear(Black);
	HAL_TIM_Base_Start_IT(&htim6);
	HAL_UART_Receive_IT(&huart1,Rx_buf,1);
	HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_2);
  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
		
 
		LED_Proc();
		PA7_Proc();
		LCD_Proc();
		Packing_Proc();
		Key_Proc();
  }
  /* USER CODE END 3 */
}

二 . usart.c

int a;
__IO uint32_t uwTick_pack;
uint8_t Rx_str[99];//接收的字符串
uint8_t Tx_str[20];
uint32_t Str_num=0;
uint8_t Rx_buf[1];
uint8_t Rx_sign=0;//接收标志位
uint8_t Inspect_sign=0;// 0-待定状态 1-错误 2-正确出库
int Packing_time=0;
int Parking_cost=0;
struct Packing packing[8];
int tsxt;
int sing=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)
	{
		if(Str_num==0)
		{
			sing=1;
		}
		if(sing==1)
		{
			Rx_str[Str_num]=Rx_buf[0];
			Str_num++;
		}
		else
		{
			Str_num=0;

		}
		HAL_UART_Receive_IT(&huart1,Rx_buf,1);
	}
}
uint8_t Str_correct(uint8_t* str)//检查字符串是否正确
{
	uint8_t i=0;
	if(Str_num==22)
	{
		if( ((str[0]=='C')||(str[0]=='V'))&&(str[1]=='N')&&(str[2]=='B')&&(str[3]=='R')&&(str[4]==':')&&(str[9]==':') )
		{
			for(i=10;i<=21;i++)
			{
				if((str[i]<'0')||(str[i]>'9'))
				{
					return 4;//时间数字错误
				}
			}
			if( (str[12]==0)&&((str[13]<'0')||(str[13]>'9')) )//1-9月
			{
					return 5;//月份错误
			}
			else if( (str[12]==1)&&((str[13]<'0')||(str[13]>'2')) )//10-12月
			{
				return 5;//月份错误
			}
		}
		else//类型等字符不正确
		{
			return 1;
		}
	}
	else if(Str_num==0)//无数据
	{
		return 2;
	}
	else//字符数量错误
	{
		return 3;
	}
	return 0;
}
uint32_t Pack_id(void)//判断有无车位-并且返回停车号
{
	uint32_t i=0;
	for(i=0;i<8;i++)
	{
		if(packing[i].Packing_id ==0 )
			return i;
	}
	return 0xff;
}
uint32_t Car_type(void)//判断停车类型
{
	uint32_t i;
	if(Rx_str[0]=='C')
	{	
		i= 1;
	}
	else if(Rx_str[0]=='V')
	{	
		i= 2;
	}
	return i;
}
void Str_txtrat(uint8_t* Str_targe,uint8_t *Str,uint8_t start,uint8_t end)
{
	char i;
	for(i=0;i<=end;i++)
	{
		Str_targe[i]=Str[start+i];
	}
	Str[end+1]='\0';
}
void substr(uint8_t* d_str, uint8_t* s_str, uint8_t locate, uint8_t length)//从长字符串里边提取出一段给短字符串
{
	uint8_t i = 0;
	for(i=0; i<length; i++)
	{
		d_str[i] = s_str[locate + i];
	}
	d_str[length] = '\0';
}

uint8_t Car_id_correct(uint8_t *Str)// 0-车库内没有该车辆 1-车库内有该车辆
{
	uint8_t i=0;
		for(i=0;i<8;i++)
		{
			if(strcmp((const char *)Str,packing[i].car_name)==0)
			{
				return i;
			}
		}
	return 0xff;
}
uint8_t car_id[5];
uint8_t car_type;
uint8_t year_temp,month_temp,day_temp,hour_temp,min_temp,sec_temp;
int str_id;
int tsxt;
void Packing_Proc(void)
{
	if(uwTick-uwTick_pack<200) return;
	uwTick_pack=uwTick;
	int id,i;
	if(Str_num==22)
	{
		if(Str_correct(Rx_str)==0)//接收到字符串并且正确
		{
			year_temp = (((Rx_str[10] - '0')*10) + (Rx_str[11] - '0')); 
			month_temp = (((Rx_str[12] - '0')*10) + (Rx_str[13] - '0')); 	
			day_temp = (((Rx_str[14] - '0')*10) + (Rx_str[15] - '0')); 	
			hour_temp = (((Rx_str[16] - '0')*10) + (Rx_str[17] - '0')); 	
			min_temp = (((Rx_str[18] - '0')*10) + (Rx_str[19] - '0')); 	
			sec_temp = (((Rx_str[20] - '0')*10) + (Rx_str[21] - '0')); 		
			if((month_temp>12)||(day_temp>31)||(hour_temp>23)||(min_temp>59)||(sec_temp>59))//验证日期和时间是否合法
			{
				Inspect_sign=1;//时间不合法
				tsxt=1;
			}
			for(i=5;i<=8;i++)//存车牌号到预备数组
			{
				car_id[i-5]=Rx_str[i];
			}
			car_id[4]='\0';
			car_type=Car_type();//存停车类型到预备数组
			
			
			if(Car_id_correct(car_id)==0xff)//车库内没有这辆车----开始录入信息
			{
				id=Pack_id();
				
				if(id == 0xFF)//没有找到哪个地方是空的
				{
						Inspect_sign=1;//无车位
						tsxt=2;
				}
				if(Inspect_sign!=1)
				{
					packing[id].type=car_type;//把当前车的类型存入			
		//			substr((uint8_t *)packing[id].car_name, car_id, 0, 4);//把当前车的id存入
					for(i=0; i<4; i++)
					{
						packing[id].car_name[i] = car_id[i];
					}
					packing[id].car_name[4] = '\0';
					
					packing[id].Packing_id=1;
					packing[id].time.year = year_temp;
					packing[id].time.month = month_temp;			
					packing[id].time.date = day_temp;			
					packing[id].time.huor = hour_temp;			
					packing[id].time.minute = min_temp;			
					packing[id].time.second = sec_temp;	
					if(car_type == 1)
						Car_num[0]++;
					else if(car_type == 2)
						Car_num[1]++;
					
					Car_num[2]--;
				}
			}
			else if(Car_id_correct(car_id)!=0xff)//车库内有这辆车
			{
				id=Car_id_correct(car_id);//得到该车得停车位
				str_id=id;
				//把时间算出来
				Packing_time=(((year_temp-packing[id].time.year)*8640)+ ((month_temp-packing[id].time.month)*720)+((day_temp-packing[id].time.date)*24)+(hour_temp-packing[id].time.huor));
				if(Packing_time<0)//时间小于入库时间-有错误
				{
					Inspect_sign=1;//错误
					tsxt=3;
				}
				else if(Packing_time>=0)//不足一个小时按一个小时算
				{
					Packing_time=1;
				}
				//把该停车位置零
				packing[id].Packing_id=0;
				//把名字清除因为先判断有没有这辆车再判断有没有车位
//				Inspect_sign=2;//发送字符串
				if(Inspect_sign==0)
				{
					if(car_type == 1)//
					{
						Car_num[0]--;
						Parking_cost=Parking_fee[0]*Packing_time;
					}
					else if(car_type == 2)
					{
						Car_num[1]--;
						Parking_cost=Parking_fee[1]*Packing_time;
					}	
					Car_num[2]++;
					if(car_type==1)
					{
						sprintf((char *)Tx_str,"CNBR:%s:%d:%d.%d%d\r\n",packing[str_id].car_name,Packing_time,Parking_cost/100,Parking_cost/10%10,Parking_cost%10);
					}
					else if(car_type==2)
					{
						sprintf((char *)Tx_str,"VNBR:%s:%d:%d.%d%d\r\n",packing[str_id].car_name,Packing_time,Parking_cost/100,Parking_cost/10%10,Parking_cost%10);
					}
					HAL_UART_Transmit(&huart1,Tx_str,strlen((const char *)Tx_str),50);
				}
				for(i=0;i<=strlen((const char *)Rx_str);i++)
				{
					Rx_str[i]='\0';
				}
				strcpy(packing[id].car_name," ");
				
				tsxt=6;
				
				
			}	
		}
		else if(Str_correct(Rx_str)==2)return;
		else
		{
			Inspect_sign=1;//字符串错误
			tsxt=5;
		}
		if(Inspect_sign==1)//错误
		{
			sprintf((char *)Tx_str,"Error\r\n");
			HAL_UART_Transmit(&huart1,Tx_str,strlen((const char *)Tx_str),50);
		}
	//	strcpy((char *)Rx_str, "");
		Inspect_sign=0;
		for(i=0;i<=strlen((const char *)car_id);i++)
		{
			car_id[i]='\0';
		}
		Str_num=0;
		sing=0;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DDKevin19

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

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

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

打赏作者

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

抵扣说明:

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

余额充值