停车计费系统
文章目录
- 停车计费系统
-
- 前言
- 关于题目
- 主要功能展示
- 总体思路
- 关键代码
-
- 设计出入库的算法
- 串口中断
- 拆分串口接受数组
- 归纳总结
前言 最近开始了22十二届蓝桥杯的培训,星期三的时候学弟陈给我说一起去试试一下去年的省题,但是我当时还是比较急的,前段时间的电赛,然后被隔离,回到正常的课程里面后,因为大三的课程还是比较多的,然后补了很多多作业,一直没有开始做,最后在星期五的下午,我看见学弟在做了,也就按耐不住做了起来哈哈,然后我就从星期五下午6点到晚上2点实现了全部功能,抛去做其他事情的时间,一共花了我接近6个小时,正式比赛的时候应该是5个小时,虽然到时候是沉寂式5个小时,但因为比赛时封闭的,可能倒是,因为后面还有其他项目做,所以比较急的。平时其实不会这么肝哈就。
关于题目 这个题目是对我来说,难度是那种能做出来,但是还是有点费力的,主要的难点在于如何将将接收到的串口返回数组拆分成几个参量,去进行做分析处理。
文章图片 |
文章图片 |
---|---|
文章图片 |
文章图片 |
文章图片
主要功能展示
文章图片 |
文章图片 |
---|---|
文章图片 |
文章图片 |
文章图片 |
文章图片 |
文章图片 |
文章图片 |
改价格界面 | 文章图片 |
加钱 | 文章图片 |
减钱 | 文章图片 |
一旦串口发送信息过来,设置程序将串口接受数值,拆分为几个小数组,便于后边的计算,然后将这几个数组赋值给“虚拟车”的各个结构体变量。这样操作后,我们的当串口发送信息时,我们的“虚拟车”就会实时刷新得到便于处理的信息。然后时处理信息的部分,我们每次处理信息必须在接受串口数组完成后执行,而且只能进行一次。所以我们应该处理函数写道,串口接受完成后,触发的函数中。处理函数的话,主要的思想就是,先遍历着比较这10个车位中是否有何虚拟车一样的信息,(1)如果有那么就执行出库操作,计算时间价格,同时清空这个车位信息。(2)如果没有相同的车位信息,那么就执行入库操作,遍历这10个车位,如果遍历到这个车位时空的话,跳出遍历,同时将虚拟车的信息全部赋值给这个车位,完成入库操作。
关键代码 设计出入库的算法
void panduanjinchu(){
if(RXOVER){ //这里做了一下限制,实现一点的报错功能
if((USART_RXBUF[1]=='N')&&(USART_RXBUF[2]=='B')&&(USART_RXBUF[3]=='R')&&(USART_RXBUF[4]==':')&&(USART_RXBUF[9]==':')){
USART_SendString("\n");
USART_SendString(USART_RXBUF);
USART_SendString("\n");
RXOVER = 0;
iii++;
//接受串口的次数,这里的1s是防抖,完成一次后执行的程序,不过后面好像没用了。。
//判断出库,顺便计算价钱
//注意这里的panduan()函数就可以用来判断对应车位信息是否和虚拟车位相等。
if((panduan(1)==1)||(panduan(2)==1)||(panduan(3)==1)||(panduan(4)==1)||(panduan(5)==1)||(panduan(6)==1)||(panduan(7)==1)||(panduan(8)==1)){ for(i=1;
i<9;
i++){
if((panduan(i)==1)){//具体哪一位车出去
cccc[i]=0;
//这个数组代表8个车位,对应车位空
for(j=0;
j<2;
j++){
tim_s1[j]=CHAR.cartime[j+8];
tim_s2[j]=char1[i].cartime[j+8];
//分别得到秒钟部分
}
time1=atoi(tim_s1);
time2=atoi(tim_s2);
//将数组转化为数据,,便于计算
for(j=0;
j<2;
j++){
tim_s1[j]=CHAR.cartime[j+6];
tim_s2[j]=char1[i].cartime[j+6];
}
time1=time1+atoi(tim_s1)*60;
time2=time2+atoi(tim_s2)*60;
//算上分钟的秒for(j=0;
j<2;
j++){
tim_s1[j]=CHAR.cartime[j+4];
tim_s2[j]=char1[i].cartime[j+4];
}
time1=time1+atoi(tim_s1)*3600;
time2=time2+atoi(tim_s2)*3600;
//算上时钟的秒
for(j=0;
j<2;
j++){
tim_s1[j]=CHAR.cartime[j+2];
tim_s2[j]=char1[i].cartime[j+2];
}
time1=time1+atoi(tim_s1)*3600*24;
time2=time2+atoi(tim_s2)*3600*24;
//算上一天的秒
time=-time2+time1;
//计算使用时间
time=time/3600+1;
//这里的time代表小时,因为是按小时收费,所以未满1小时还是加了1
//返回数据到串口
sprintf(charge, " %d" , time);
if(char1[i].carx=='C'){
USART_SendString("C");
}
else
{
USART_SendString("V");
}
USART_SendString("NBR");
USART_SendString(":");
USART_SendString(CHAR.car1);
USART_SendString(":");
USART_SendString(charge);
if(char1[i].carx=='C'){
sprintf(charge, " %.2f" , (time)*FCNBR);
CNBR--;
}
else if(char1[i].carx=='V')
{
VNBR--;
sprintf(charge, " %.2f" , (time)*FVNBR);
}
USART_SendString(":");
USART_SendString(charge);
qinglin(i);
}}}
else{//这里是判断入库,要先判断不是出库
for(i = 1;
i<10;
i++){
if(cccc[i]==0){//代表空车位
if((CHAR.carx=='C')){
CNBR++;
}
else if((CHAR.carx=='V'))
{
VNBR++;
}
else{
USART_SendString("EER");
}
cccc[i]=1;
//1代表有车占了车位
charu(i);
i=9;
}}}}
else{
RXOVER = 0;
USART_SendString("\n");
USART_SendString("err");
USART_SendString("\n");
}}
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
串口中断
void USART2_IRQHandler(void)
{
uint8_t temp;
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET){
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
temp = USART_ReceiveData(USART2);
USART_RXBUF[RXCUNT] = temp;
RXCUNT++;
//这样会保证每次中断标志位都加一
if((temp == 'x')||(RXCUNT==22) ){
RXCUNT = 0;
RXOVER = 1;
//接收完成标志位置位
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
}}}
拆分串口接受数组
void date(){
CHAR.carx=USART_RXBUF[0];
for(i=5;
i<9;
i++){
CHAR.car1[i-5]=USART_RXBUF[i];
}
for(i=10;
i<22;
i++){
CHAR.cartime[i-10]=USART_RXBUF[i];
}}
归纳总结 【stm|十二届蓝桥杯嵌入式省赛】这个训练项目,主要难度对于我,主要在设计出入库的算法上和对串口接受到的数据进行处理分析,对现在我的是一次不错的锻炼。
推荐阅读
- 嵌入式|2021-07-08 使用RT-Thread Studio程序调试过程中的要点记录(芯片使用STM32F407ZE)
- rtt|RT-thread笔记
- STM32|STM32之继电器驱动(上下拉电阻)
- 单片机|自学单片机难吗(单片机编程教学怎么选?)
- 单片机|学好单片机好找工作吗(单片机学到什么程度可以找工作?)
- 单片机|单片机学多久能工作,单片机学好了能应聘什么工作()
- 单片机|单片机值得学吗(会单片机能找什么工作?)
- OpenHarmony|【OpenHarmony】VSCode下移植 LiteOS-M 到STM32
- 智能车|智能车学习日记【一】——让小车跑正方形赛道(摄像头图像处理赛道)