汽车出入库的计时计费系统设计

摘要

随着汽车的普及程度越来越高,人们对汽车的便捷停车管理提出了新的要求,既要求方便快捷,又要求精准计算停车费。传统的汽车入库计时计费不仅需要耗费大量的人工去计算,还易出现计算错误。因此,设计一款数字化的汽车入库系统具有一定的现实意义。STC89C52作为最为基本的单片机,其结构设计比较基础,在程序方面编码较为简单,所以通过STC89C52来操作的停车收费系统在价格方面具有很大的优势。本设计以该芯片为控制核心,采用射频卡刷卡进行车辆数据的采集,利用按键模块校准当前时间以及设置计费基准。单片机接收到车辆信息数据后,对车辆停车时间进行计费,并根据计费基准计费。通过制作实物进行系统的整体测试,验证了设计的合理性和正确性。

引言

背景和意义

当前,随着国家国力的不断壮大、经济的迅猛增长,汽车销量也在不断地增加。据统计,截至2020年全年中国汽车销量累计超过2500万辆。伴随着城市建设速度的加快,许多住宅小区、事业单位等基本上都配备有停车场。然而,停车场所是有限的,车辆的逐年增多无疑是对社会汽车管理的一大考验,这就导致汽车停放的管理层面面临着较大的压力。
如果按照传统的方式来进行人工收费,就必须有专门的收费人员在停车场进行值班,收费人员不仅要负责对车辆进行收费,还要对停车场进行管理,长此以往容易出现收费错误,耗时又耗力。
停车收费系统作为现代智能技术的发展产物,在汽车管理中起到了不可或缺的重要作用,具有降低人工损耗、自动打开门禁、自动计时计费的功能,大大提高了停车场的运作效率。在单片机领域中,STC89C52单片机的结构较为简单、应用广泛,因此,本文以STC89C52单片机为设计核心,使系统具有制造成本低廉、操作简单、方便快捷等优势。

国外研究现状

目前,国外的停车场管理系统经过多年的发展,大部分都已经开始进入了非常智能的收费阶段,并且大部分配备了具有停车车位引导系统、停车车位查询的系统,使停车场管理系统功能日益丰富。
据了解,美国的智慧停车产业链和生态圈已经在使用“停车诱导”,其核心是用无线传感器实时采集泊位占用信息,同时也提供停车支付服务;在日本,几乎所有的停车场在大街上都有醒目的停车诱导标志,自动显示停车场的空满状态、价格信息等,驾车者可以通过互联网来实时查询当前停车场状态;新加坡人口密度大,基本上都是全自动化停车场,有效缓解了停车位紧张的问题,车主只需要把车子停在入口处,走出电梯开动停车程序,然后输入个人密码,这时,系统就会自动寻找合适的停车位[1]。

设计方案

汽车出入库计时计费系统是以STC89C52单片机为核心,由数据采集、按键输入、液晶显示、蜂鸣器报警以及电机模块组成。数据采集模块包括射频卡FRID-RC522和时钟芯片,用于实时更新当前时间和采集停车入库时间。其中,射频卡的作用是通过刷卡调用当前车辆信息,然后将此信息送入STC89C52单片机中,单片机经过软件编程执行计时计费功能,电机运行,打开门禁。外围电路使用按键来设置相关信息,然后再通过单片机对数据进行处理,在整个过程中通过蜂鸣器报警提示操作是否成功,所涉及到的信息都将在液晶上进行实时显示。
在这里插入图片描述

数据采集模块

数据采集模块是以RFID-RC522芯片为核心部件,与DS1302时钟芯片共同完成数据采集功能。RFID技术的工作原理是通过读卡器的芯片寄存器对读卡器进行信息读取的控制。当寄存器发出“读”命令时,接收来自标签芯片发出的产品信息,并将该信号进行解码。该标签的读写可以根据所使用的结构和技术进行,是RFID系统的信息处理和控制中心[2]。时钟芯片全程进行时间信息的更新,将出入场的时间与RC522所采集到的编号信息一同传送到单片机当中进行处理。
在这里插入图片描述
C522是高度集成的非接触式读写卡芯片,能够克服接触式读写卡芯片外露、必须与读卡设备接触才可读写数据的弊端,RFID技术的基本工作原理为:标签进入阅读器之后,接收阅读器发出的射频信号,凭借感应电流所获得的能量发送出存储在芯片中的产品信息,或者由标签主动发送某一频率的信号,阅读器读取信息并解码后,送至中央信息系统进行有关数据处理
在本设计中,将RC522的1~4脚接到单片机上进行信号传输,RC522经过第一次刷卡行为之后,将信号通过MISO引脚输出到单片机中进行计时和金额计算;第二次刷卡行为之后,单片机将处理后的信号通过MOSI输入到RC522中。在上述两次刷卡过程中,单片机是主设备,RC522是从设备。
RFID模块使用方便,价格相比于其他射频要便宜得多,读卡距离也比较远。它是采用3.3V电压,只需要通过SPI接口的几条杜邦线就能直接与用户任何CPU主板相连接进行通信,并且在此基础上能够保证模块工作稳定且可靠。

按键输入模块

独立按键键盘是由若干个按键与单片机的I/O口一一对应连接,通过读取单片机I/O的电平状态来确认哪个按键被按下,一般一个独立式按键对应一个功能,可以通过按键的组合来实现多个功能[3]。本模块通过键盘来进行收费标准、时间设置及查询功能的设置。
在这里插入图片描述
在单片机应用系统中,键盘是输入数据的主要方式。现在使用的基本上都是独立键盘,每个按键分别与I/O线连接,使CPU能够分别直接读取相应位置的I/O电平状态。按键被按下时,按键两端的电平都为低电平,当系统检测到按键的低电平时,就可认为该按键已经被按下[5]。在进行按键编程时还要注意按键去抖,避免单片机识别错误[6]。本设计采用的是软件消抖,相比于硬件消抖来说要简单许多,只需要在软件编程中加入一定的延时,在前沿抖动消失后再次检测按键的状态是否按下即可。
在本设计中,通过编程使每个键盘有独立的功能:K1键能够对时间进行设置;K2键是进行数字加;K3键是进行数字减;K4键是进行时间和单价的查询。

电机模块

为了模拟实际停车场管理的情况,特别采用步进电机来模拟停车阀门。在本设计中,当刷卡进场和刷卡出场时,步进电机正转一圈后再反转一圈,表示停车阀门的升降。
在这里插入图片描述

时钟模块

在这里插入图片描述
DS1302包括时钟,日历寄存器,本设计通过DS1302显示当前时间,包括秒、分、时、日期、月份、年份信息。可选择12小时制和24小时制,可设置AM、PM

工作原理

管理者可自行通过按键键盘进行费用标准的更改,当前的停车收费标准为n元/秒。当汽车进入停车场时,从入口刷卡进场,此时射频卡将信号传输给单片机,单片机接收到信号之后,通过液晶显示汽车编号和进场时间信息。汽车成功进入停车场时,单片机会根据已经设置好的费用标准开始在后台进行计费,液晶同步显示当前时间等信息。当汽车准备驶出停车场时,同样也是进行刷卡,射频卡再次将信号传输给单片机,单片机进行费用结算并实时显示在液晶上。

主程序设计

本系统主要完成键盘扫描、液晶显示以及射频卡信息读取、DS1302时间显示等功能,具体的流程图如图4.1.1所示。在系统上电初始化后,先通过刷卡读取卡号信息并发送给单片机,单片机接收到信息后进行计时计费,并启动电机;与此同时,DS1302时钟芯片启动当前时间的计算。最后,通过液晶LCD1602显示停车时间、当前时间以及停车费用
在这里插入图片描述

调试及结果

硬件调试

将各个元器件按照原理图进行组装、焊接后进行上电测试。首先查看LCD1602是否能正常显示,接着再检测每个按键输入,能否实现各自的功能,最后检查RC522是否能正常进行刷卡。以上情况都检查好之后,就要开始测试单片机的综合控制能力,如果各个模块都能够跟单片机进行信号传输,则调试成功。反之,则应对每个模块分情况进行调整。

调试结果

上电初始状态

在这里插入图片描述
成品通电之后此时射频卡亮灯显示通电正常,同时液晶实时显示当前时间。

时间设置功能

在这里插入图片描述
键盘从左至右依次为K1、K2、K3、K4。如图5.2.2所示,当按下最左边的K1按键,液晶显示的时间会进行光标跳动,提示修改位置,图中此时处于修改年份状态。若再继续按K1,光标会依次从年份移动到月份、日期、时、分、秒、星期,分别对这些信息进行修改。当光标移动到星期上之后,再按K1则会退出设置状态。

查询金额

在这里插入图片描述
当按下最右边的K4键,能够在时间和停车金额两者之间切换显示

价格设置

若要对停车价格进行设置,其具体操作为:按下K4键,使液晶切换到停车金额显示,如果要增加金额,则按下K2键;反之,按下K3键即可。
在这里插入图片描述

刷卡进场

在这里插入图片描述
当把IC卡靠近射频卡模块时,液晶显示当前卡片编号和进场时间,同时蜂鸣器报警提醒并伴有发光二极管闪烁,在此过程中,步进电机旋转,模拟抬杆与落杆。

刷卡出场

在这里插入图片描述
当第二次刷卡后,液晶显示离场信息和应支付的停车金额,同时蜂鸣器报警提醒并伴随发光二极管闪烁,在此过程中,步进电机旋转,模拟抬杆与落杆。

总结

本文系统地阐述了汽车出入库的计时计费系统从硬件设计到软件设计的过程,在此设计过程中,查阅了大量的参考文献和书籍,对单片机的知识不再局限于书本,而是能够综合运用单片机去进行设计。同时还阅读和编写了大量的代码,不仅软件逻辑能力得到了提高,而且还大大提升了自己的编程能力。
本设计是硬件部分与软件部分相辅相成所得,从最开始的硬件电路整体框架构建,到分模块进行系统的研究,最后到对程序进行编程,花费了大量的时间和精力。在老师和同学的帮助下顺利完成了此次设计,基本实现了对汽车刷卡信息的采集、停车费用的计算、按键控制以及实时液晶显示的功能。
在完成本次设计之后,对后续工作的展望为:
(1)优化软件部分,完善细节;
(2)针对实际生活中汽车出入口不同的情况,拓展算法。

原理图

在这里插入图片描述

程序

#include <reg52.h>
#include "delay.h"
#include "buzzer.h"
#include "key_s.h"
#include "lcd1602.h"
#include "ds1302.h"
#include "step_motor1.h"
#include "RC522.h"
#define SEAT_NUM 5

//全局变量
u8 refresh=1;//lcd刷新
u8 set=0;//控制参数设置
u8 music=0;//走秒提示音有效位
u8 ICbuf[4]={0};
u8 ICcode[SEAT_NUM][4]={0};
u8 ICtime[SEAT_NUM][3]={0};
u8 park_tatol = SEAT_NUM;//总车位
u8 park_seat = 0;//使用的车位
u8 ID;
u8 ParkTime=0;
u8 price = 1;
u8 Search_IC(u8 *_IC);
u8 Find_hole_InLib(void);
void Dis_ComeIn(void);
void Dis_GoOut(void);
void Dis_SetPrice();
void main(void)
{
u8 key=0;
u8 i=0;
u8 setPriceFlag = 0;
	u8 second_last=60;
	delay_Init();//延时初始化,常用宏定义声明都在这里
	LCD_Init();//液晶初始化
	Ds1302Init();//DS1302初始化
	Beep(200);//提示初始化完成
    
	while(1)
	{
		key=KeyScan(0);//扫描按键
		if(key)
		{
			Beep(100);//提示按键音
			refresh=1;//有按键操作,刷新界面
            if(key==4)
            {
                if(!setPriceFlag)setPriceFlag = 1;
                else setPriceFlag = 0;                
            }
            else if(key==1)
                setPriceFlag = 0;
		}
        else
        {
			if(ReadICcode(ICbuf)==0)//读卡
			{				
				//Beep(200);
				ID = Search_IC(ICbuf);
				if(ID!=0xEE)//找到记录
				{
					//计算停车时间
					ParkTime = RTC[HOUR]*3600+RTC[MIN]*60+RTC[SEC]	
						  -ICtime[ID][2]*3600-ICtime[ID][1]*60-ICtime[ID][0];
					//清除ID记录
					for(i=0;i<4;i++)
					{
						ICcode[ID][i]=0;
					}
					park_seat--;
					//显示出库
					Dis_GoOut();
					Beep(800);
						
				}
				else//找不到记录,新注册
				{
					ID = Find_hole_InLib();
					if(ID!=0xEE)//找到空位置
					{
						for(i=0;i<4;i++)//保存IC卡号
						{
							ICcode[ID][i]=ICbuf[i];
						}						
						//保存注册时间
						ICtime[ID][0]=RTC[SEC];
						ICtime[ID][1]=RTC[MIN];
						ICtime[ID][2]=RTC[HOUR];
						park_seat++;
						//显示注册成功
						Dis_ComeIn();
						Beep(800);
					
					}
				}
			}
			Ds1302ReadTime(RTC);//读取数据乱跳
			if(second_last!=RTC[SEC])//时间变动,刷新LCD
			{
				second_last=RTC[SEC];
				refresh=1;				
			}            
        }
	}
}

//搜索IC记录,如果有记录
//返回值为记录ID号
//如果没有,返回0xEE
u8 Search_IC(u8 *_IC)
{
	u8 i;
	for(i=0;i<SEAT_NUM;i++)//查询IC卡记录(从上到下)
	{
		if((_IC[0]==ICcode[i][0])
		 &&(_IC[1]==ICcode[i][1])
		 &&(_IC[2]==ICcode[i][2])
		 &&(_IC[3]==ICcode[i][3]))
		 {
			  return i;
		 }
	}
	return 0xEE;
}

//在IC卡数据库中查找到一个空位置
//成功返回空位置ID
//失败返回0xEE
u8 Find_hole_InLib(void)
{
	u8 IC_hole[4]={0};
	return Search_IC(IC_hole);
}

void Dis_ComeIn(void)
{				
	u8 str[16]={0};
	u8 i;
	//LCD_Clear();
	LCD_GotoXY(0,0);
	LCD_Print("Welcome ");
	//"0123456789abcdef"
	//"IC=0X12 12 12 12"
//	sprintf((char*)str,"IC=%.2X%.2X%.2X%.2X",ICbuf[0],ICbuf[1],ICbuf[2],ICbuf[3]);
    
//	LCD_Print("IC=");
    for(i=0;i<4;i++)
    {
        LCD_WrNUM(ICbuf[i]>>4);
        LCD_WrNUM(ICbuf[i]&&0x0F);
	}
}
void Dis_GoOut(void)
{
	//ParkTime
    u8 i;
	LCD_GotoXY(0,0);
	LCD_Print((u8*)"GoodBye ");
    for(i=0;i<4;i++)
    {
        LCD_WrNUM(ICbuf[i]>>4);
        LCD_WrNUM(ICbuf[i]&&0x0F);
	}

	             //"0123456789abcdef"
//	LCD_Print((u8*)"Sum:12345$");

	LCD_GotoXY(0,1);
    LCD_Print("Sum:");
    ParkTime *= price;//停车时间 X 单价
    LCD_WrNUM(ParkTime/1000%10);
    LCD_WrNUM(ParkTime/100%10);
    LCD_WrNUM(ParkTime/10%10);
    LCD_WrNUM(ParkTime/1%10);
    LCD_Print("$          ");
}
void Dis_SetPrice()
{
//"0123456789abcdef"
//"   Set  Price   "
//"   01 ($/Sec)   "
    LCD_GotoXY(0,0);
    LCD_Print((u8*)"   Set  Price   ");
    LCD_GotoXY(0,1);
    LCD_Print((u8*)"   ");
    LCD_WrNUM(price/10%10);
    LCD_WrNUM(price/1%10);
    LCD_Print((u8*)" ($/Sec)   ");
}
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值