第十二届蓝桥杯嵌入式-停车计费

文章目录

  • 第十二届蓝桥杯嵌入式-停车计费
    • 1.题目分析
    • 2.项目结构
      • 2.1停车部分整体流程
    • 2.2串口数据解析流程
    • 2.3细节部分
    • 3.代码结构
      • 3.1停车部分
      • 3.2主函数部分

1.题目分析

刚看到题目时 大致看了一眼后,第一眼发现是串口部分比较不容易,其他的模块都很简单。串口的逻辑是主要难点,所以我首先先构想了一下串口部分的项目组成逻辑。然后才开始一步步做题。
源码去资源或者文章末尾里找哈!下载不收钱!!!




2.项目结构

基本的逻辑页面切换等这里就不多赘述主要是停车计费部分逻辑

2.1停车部分整体流程

我的整体思路如下:

1. 每过来一辆车 就先判断能不能 “出库”。如果不能出库的车,那么才有可能停的进车库
2. 如果这辆车能够出库,也就是当前车库已经存在这辆车,那么直接出库即可
3. 如果当前车辆不能出库,那么执行停车函数,判断有没有可以停车的车位进行停车即可

2.2串口数据解析流程

自己写了一个根据索引和长度截取字符串的函数

后期配合strcpy,atoi可以轻松的截取解析字符串和转化数字

2.3细节部分

1. 出库的车的时间,不能比入库时早
2. 车辆类型只有CNBR和VNBR
3. 时间的格式必须要正确,比如小时必须小于24,分钟必须小于等于60这种的
4. 不满一小时按照一小时算

3.代码结构

3.1停车部分

结构如下 我采取结构体数组的方法模拟停车场,并分出时间结构体和停车结构体

整理出其中的关键代码进行讲解

停车 park.c

//停车
int park(Parking* parking, Car car, Time time)
{int i = 0;int typeFlag;//没位置了if(remainParkSize<=0){return 0;}//判断车辆类型if (strcmp(car.type, "CNBR")==0){typeFlag=1;}if (strcmp(car.type, "VNBR")==0) {typeFlag=2;}for (i = 0; i < 8; i++){//判断能否停车if (canPark(parking[i])){//CNBRif(typeFlag==1){remainParkSize--;cnbrSize++;}//VNBRif(typeFlag==2){remainParkSize--;vnbrSize++;}//车位不够的时候关灯if(remainParkSize<=0){LED_Control(LEDALL,0);}//到这就是成功停车了 结构体内赋值strcpy((parking[i].car).id, car.id);strcpy((parking[i].car).type, car.type);parking[i].time.year = time.year;parking[i].time.month = time.month;parking[i].time.day = time.day;parking[i].time.hour = time.hour;parking[i].time.minute = time.minute;parking[i].time.second = time.second;//该车位置为不能停车parking[i].canPark = 0;return 1;}}return 0;
}

出库 goOut.c

double goOut(Parking* parking, Car car, Time time, float cnbrPrice, float vnbrPrice)
{int i = 0;int typeFlag = 0;double price = 0;Car oldCar;Time oldTime;//判断车辆类型if (strcmp(car.type, "CNBR")==0){price = cnbrPrice;typeFlag=1;}if (strcmp(car.type, "VNBR")==0){price = vnbrPrice;typeFlag=2;}for (i = 0; i < 8; i++){oldCar = parking[i].car;oldTime = parking[i].time;//如果该位置可以停车,那肯定和出库没有关系 直接不进行下一步判断if (parking[i].canPark == 1){continue;}//如果存在相同的车辆 那么可以出库if (isExist(oldCar, car)){//CNBRif(typeFlag==1){remainParkSize++;cnbrSize--;}//VNBRif(typeFlag==2){remainParkSize++;vnbrSize--;}//计算停车的小时数//这里已经能够判断 年月日小时,分和秒要继续判断parkTime = (time.year - oldTime.year) * 365 * 24 +(time.month - oldTime.month) * 30 * 24 +(time.day - oldTime.day) * 24 +(time.hour - oldTime.hour);//时间非法if(parkTime<0){parkTime=0;return -2;}//年月日小时相等else if(parkTime==0){//时间非法if((time.minute*60+time.second)-(oldTime.minute*60+time.second) < 0){return -2;}//未满一小时else{successGoOut(parking,i);return price;}}else{sum = price * (float)parkTime;} //成功出库successGoOut(parking,i);return sum;}}return -1;
}

综合以上两个函数,即可进行总的停车逻辑控制,里面的小函数,像判断车的存在啊,成功出库后的车位清0操作,开灯,以及判断同名车辆什么的都很简单,这里就不发啦,直接看源码就好。

这里我们来看看逻辑组合部分

parkControl.c

//停车控制
void parkControl(Parking *parking,Car car,Time time)
{sum = goOut(parking,car,time,cnbrPrice,vnbrPrice);//车库中没找到这辆车 尝试停车if(sum==-1.0){if(park(parking,car,time)){USART_SendString("Success parking car!\n");}else{USART_SendString("Error parking car!\n");}}//停车时长错误if(sum==-2){USART_SendString("Error ParkTime\n");}//找到该车,出库if(sum>=0){sprintf(sendComputer,"%s:%s:%dhour:%.2f$\n",type,id,parkTime,sum);USART_SendString(sendComputer);}return;
}

到这我们已经实现了停车逻辑的控制也就是逻辑部分已经完成

3.2主函数部分

接下来大家来看看主函数的控制和串口解析,函数结构如下

//刷新显示区
void fflushData();
void fflushPara();
void updateAll();
void show();//串口解析
int analysis(char* data);
//接收数据操作
void receiveData();
//切割字符串
char* substring(char* ch,int pos,int length);

首先最重要的先来看切割字符串,其实就是利用指针的操作赋值。

这样后续我们切割串口接收的数据时就非常的轻松并且明了。

参数1是待切割的串,参数2是切割起始位置,参数3是切割长度
切割字符串

char* substring(char* ch,int pos,int length)
{  char* des=ch;  char* subch;  int i;  des=des+pos;  for(i=0;i<length;i++)  {  subch[i]=*(des++);  }  subch[length]='\0';return subch;
}

数据解析

int analysis(char* data)
{//配合切割函数简单完成strcpy(type,substring(data,0,4));strcpy(id,substring(data,5,4));year = atoi(substring(data,10,2));month = atoi(substring(data,12,2));day = atoi(substring(data,14,2));hour = atoi(substring(data,16,2));minute = atoi(substring(data,18,2));second = atoi(substring(data,20,2));//清空接收区memset(USART_RXBUF,0,sizeof(USART_RXBUF));//车辆类型限定if(strcmp(type,"VNBR")!=0 && strcmp(type,"CNBR")!=0){USART_SendString("Error Type Format\n");return 0;}//时间bug处理else if(month>12 || day>31 || hour>24 || minute>60 || second>60 ){USART_SendString("Error Time Format\n");return 0;}
}

利用这两个函数十分轻易的就做到了数据的解析和保存

这里最后我们只需要配合接收数据时的操作,就可以基本完成停车部分了

接收数据的操作如下

//接收数据开始逻辑
void receiveData()
{if(RXOVER == 1){RXOVER = 0;//调用解析数据if(analysis(USART_RXBUF)){//初始化车和时间car = initCar(id,type);time = initTime(year,month,day,hour,minute,second);//停车流程控制parkControl(parking,car,time);}//这里是为了保证我们在显示车位界面时的实时刷新(小处理 问题不大)//因为接收数据是无论在哪个界面时都要接收的,为了保证数据实时的刷新显示//利用这个标志位解决if(showFlag==0){fflushData();}USART_ITConfig(USART2  ,USART_IT_RXNE,ENABLE);return;}return;
}

界面刷新函数那些的,没什么的,到时候大家自取源码就可以啦

界面切换函数

void show()
{LCD_Clear(White);fflushPara();while(1){keyTemp=Key_Scan();switch(keyTemp){//车位显示和费率设置的切换case '1':showFlag=!showFlag;LCD_Clear(White);return;//进到函数里就保证了题目要求的按键2和按键3只在设置界面有效case '2':vnbrPrice+=0.5;cnbrPrice+=0.5;fflushPara();break;    case '3':vnbrPrice-=0.5;cnbrPrice-=0.5;fflushPara();break;}//切换界面后也要照样接收数据进行处理,否则破坏了数据一致性receiveData();}
}

最后主函数如下

while(1){        keyTemp=Key_Scan();switch(keyTemp){case '1':showFlag=!showFlag;show();break;case '4':pwmFlag = !pwmFlag;TIM_Cmd(TIM3, pwmFlag);LED_Control(LED2,pwmFlag);break;}fflushData();//接收数据开始处理receiveData();}

下载链接:链接:源码

蓝桥杯嵌入式第十二届省赛真题相关推荐

  1. 蓝桥杯嵌入式第十届省赛真题

    蓝桥杯嵌入式第十届省赛真题 文章目录 蓝桥杯嵌入式第十届省赛真题 1.题目分析 2.项目结构 2.1数组思路 2.2Key_Flag控制对应逻辑 2.3KEY控制操作 1.题目分析 总的来说这题考点特 ...

  2. 【蓝桥杯单片机第十二届国赛真题】

    [蓝桥杯单片机第十二届国赛真题] 文章目录 [蓝桥杯单片机第十二届国赛真题] 前言 一.真题 二.源码 前言 有幸进入国赛,为自己大学最后一个比赛画上完满的句号^@^ 下面为蓝桥杯单片机第十二届国赛程 ...

  3. 蓝桥杯嵌入式STM32G431——第九届省赛真题电子定时器

    第九届省赛真题电子定时器 第九届省赛真题 主函数代码(不包含各模块初始化代码) 按键模块与LCD模块的逻辑图(仅供参考) 第九届省赛真题 主函数代码(不包含各模块初始化代码) #include &qu ...

  4. 蓝桥杯——2021第十二届C/C++真题[省赛][B组]

    目录 卡片 直线 货物摆放 路径 空间 砝码称重 时间显示 杨辉三角数 双向排序 括号序列 卡片 思路:这道题咋一看给人一种挺难的感觉,其实很简单,就是一个数的每位遍历. #include<io ...

  5. 蓝桥杯嵌入式第十二届省赛第一场

    题目 题目和程序:阿里云盘链接 题目分析 1.LCD显示驱动 移植官方提供的LCD程序 2.PA7脉冲输出 只需要改变脉冲高电平时间即可. 3.uart 中断接受字符串,IDLE中断来判断字符串接受完 ...

  6. 蓝桥杯嵌入式第十三届省赛真题1

    源码在这需要的可以自取 目录 1 题目 2 分析 3 项目结构 3.1 LCD显示部分 3.2 按键控制部分 3.3 密码部分 3.4 LED部分 3.5 数据处理部分 3.6 PWM控制部分 3.7 ...

  7. 蓝桥杯嵌入式——第十二届蓝桥杯嵌入式国赛

    蓝桥杯嵌入式--第十二届蓝桥杯嵌入式国赛 之前准备省赛的时候用的是旧版的STM32F103,从准备国赛开始就用新版STM32G431平台了,主要是想经过新版的准备学习一下HAL库以及CubeMX的使用 ...

  8. 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛2020.7.5】【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  9. 蓝桥杯java B组历年省赛真题汇总及题目详解

    蓝桥杯java B组历年省赛真题汇总及题目详解 2019年第十届蓝桥杯省赛真题详解 2018年第九届蓝桥杯省赛真题详解 2017年第八届蓝桥杯省赛真题详解 2016年第七届蓝桥杯省赛真题详解 2015 ...

最新文章

  1. ThinkPHP V5.0.5漏洞_漏洞考古:thiknphp5 代码执行漏洞
  2. Appcan开发笔记:导出Excel文件
  3. Rest之一-什么是REST?以及RESTful的实现
  4. 上元节的灯会(亮)-dfs
  5. Android增加自定义监听事件
  6. Primefaces,Spring 4 with JPA(Hibernate 4 / EclipseLink)示例教程
  7. 数组中的两个常见异常
  8. Front End Developer Questions 前端开发人员问题(二)
  9. Vmware报错 This product may not be installed on a computer that has Microsoft HyperV installed. 解决
  10. 重装的电脑360打补丁都是智能忽略
  11. Python常见问题与解决方案
  12. 详细的ico图标制作与Qt修改exe图标方法
  13. 2021 绩效管理必读
  14. 2019-06-12-pintos 实验1
  15. k8s---adm构建
  16. java long to int_java int 转 Long
  17. 解决导出为Excel时文件名乱码的问题。
  18. 扫描识别工具Dynamic Web TWAIN使用教程:移动浏览器捕获(上)
  19. 虚拟机安装未开启虚拟化
  20. 程序员必备的国外IT网站

热门文章

  1. 学校学生学籍的计算机管理属于什么领域,浅谈计算机管理学生学籍信息系统的重要性...
  2. 服务器风扇插头型号,服务器风扇专场 台达 12V   12CM 4.8A怪兽来袭只要15元
  3. “救命,我就是那个廉价的实习生”
  4. Knight Tournament
  5. 如何手动搭建企业知识库制作效果远胜语雀、印象笔记
  6. P1650 田忌赛马
  7. 美国大学计算机专业排名2014,2014USNews美国大学本科计算机专业排名
  8. Intel8086处理器使用NASM汇编语言实现操作系统04-实模式-屏幕显示不定长度的字符串(cmp/je)
  9. Home Ftp Server FTP软件
  10. 本人大一的课程设计,时间太长,代码可能有些许丢失,欢迎纠错