崔 凯
(营口职业技术学院电气电子工程系,辽宁营口 115000)
具有拼车功能的出租车计价器算法探讨
崔 凯
(营口职业技术学院电气电子工程系,辽宁营口 115000)
本文探讨设计了具有拼车功能的出租车计价器的算法。此计价器如果得到应用,在现有条件都不变的情况下可以提高运力,为乘客节省支出,为的哥节省燃油费用、增加收入,可在一定程度上解决打车难、空气污染等问题,具有经济效益、环境效益和社会效益。
出租车计价器;拼车;算法
近年来,越来越多的城市出现了交通拥堵、打车难等问题。在目前条件下,路网不可能迅速增加,出租车也不可能大批量增加,政府更不可能允许私家车参与运营,于是有的城市便提出了出租车拼车这一方案。但此方案面临政策的瓶颈,现有出租车计价器也不具有这样的功能。待制度允许后,拼车型出租车计价器一定会成为一种需要,具有巨大的市场空间。目前出现的个别拼车型计价器主要是给予拼车乘客少量优惠,乘客对此不太满意;或者是计算方法太单一,比如只有70%这一种方案。本文充分考虑了乘车时可能出现的一人、两人、三人、四人这四种情况,并给出了相应的比较合理的四种计费方式:100%、75%、60%、50%。并且,随着乘坐人员数量的变化,会对计费方式做动态调整。
本设计以AT89C51单片机为核心[1],车轮脉冲采集模块[2]、费用输出模块、乘客上车按键模块、乘客结账按键模块构成(图1)。
图1 设计系统框图
2.1 主程序模块说明
程序首先进行初始化,包括相关变量的定义赋值、计数器工作模式/初始值给定、串口初始化、使P0口处于“读”状态等。当按下上车键K1、K2、K3、K4中的任意一个或者几个的时候,程序启动。同时启动计数器T0,计算来自车轮的脉冲(公里数)。首先判断有没有人、有几个人,之后根据人数选择相应计费方式(100%、75%、60%、50%)。之后再次读取P0口的值,直到P0口的值发生变化(有新人上车、或有人下车)。此时计数器停止计数,将对应的人的车费计算并存储,同时将计数器清零。如果P0口的变化是由于新人上车引起的,则重新判断人数,选择新的计费方式;如果是有人下车,则将相应的车费输出显示,显示后将相对应的费用存储变量清零,并重新判断是否有人,详细流程如图1所示。
图1 主程序流程图
2.2 计费方式处理
根据P0口状态(低四位)确定乘客人数,再根据人数确定费率,具体见表1。
表1 乘客人数、费率、P0口状态(低四位)及数值对应关系
(1)如果是一个人,则计费方式为全额;如果有两个人,则每个人只需付正常车费的75%;如果三个人,则每个人只需付全额的60%;四个座位都坐满,每个人只需付全额的50%。人数、费率、P0口状态(低四位)及数值如图3所示。之所以采取这种计费方式,是因为拼车要充分考虑到乘客(尤其是第一位乘客)和出租车司机双方的利益。(2)两位乘客费率需要考虑的是,如果两个人的费率太高,如90%,则第一位乘客很可能拒绝第二人拼车;如果费率低于50%,则司机没有收益。第一位乘客只能坐在前排或者后排,第二位乘客可以相应地坐在后排或前排,从而避免与其争夺空间,同时司机也可也获得1.5倍的收益,三方互惠互利,容易达成协议。(3)三位乘客费率需要考虑的是,四座的出租车坐三个人也不会太拥挤,同时可以获得60%的折扣,而司机可以有1.8倍收益,也可以达成协议。(4)四位乘客费率需要考虑的是,相对拥挤,但每人只需付车费的50%,在早晚的交通高峰期,大部分人也会因为急于出行和相对较大的折扣同意拼车。而司机可以有2倍的收入,也乐于接受。
2.3 费用计算、存储
当P0口的值发生变化,肯定是有人上车或下车,这时需要重新计算费率。所以计数器要停止计数,读取数据并将其转换成公里数,与此次费率相乘,计算费用(图2),之后将公里数清零。
图2 车费计算、存储示意图
图3 相应费用输出示意图
2.4 费用输出
当有人下车(J1、J2、J3、J4任意键按下),首先判断是哪位乘客下车,然后将对应座位的乘客的车费输出,之后将该乘客的费用存储单元清零,对应键(K、J)清零(图3)。由于本文只讨论算法,数据输出电路和程序已经很成熟,故数据输出部分仅以输出函数表示。
#include
#include
#define Uchar unsigned char
#define Uint unsigned int
sbit K1=P0^0;sbit K2=P0^1;sbit K3=P0^2;sbit K4=P0^3;//定义开始键k1、k2、k3、k4
sbit J1=P0^4;sbit J2=P0^5;sbit J3=P0^6;sbit J4=P0^7;//定义结账键J1、J2、J3、J4
Uchar S,Z,Q,G,M;
Uint V1=0,V2=0,V3=0,V4=0;
Uint N=0,C=0;//C存放计数器的溢出数据,N存放最终公里数
Uint i=0;
void uart_init()
{
SCON=0X52;
TMOD|=0x20; //T1
TH1=0XF3;
TR1=1;
}
void shu_chu(i)
{
printf("车费:%d元 n",i);
}
void init(void)
{
TMOD=0X26;//8位计数器T0,初始值自动载入
TH0=0;
TL0=0;
EA=0;
ET0=0;//T0中断允许
}
void state_read() //读P1口状态
{
P0=0xff;//P0口作为输入口使用
S=P0;//读P0口值
G=S&0X0F;//取P0低四位,如果G!=0,说明有人
}
void t0()interrupt 1 using 0//C/T0计来自车轮脉冲
{
C++;
}
Uchar xi_shu()//根据人数,选择计费方式
{
Uchar M ;
TR0=1;
if (G==0x01||G==0x02||G==0x04||G==0x08) M=100; //1人
if (G==0x03||G==0x05||G==0x06||G==0x09||G==0X0A||G==0X0C) M=75;//2人
if (G==0x07|| G==0X0B||G==0X0D||G==0X0E) M=60; //3人
if (G==0X0F) M=50; //4人
return (M);
}
void jie_zhang(void) //结账
{
TR0=0;//计数停止
Q=0Xff&TL0; //读计数器的值
N=(255*C+Q); //算公里数,设一次为一公里,实际需根据车轮直径乘适当系数
if((G&0x01)==1) {V1=V1+0.01*(N*M); TH0=0;TL0=0;}//K1结账V1累加,计费方式换成小数
if((G&0x02)==2) {V2=V2+0.01*(N*M); TH0=0;TL0=0;}//K2同上
if((G&0x04)==4) {V3=V3+0.01*(N*M); TH0=0;TL0=0;}//K3同上
if((G&0x08)==8) {V4=V4+0.01*(N*M); TH0=0;TL0=0;}//K4同上
if((S&0x10)==0x10)
{shu_chu(V1); V1=0;K1=0;J1=0;}//J1结账输出,之后V1、K1、J1清零
if((S&0x20)==0x20)
{shu_chu(V2);V2=0;K2=0;J2=0;}//J2
if((S&0x40)==0x40)
{shu_chu(V3); V3=0;K3=0;J3=0;}//J3
if((S&0x80)==0x80)
{shu_chu(V4); V4=0;K4=0;J4=0;}//J4
TR0=1;
}
void main()
{
init();
uart_init();
state_read();//读P1口状态
while(G)
{
M=xi_shu();
P0=0xff;
S=P0;
if (S!=G)
jie_zhang();
state_read();//读P1口状态
}
}
本设计以AT89C51单片机为核心器件,采用C语言[3],对具有拼车功能的计价器的算法进行了探讨,期待本算法及其体现的一些设计思路对相关设计人员有所帮助。但由于本设计只限于程序算法,故涉及数据显示、输出、打印部分只以输出函数表示。本设计源程序通过Keil编译,经功能仿真,其仿真结果与设计预期完全相符。
[1]张志良.单片机原理与控制技术[M].2版.北京:机械工业出版社,2009.
[2]舒涛,伍远超.基于AT89S51单片机的出租车计价器系统设计[J].现代电子技术,2010(22):57-59.
[3]谭浩强.C程序设计[M].2版.北京:清华大学出版社,2003.
The Algorithm Discussion for Taximeters Applied to Carsharing
CUI Kai
(Electrical & Electronics Department ,Yingkou Vocational and Technical College, Yingkou Liaoning 115000,China)
In recent years, traffic jams occurred in more and more cities. But neither roads nor taxi numbers can increase quickly at present. The government could not allow the private car using for business either. So some cities suggest taxi sharing, but this scheme conflicts with the policy. The existing taximeters don’t have such function. Therefore, we designed a algorithm for carsharing taximeters. If this taximeter is applied, the transport capacity may increase rapidly under the existing conditions. It can save money for passengers, saving fuel and increasing incomes for drivers. This taximeter can also solve the problem of taxi hard taking and air pollution effectively, owning economic, environmental and social benefits.
carsharing; taximeter; algorithm discussion
2013-10-17
国家自然科学基金资助项目(11147132)。
崔 凯(1980- ),男,辽宁本溪人,营口职业技术学院电气电子工程系讲师,硕士研究生,从事单片机开发设计研究。
TP29
A
1008-178X(2014)01-0032-05