第十二届 蓝桥杯 嵌入式设计与开发项目 省赛

赛题

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

部分程序展示

主函数:

  while (1)
  {
    /* USER CODE END WHILE */
		if(flag_10ms)									//10ms标志位,由定时器2得来
		{
			flag_10ms=0;
			key_function();							//10ms扫描按键
		}
		if(flag_50ms)									//50ms标志位,由定时器2得来
		{
			flag_50ms=0;
			LCD_jiemian(flag_jiemian);	//50ms刷新屏幕
		}
		uart_function();							//串口功能
    /* USER CODE BEGIN 3 */
  }

按键模块:

//按键功能函数
void key_function(void)
{
	uint8_t key;	//按键值
	
	key=scankey();	//扫描按键
	if(key!=0)
	{
		if(key==1)		//切换界面
		{
			if(++flag_jiemian==2) {flag_jiemian=0;}
			if(!flag_jiemian)  
			{
				LCD_buf_Line4[9]=LCD_buf_Line4[10]=LCD_buf_Line4[11]=' ';
				LCD_buf_Line6[9]=LCD_buf_Line6[10]=LCD_buf_Line6[11]=' ';
			}
			else 							 
			{
				LCD_buf_Line4[9]='.';LCD_buf_Line4[11]='0';
				LCD_buf_Line6[9]='.';LCD_buf_Line6[11]='0';
				LCD_ClearLine(Line8);
			}
			LCD_jiemian(flag_jiemian);	//改变界面
		}
		else if(key==2)
		{
			if(flag_jiemian)		//在费率设置界面下,对费率加0.5
			{
				CNBR_para+=5;VNBR_para+=5;
				if(CNBR_para>=100) CNBR_para=0;
				if(VNBR_para>=100) VNBR_para=0;
			}
		}
		else if(key==3)
		{
			if(flag_jiemian)		//在费率设置界面下,对费率减0.5
			{
				CNBR_para-=5;VNBR_para-=5;
				if(CNBR_para>100) CNBR_para=95;
				if(VNBR_para>100) VNBR_para=95;
			}		
		}
		else if(key==4)				//切换PA7输出模式
		{
			if(++flag_mode==2) {flag_mode=0;}
			if(flag_mode==1) 			{__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,20);flag_LED&=0XFD;}	//2k,20%占空比
			else if(flag_mode==0)	{__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,0); flag_LED|=0X02;}	//持续低电平
			LED_ALL(flag_LED);	//改变LED状态		
		}			
	}
}

LCD模块:

//界面函数
void LCD_jiemian(uint8_t dat)
{
	if(!dat)	//车辆界面
	{
		LCD_buf_Line2[7]='D';LCD_buf_Line2[9]='t';
		LCD_buf_Line4[8]=CNBR+48;
		LCD_buf_Line6[8]=VNBR+48;
		LCD_buf_Line8[8]=IDLE+48;
		LCD_DisplayStringLine(Line8,LCD_buf_Line8);		
	}
	else 			//费率设置界面
	{
		LCD_buf_Line2[7]='P';LCD_buf_Line2[9]='r';
		LCD_buf_Line4[8]=CNBR_para/10+48;LCD_buf_Line4[10]=CNBR_para%10+48;
		LCD_buf_Line6[8]=VNBR_para/10+48;LCD_buf_Line6[10]=VNBR_para%10+48;	
	}
	//更新LCD数据
	LCD_DisplayStringLine(Line2,LCD_buf_Line2);
	LCD_DisplayStringLine(Line4,LCD_buf_Line4);
	LCD_DisplayStringLine(Line6,LCD_buf_Line6);
}

串口模块:

//串口功能函数
void uart_function(void)
{
	uint8_t a,b;						//for循环变量
	uint8_t uart1_error=0;	//格式或逻辑错误标志位
	uint8_t flag_out=0;			//车辆出去标志位
	uint16_t uart_data=0;		//存放计算结果
	if(uart1_over)					//接收完一帧数据
	{
		if(uart1_len==22)			//判断数据长度是否符合格式
		{
			//判断格式是否正确
			if(uart1_buf[1]=='N'&&uart1_buf[2]=='B'&&uart1_buf[3]=='R'&&uart1_buf[4]==':'&&uart1_buf[9]==':'&&(uart1_buf[0]=='C'||uart1_buf[0]=='V'))
			{	
				//检测年格式
				uart_data=(uart1_buf[10]-48)*10+(uart1_buf[11]-48);				
				if((uart_data>99)||uart1_buf[10]<'0'||uart1_buf[10]>'9'||uart1_buf[11]<'0'||uart1_buf[11]>'9')	{uart1_error=1;}																																																													
				//检测月格式
				uart_data=(uart1_buf[12]-48)*10+(uart1_buf[13]-48);				
				if((uart_data>12)||(uart_data==0)||uart1_buf[12]<'0'||uart1_buf[12]>'1'||uart1_buf[13]<'0'||uart1_buf[13]>'9')	{uart1_error=1;}					
				//检测日格式
				uart_data=(uart1_buf[14]-48)*10+(uart1_buf[15]-48);				
				if((uart_data>32)||(uart_data==0)||uart1_buf[14]<'0'||uart1_buf[14]>'3'||uart1_buf[15]<'0'||uart1_buf[15]>'9')	{uart1_error=1;}			
				//检测时格式
				uart_data=(uart1_buf[16]-48)*10+(uart1_buf[17]-48);				
				if((uart_data>23)||uart1_buf[16]<'0'||uart1_buf[16]>'2'||uart1_buf[17]<'0'||uart1_buf[17]>'9')	{uart1_error=1;}				
				//检测分格式
				uart_data=(uart1_buf[18]-48)*10+(uart1_buf[19]-48);				
				if((uart_data>59)||uart1_buf[18]<'0'||uart1_buf[18]>'5'||uart1_buf[19]<'0'||uart1_buf[19]>'9')	{uart1_error=1;}			
				//检测秒格式
				uart_data=(uart1_buf[20]-48)*10+(uart1_buf[21]-48);				
				if((uart_data>59)||uart1_buf[20]<'0'||uart1_buf[20]>'5'||uart1_buf[21]<'0'||uart1_buf[21]>'9')	{uart1_error=1;}					
			
				if(!uart1_error)	//全部检测无错误
				{
					//检测是否为车辆出去
					for(a=0;a<8-IDLE;a++)	//只需检测已使用的空位
					{
						flag_out=1;					//车辆出去标志位先置1
						for(b=5;b<9;b++)		//判断车辆编号
						{ if(IDLE_buf[a][b]!=uart1_buf[b]) {flag_out=0;break;} }		//检测到车辆编号不对,退出进入下一个检测				
						if((flag_out==1)&&(IDLE_buf[a][0]==uart1_buf[0])) {break;}	//检测到车辆编号相同且类型相同,退出检测
						else 																					{flag_out=0;}	//检测到车辆编号相同但类型不同,继续检测
					}	
					if(flag_out)	//出停车场
					{
						//计算停车时长
					  if((uart1_buf[16]-48)*10+(uart1_buf[17]-48)>=((IDLE_buf[a][16]-48)*10+(IDLE_buf[a][17]-48)))
						{ Para_buf[10]=((uart1_buf[16]-48)*10+(uart1_buf[17]-48))-((IDLE_buf[a][16]-48)*10+(IDLE_buf[a][17]-48)); }
						//如果出停车场时比进停车场时小,则先对出停车场时加24小时(加一天时间)
						else {Para_buf[10]=((uart1_buf[16]-48)*10+(uart1_buf[17]-48)+24)-((IDLE_buf[a][16]-48)*10+(IDLE_buf[a][17]-48));}
						//如果时长不足一小时,则对小时加1
						if((uart1_buf[18]-48)*10+(uart1_buf[19]-48)>((IDLE_buf[a][18]-48)*10+(IDLE_buf[a][19]-48))) {Para_buf[10]=Para_buf[10]+1;}
						else if((uart1_buf[20]-48)*10+(uart1_buf[21]-48)>((IDLE_buf[a][20]-48)*10+(IDLE_buf[a][21]-48))) {Para_buf[10]=Para_buf[10]+1;}
						//计算费用	
						if(uart1_buf[0]=='C') 		 {CNBR--;uart_data=Para_buf[10]*CNBR_para;}  //CNBR类型车辆减1
						else if(uart1_buf[0]=='V') {VNBR--;uart_data=Para_buf[10]*VNBR_para;}	 //VNBR类型车辆减1
						IDLE++;																																 //空闲车位加1
						sprintf(Para_buf,"VNBR:D583:%02d:%0.2f",Para_buf[10],(float)uart_data/10);	//修改计费信息						
						//串口输出计费信息
						HAL_UART_Transmit(&huart1,&IDLE_buf[a][0],22,50);HAL_UART_Transmit(&huart1,"\r\n",2,50);	//入停车场信息
						HAL_UART_Transmit(&huart1,uart1_buf,22,50);			 HAL_UART_Transmit(&huart1,"\r\n",2,50);	//出停车场信息
						HAL_UART_Transmit(&huart1,Para_buf,18,50);       HAL_UART_Transmit(&huart1,"\r\n",2,50);	//计费信息						
						for(b=0;b<22;b++) { IDLE_buf[a][b]=0; }  																									//清除出去车辆车位信息
					}
					else 					//进停车场
					{
						if(IDLE!=0)	//有空位
						{
							for(a=0;a<22;a++)		//保存车位数据
							{ IDLE_buf[8-IDLE][a]=uart1_buf[a]; }	
							if(uart1_buf[0]=='C') {CNBR++;}				//CNBR类型车辆加1
							else if(uart1_buf[0]=='V') {VNBR++;}	//VNBR类型车辆加1
							IDLE--;																//空闲车位减1					
						}
						else {uart1_error=1;}	//无空位,无法进入停车场,报错
					}
					if(IDLE)  {flag_LED&=0xfe;}	//有空位,点亮LD1
					else			{flag_LED|=0x01;}	//无空位,熄灭LD1
					LED_ALL(flag_LED);					//改变LED状态
				}			
			}
			else {uart1_error=1;}	//数据格式不对
		}
		else {uart1_error=1;}	//数据长度不对
		if(uart1_error)  {HAL_UART_Transmit(&huart1,"Error\r\n",7,50);}	//格式或逻辑有错,向串口发送错误信息
		uart1_len=0;	//本次接收长度清零
		uart1_over=0;	//本次接收完成标志位清零
	}
}

下载链接:
链接:https://pan.baidu.com/s/1LMECSy3GuABduu42YUJdSQ
提取码:qy2o

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值