崔 凱
(營口職業(yè)技術(shù)學(xué)院電氣電子工程系,遼寧營口 115000)
具有拼車功能的出租車計價器算法探討
崔 凱
(營口職業(yè)技術(shù)學(xué)院電氣電子工程系,遼寧營口 115000)
本文探討設(shè)計了具有拼車功能的出租車計價器的算法。此計價器如果得到應(yīng)用,在現(xiàn)有條件都不變的情況下可以提高運(yùn)力,為乘客節(jié)省支出,為的哥節(jié)省燃油費(fèi)用、增加收入,可在一定程度上解決打車難、空氣污染等問題,具有經(jīng)濟(jì)效益、環(huán)境效益和社會效益。
出租車計價器;拼車;算法
近年來,越來越多的城市出現(xiàn)了交通擁堵、打車難等問題。在目前條件下,路網(wǎng)不可能迅速增加,出租車也不可能大批量增加,政府更不可能允許私家車參與運(yùn)營,于是有的城市便提出了出租車拼車這一方案。但此方案面臨政策的瓶頸,現(xiàn)有出租車計價器也不具有這樣的功能。待制度允許后,拼車型出租車計價器一定會成為一種需要,具有巨大的市場空間。目前出現(xiàn)的個別拼車型計價器主要是給予拼車乘客少量優(yōu)惠,乘客對此不太滿意;或者是計算方法太單一,比如只有70%這一種方案。本文充分考慮了乘車時可能出現(xiàn)的一人、兩人、三人、四人這四種情況,并給出了相應(yīng)的比較合理的四種計費(fèi)方式:100%、75%、60%、50%。并且,隨著乘坐人員數(shù)量的變化,會對計費(fèi)方式做動態(tài)調(diào)整。
本設(shè)計以AT89C51單片機(jī)為核心[1],車輪脈沖采集模塊[2]、費(fèi)用輸出模塊、乘客上車按鍵模塊、乘客結(jié)賬按鍵模塊構(gòu)成(圖1)。
圖1 設(shè)計系統(tǒng)框圖
2.1 主程序模塊說明
程序首先進(jìn)行初始化,包括相關(guān)變量的定義賦值、計數(shù)器工作模式/初始值給定、串口初始化、使P0口處于“讀”狀態(tài)等。當(dāng)按下上車鍵K1、K2、K3、K4中的任意一個或者幾個的時候,程序啟動。同時啟動計數(shù)器T0,計算來自車輪的脈沖(公里數(shù))。首先判斷有沒有人、有幾個人,之后根據(jù)人數(shù)選擇相應(yīng)計費(fèi)方式(100%、75%、60%、50%)。之后再次讀取P0口的值,直到P0口的值發(fā)生變化(有新人上車、或有人下車)。此時計數(shù)器停止計數(shù),將對應(yīng)的人的車費(fèi)計算并存儲,同時將計數(shù)器清零。如果P0口的變化是由于新人上車引起的,則重新判斷人數(shù),選擇新的計費(fèi)方式;如果是有人下車,則將相應(yīng)的車費(fèi)輸出顯示,顯示后將相對應(yīng)的費(fèi)用存儲變量清零,并重新判斷是否有人,詳細(xì)流程如圖1所示。
圖1 主程序流程圖
2.2 計費(fèi)方式處理
根據(jù)P0口狀態(tài)(低四位)確定乘客人數(shù),再根據(jù)人數(shù)確定費(fèi)率,具體見表1。
表1 乘客人數(shù)、費(fèi)率、P0口狀態(tài)(低四位)及數(shù)值對應(yīng)關(guān)系
(1)如果是一個人,則計費(fèi)方式為全額;如果有兩個人,則每個人只需付正常車費(fèi)的75%;如果三個人,則每個人只需付全額的60%;四個座位都坐滿,每個人只需付全額的50%。人數(shù)、費(fèi)率、P0口狀態(tài)(低四位)及數(shù)值如圖3所示。之所以采取這種計費(fèi)方式,是因為拼車要充分考慮到乘客(尤其是第一位乘客)和出租車司機(jī)雙方的利益。(2)兩位乘客費(fèi)率需要考慮的是,如果兩個人的費(fèi)率太高,如90%,則第一位乘客很可能拒絕第二人拼車;如果費(fèi)率低于50%,則司機(jī)沒有收益。第一位乘客只能坐在前排或者后排,第二位乘客可以相應(yīng)地坐在后排或前排,從而避免與其爭奪空間,同時司機(jī)也可也獲得1.5倍的收益,三方互惠互利,容易達(dá)成協(xié)議。(3)三位乘客費(fèi)率需要考慮的是,四座的出租車坐三個人也不會太擁擠,同時可以獲得60%的折扣,而司機(jī)可以有1.8倍收益,也可以達(dá)成協(xié)議。(4)四位乘客費(fèi)率需要考慮的是,相對擁擠,但每人只需付車費(fèi)的50%,在早晚的交通高峰期,大部分人也會因為急于出行和相對較大的折扣同意拼車。而司機(jī)可以有2倍的收入,也樂于接受。
2.3 費(fèi)用計算、存儲
當(dāng)P0口的值發(fā)生變化,肯定是有人上車或下車,這時需要重新計算費(fèi)率。所以計數(shù)器要停止計數(shù),讀取數(shù)據(jù)并將其轉(zhuǎn)換成公里數(shù),與此次費(fèi)率相乘,計算費(fèi)用(圖2),之后將公里數(shù)清零。
圖2 車費(fèi)計算、存儲示意圖
圖3 相應(yīng)費(fèi)用輸出示意圖
2.4 費(fèi)用輸出
當(dāng)有人下車(J1、J2、J3、J4任意鍵按下),首先判斷是哪位乘客下車,然后將對應(yīng)座位的乘客的車費(fèi)輸出,之后將該乘客的費(fèi)用存儲單元清零,對應(yīng)鍵(K、J)清零(圖3)。由于本文只討論算法,數(shù)據(jù)輸出電路和程序已經(jīng)很成熟,故數(shù)據(jù)輸出部分僅以輸出函數(shù)表示。
#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;//定義結(jié)賬鍵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存放計數(shù)器的溢出數(shù)據(jù),N存放最終公里數(shù)
Uint i=0;
void uart_init()
{
SCON=0X52;
TMOD|=0x20; //T1
TH1=0XF3;
TR1=1;
}
void shu_chu(i)
{
printf("車費(fèi):%d元 n",i);
}
void init(void)
{
TMOD=0X26;//8位計數(shù)器T0,初始值自動載入
TH0=0;
TL0=0;
EA=0;
ET0=0;//T0中斷允許
}
void state_read() //讀P1口狀態(tài)
{
P0=0xff;//P0口作為輸入口使用
S=P0;//讀P0口值
G=S&0X0F;//取P0低四位,如果G!=0,說明有人
}
void t0()interrupt 1 using 0//C/T0計來自車輪脈沖
{
C++;
}
Uchar xi_shu()//根據(jù)人數(shù),選擇計費(fèi)方式
{
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) //結(jié)賬
{
TR0=0;//計數(shù)停止
Q=0Xff&TL0; //讀計數(shù)器的值
N=(255*C+Q); //算公里數(shù),設(shè)一次為一公里,實際需根據(jù)車輪直徑乘適當(dāng)系數(shù)
if((G&0x01)==1) {V1=V1+0.01*(N*M); TH0=0;TL0=0;}//K1結(jié)賬V1累加,計費(fèi)方式換成小數(shù)
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結(jié)賬輸出,之后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口狀態(tài)
while(G)
{
M=xi_shu();
P0=0xff;
S=P0;
if (S!=G)
jie_zhang();
state_read();//讀P1口狀態(tài)
}
}
本設(shè)計以AT89C51單片機(jī)為核心器件,采用C語言[3],對具有拼車功能的計價器的算法進(jìn)行了探討,期待本算法及其體現(xiàn)的一些設(shè)計思路對相關(guān)設(shè)計人員有所幫助。但由于本設(shè)計只限于程序算法,故涉及數(shù)據(jù)顯示、輸出、打印部分只以輸出函數(shù)表示。本設(shè)計源程序通過Keil編譯,經(jīng)功能仿真,其仿真結(jié)果與設(shè)計預(yù)期完全相符。
[1]張志良.單片機(jī)原理與控制技術(shù)[M].2版.北京:機(jī)械工業(yè)出版社,2009.
[2]舒濤,伍遠(yuǎn)超.基于AT89S51單片機(jī)的出租車計價器系統(tǒng)設(shè)計[J].現(xiàn)代電子技術(shù),2010(22):57-59.
[3]譚浩強(qiáng).C程序設(shè)計[M].2版.北京:清華大學(xué)出版社,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
國家自然科學(xué)基金資助項目(11147132)。
崔 凱(1980- ),男,遼寧本溪人,營口職業(yè)技術(shù)學(xué)院電氣電子工程系講師,碩士研究生,從事單片機(jī)開發(fā)設(shè)計研究。
TP29
A
1008-178X(2014)01-0032-05