赛题
部分程序展示
主函数:
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