1 前 言
1.1 我國出租車的發(fā)展
20世紀(jì)20-30年代是我國城市出租汽車行業(yè)的大發(fā)展時期。20年代初,北京自用及營運汽車有1231輛,出租汽車行達51家.據(jù)統(tǒng)計,上海市于2933-1934年間,有出租汽車行達91家,營業(yè)站153處,營運汽車達1151輛。20年代末,哈爾濱由于外國僑民劇增,使得出租汽車增多,在500輛。
1934年,河南出現(xiàn)了最早的出租汽車。開封有了首家私人出租車戶,經(jīng)營5輛小客車。1935年,河南長途汽車營業(yè)部購進3輛福特牌小客車,也在市區(qū)經(jīng)營出租業(yè)務(wù)。當(dāng)時,因出租車很時髦,用戶多是豪紳富商,他們走官場,講闊氣,不惜高價租用,所以,出租車的營業(yè)狀況較好。
抗日戰(zhàn)爭爆發(fā)后,國土的淪陷,戰(zhàn)爭的紛擾,出租汽車發(fā)展受到?jīng)_擊,數(shù)量急劇減少。至1942年,北京出租汽車行減少到48家,營運汽車約446輛,以后逐漸萎縮,至1946年,僅剩出租汽車303輛。上海在此期間,出租汽車行僅存30家,至1948年,出租汽車行僅有51家,車數(shù)減少到705輛。
中華人民共和國成立初期,出租汽車主要由兩種成分組成。一種為私有制的出租汽車,這種成分由于服務(wù)對象發(fā)生變化,客流量下降,加上車輛難以更新,營運車輛日趨減少,到1956年前,北京市出租一汽車行僅剩30家。另一種成分為公有制事業(yè)單位,主要是為了滿足接待外賓來訪和重要會議需要,由各省市人民政府組建成的汽車公司和汽車隊。50年代末至60年代初,國家旅游主管部門為適應(yīng)旅游事業(yè)發(fā)展的需要,先后在各地組建了旅游汽車隊。“文革”時期,乘出租車被稱為“四舊”,受到批判,車輛大量停駛,出租汽車行業(yè)處于奄奄一息狀態(tài)。當(dāng)時,北京市僅有出租汽車200多輛。其他城市出租汽車也為數(shù)不多。
1978年12月,黨的十一屆三中全會召開以后,國家實行了改革開放政策,城市經(jīng)濟日益繁榮,對外經(jīng)濟文化交流日益頻繁,人民生活有了很大的改善和提高,出租汽車不再是北京、上海、天津及廣州、哈爾濱等大城市的專利,全國很多中小城市在1980年以后也出現(xiàn)了出租汽車,且連續(xù)出現(xiàn)幾次高速發(fā)展浪潮。國家為解決群眾“乘車難”問題,滿足不同層次乘客出行的需要,對出租汽車行實行國營、集體、個人一起上,各行各業(yè)均可參與經(jīng)營出租汽車的政策,為出租汽車行業(yè)的發(fā)展帶來了契機,80年代后期至90年代,形成了快速發(fā)展的態(tài)勢。根據(jù)市場發(fā)展的需要,國家有關(guān)部委相繼頒布了出租汽車行業(yè)的管理規(guī)定,各地政府也根據(jù)本地實際制定了不少出租汽車管理辦法,使出租汽車行業(yè)逐步走上了規(guī)范化、正規(guī)化的法制管理軌道。
1.2 現(xiàn)階段出租車計價器的要求
隨著出租車行業(yè)的發(fā)展,對出租車計費器的要求也越來越高,用戶不僅要求計費器性能穩(wěn)定,計費準(zhǔn)確,有防作弊功能;同時還要求其具有車票資料打印 、IC卡付費、語音報話、和電腦串行通信等功能。通常,設(shè)計出租車計費器面臨以下三方面的問題:
(1)不同國家和地區(qū)的計費方式存在差異。有些地區(qū)有夜間收費及郊區(qū)收費等,而有些地區(qū)則無夜間收費和郊區(qū)收費;即使同一地區(qū),不同車型的出租車,其計費方式也有差別;另一方面,出租車還面臨幾年一次的調(diào)價或調(diào)整計費方式等問題。因此,所設(shè)計的計費器不僅要能滿足不同國家和地區(qū)的要求,而且計費方式的調(diào)整也應(yīng)當(dāng)很方便。
(2)由于個別地區(qū)對計費器有特殊要求,有時必須修改軟件;另外,計費器還面臨軟件的升級;因而,所設(shè)計的計費器應(yīng)能很方便地重新編程。
(3)計費器必須要有防作弊功能,能有效防止司機作弊;同時要防止計費器在營運過程中死機。
為此,設(shè)計出一款好的計費器,解決了上述問題是非常必要的。該計費器內(nèi)設(shè)置了多達64個選項,幾乎涵蓋了大多數(shù)國家和地區(qū)的出租車計費方式,因此,使用時無需更改計費器的硬件,而只需更改相應(yīng)的選項資料,便可適用于不同的國家和地區(qū),且計費資料的傳送可由電腦通過RS-232串口或?qū)S玫氖殖质劫Y料傳輸器來完成,非常方便;由于采用了具有單片機AT58C51,因此,編程時無需將單片機從電路板上取下,就可以直接對單片機進行編程;另外,該設(shè)計還采用單、雙信號防作弊技術(shù)和看門狗電路,較好地解決了計費器的作弊現(xiàn)象及死機問題。目前,該計費器已在許多大中城市得到了廣泛的應(yīng)用。
2 單片機89C51的簡介
2.1 主芯片89C51的硬件資源
2.1.1 單片機的概念
單片機(microcontroller,又稱微控制器)是在一塊硅片上集成了各種部件的微型計算機。這些部件包括中央處理器CPU、數(shù)據(jù)存儲器RAM、程序存儲器ROM、定時器/計數(shù)器和多種I/O接口電路。圖4-1是80C51單片機的基本結(jié)構(gòu)圖
a. 89C51單片機的結(jié)構(gòu)特點有以下幾點:
- 8位CPU;
- 片內(nèi)振蕩器及時鐘電路;
- 32根I/O線;
- 外部存儲器ROM和RAM,尋址范圍各64KB;
- 兩個16位的定時器/計數(shù)器;
- 5個中斷源,2個中斷優(yōu)先級
- 全雙工串行口
- 布爾處理器
b. 定時器/計數(shù)器
89C51內(nèi)部有兩個16位可編程定時器/計數(shù)器,記為T0和T1。16位是指它們都是由16個觸發(fā)器構(gòu)成,故最大計數(shù)模值為2-1?删幊淌侵杆麄兊墓ぷ鞣绞接芍噶顏碓O(shè)定,或者當(dāng)計數(shù)器來用,或者當(dāng)定時器來用,并且計數(shù)(定時)的范圍也可以由指令來設(shè)置。這種控制功能是通過定時器方式控制寄存器TMOD來完成的.
如果需要,定時器在計到規(guī)定的定時值時可以向CPU發(fā)出中斷申請,從而完成某種定時的控制功能。在計數(shù)狀態(tài)下同樣也可以申請中斷。定時器控制寄存器TCON用來負(fù)責(zé)定時器的啟動、停止以及中斷管理
在定時工作時,時鐘由單片機內(nèi)部提供,即系統(tǒng)時鐘經(jīng)過12分頻后作為定時器的時鐘。技術(shù)工作時,時鐘脈沖由TO和T1輸入。
c. 中斷系統(tǒng)
89C51的中斷系統(tǒng)允許接受五個獨立的中斷源,即兩個外部中斷申請,兩個定時器/計數(shù)器中斷以及一個串行口中斷。
外部中斷申請通過INTO和INT1(即P3.2和P3.3)輸入,輸入方式可以是電平觸發(fā)(低電平有效),也可以是邊沿觸發(fā)(下降沿有效)。兩個定時器中斷請求是當(dāng)定時器溢出時向CPU提出的,即當(dāng)定時器由狀態(tài)1轉(zhuǎn)為全零時提出的。第五個中斷請求是由串行口發(fā)出的,串行口每發(fā)送完一個數(shù)據(jù)或接收完一個數(shù)據(jù),就可提出一次中斷請求。
2.1.2 89C51的芯片引腳圖
VCC:供電電壓。
GND:接地。
P0口:P0口為一個8位漏極開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。
P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。
P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。因此作為輸入時,P2口的管腳被外部拉低,將輸出電流,這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。當(dāng)對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,如下表所示:
P3.0 RXD(串行輸入口)
P3.1 TXD(串行輸出口)
P3.2 /INT0(外部中斷0)
P3.3 /INT1(外部中斷1)
P3.4 T0(定時器/計數(shù)器0外部輸入)
P3.5 T1(定時器/計數(shù)器1外部輸入)
P3.6 /WR(外部數(shù)據(jù)存儲器寫選通)
P3.7 /RD(外部數(shù)據(jù)存儲器讀選通)
P3口同時為閃爍編程和編程校驗接收一些控制信號。
RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。
ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。
PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。
EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。
XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。
XTAL2:來自反向振蕩器的輸出。
2.1.3 使用I/O口的注意事項
(1)P1,P2,P3口的輸出緩沖器可驅(qū)動4個LSTTL電路。對于HCMOS芯片單片機的I/O口,在正常情況下,可任意由TTL或NMOS電路驅(qū)動。HMOS及CMOS性的單片機I/O口有集電極開路或漏極開路的輸出來驅(qū)動時,不必外加上拉電阻
(2)對于74LS系列,CD4000系列以及一些大規(guī)模集成電路芯片(如8155,8253,8279等),都可以和MCS-51系列單片機直接接口。具體使用時,可以查閱有關(guān)器件手冊或參考典型電路
(3)對一些線性組件,特別是應(yīng)用鍵盤、碼盤、LED顯示器等輸入/輸出設(shè)備時,應(yīng)當(dāng)盡量增加驅(qū)動部分的容量,否則,單片機將提供不出足夠的驅(qū)動電流供給負(fù)載使用
2.2 89C51中斷系統(tǒng)
所謂中斷,是指當(dāng)計算機執(zhí)行正常程序時,系統(tǒng)中出現(xiàn)某些急需處理的異常情況和特殊情求,CPU暫停執(zhí)行現(xiàn)行程序,轉(zhuǎn)去對隨機發(fā)生地更緊迫事件進行處理;處理完畢后,CPU自動返回原來的程序繼續(xù)執(zhí)行。
中斷允許軟件設(shè)計不需要關(guān)心系統(tǒng)其他部分定時要求,算術(shù)程序不需要考慮隔幾個指令檢查I/O設(shè)備是否需要服務(wù)。相反,算術(shù)程序編寫時好像有無限的時間作算術(shù)運算而無其他工作在進行。若其它事件需要服務(wù)時,則通過中斷告訴系統(tǒng)。
89C51單片機有5個中斷源,有兩個中斷優(yōu)先級,每個中斷源的優(yōu)先級可以編程控制。中斷允許受到CPU開中斷和中斷源開中斷的兩級控制。
2.2.1 中斷源
中斷源是指任何引起計算機中斷的事件,一般一臺機器允許有許多個中斷源。89C51系列單片機至少有5個中斷源。增加很少的硬件就可把各種硬件中斷源“線或”成為一個外部中斷輸入,然后再順序檢索一起中斷的特定源。
89C51單片機的5個中斷源是:
① 外部中斷請求0,由(P3.2)輸入;
② 外部中斷請求1,由(P3.3)輸入;
③ 片內(nèi)定時器/計數(shù)器0益處中斷請求;
④ 片內(nèi)定時器/計數(shù)器1溢出中斷請求;
為了了解每個中斷源是否產(chǎn)生了中斷請求,中斷系統(tǒng)應(yīng)設(shè)置許多個中斷請
求觸發(fā)器(標(biāo)志位)實現(xiàn)記憶。這些中斷源請求標(biāo)志位分別有特殊功能寄存器TCON和SCON的相應(yīng)位鎖存
定時器/計數(shù)器控制寄存器TCON,它是一個八位的寄存器,各位如表4.1所示:
表4.1 定時器/計數(shù)器控制寄存器TCON
IT0,IT1:外部中斷0、1觸發(fā)方式選擇位,由軟件設(shè)置。1是下降沿觸發(fā),0是電平觸發(fā)。
IE0,IE1:外部終端0、1請求標(biāo)志位。
TF0,TF1:定時器/計數(shù)器0、1溢出中斷請求標(biāo)志。
2.2.2 中斷的控制
中斷的控制主要實現(xiàn)中斷的開關(guān)管理和中斷優(yōu)先級的管理。這個管理主要通過對特殊功能寄存器IE和IP的編程實現(xiàn)。
(1)中斷允許寄存器IE
表4.2 中斷允許寄存器IE
EX0,EX1:外部終端0,1的中斷允許位。1是中斷開,0是中斷關(guān)
ET0,ET1:定時器/計數(shù)器0、1溢出中斷允許位。1是開中斷,0是關(guān)中斷
ES:串行口中斷允許位。1是中斷開,0是中斷關(guān)
ET2:定時器/計數(shù)器2溢出中斷位
EA:CPU開/關(guān)中斷控制位。1是開中斷,0是關(guān)中斷
(2)中斷優(yōu)先級寄存器IP
表4.3 中斷優(yōu)先級寄存器IP
若系統(tǒng)中多個中斷源同時請求中斷,則CPU按中斷源的優(yōu)先級別,由高到低分別響應(yīng)。
89C51單片機有兩個中斷優(yōu)先級:高優(yōu)先級和低優(yōu)先級。每個中斷源都可以編程為高優(yōu)先級。這可以實現(xiàn)兩級中斷嵌套。嵌套的原則:一個正在執(zhí)行的中斷服務(wù)程序可以被高級的中斷請求中斷,而不能被同級或較低級的中斷請求中斷。兩級中斷通過使用IP寄存器設(shè)置,相應(yīng)的位置1,則優(yōu)先級高,0則優(yōu)先級低。
PX0、PX1:終端0、1中斷優(yōu)先級控制;
PT0、PT1:定時器/計數(shù)器0、1中斷優(yōu)先級控制。
PS:串行口中斷優(yōu)先級控制。
89C51復(fù)位時,IP被清零,5個中斷源都在同一個優(yōu)先級。這時若其中幾個中斷源同時產(chǎn)生中斷請求,則CPU按照片內(nèi)硬件優(yōu)先級鏈路的順序相應(yīng)中斷,硬件優(yōu)先級由高到低的順序是:外部終端0,定時器/計數(shù)器0,外部中斷1,定時器/計數(shù)器1串行口中斷。
2.2.3 中斷響應(yīng)
89C51的CPU在每個機器周期采樣中斷源的中斷請求標(biāo)志位,如果沒有上述阻止條件,則將在下一個機器周期響應(yīng)被激活的最高級中斷請求。阻止條件如下:
- CPU正在處理同級或更高級的中斷;
- 現(xiàn)行機器周期不是所執(zhí)行指令的最后一個機器周期;
- 正在執(zhí)行的是RETI或者是訪問IE或IP的指令;
CPU在中斷響應(yīng)之后完成如下操作:
- 硬件清除相應(yīng)的中斷標(biāo)志位;
- 執(zhí)行一條硬件子程序,保護斷點,并轉(zhuǎn)向中斷服務(wù)程序入口。
- 結(jié)束中斷時執(zhí)行RETI指令,恢復(fù)斷點,返回主程序。
89C51的CPU在相應(yīng)中斷請求時,由硬件電路自動形成轉(zhuǎn)向與該中斷源對應(yīng)的中斷的服務(wù)程序入口地址。這種方法為硬件向量中斷法。
各中斷源的中斷服務(wù)程序入口地址如下:
表4.4 中斷源的中斷服務(wù)程序入口地址
各中斷服務(wù)程序入口地址僅隔8個字節(jié),編譯器在這些地址放入無條件轉(zhuǎn)移指令,跳到服務(wù)程序的實際地址。
向量中斷包括把先前的程序計數(shù)指針推入堆棧,中斷服務(wù)程序很像其他子程序。當(dāng)向量中斷發(fā)生時,硬件禁止所有中斷。此時表明外部中斷或定時器溢出的標(biāo)志位由硬件清除。中斷服務(wù)程序的不同分支取決于中斷源。在重新允許全局CPU中斷EA之前,必須仔細(xì)清除各種標(biāo)志。標(biāo)志會引起立即地重復(fù)中斷。89C51對終端實際上有特殊的返回指令----RETI。不是RET。RETI重新允許系統(tǒng)識別其他中斷。因而,沒必要在正常使用中斷時復(fù)位EA,只要在程序初始化時開中斷一次就可以了。
2.3 單片機定時器/計數(shù)器的使用
89C51系列單片機至少有兩個16位內(nèi)部定時器/計數(shù)器。8952有三個定時器/計數(shù)器,其中連個基本定時器/計數(shù)器是定時器/計數(shù)器0和定時器/計數(shù)器1。他們既可以編程為定時器使用,也可以編程為計數(shù)器使用。若是計數(shù)內(nèi)部晶振驅(qū)動時鐘,則它是定時器;若是計數(shù)89C51的輸入引腳的脈沖信號,則它是計數(shù)器。
89C51的T/C時加一計數(shù)的。定時器實際上也是工作在技術(shù)方式下的,只不過對固定頻率的脈沖計數(shù);由于脈沖周期固定,由計數(shù)值可以計算出時間,有定時功能。
當(dāng)T/C工作在定時器時,對振蕩源12分頻的脈沖計數(shù),即每個機器周期計數(shù)值加一,頻率加=fosc/12。晶振為6MHz,計數(shù)頻率=500KHz,每2uS計數(shù)加一。
當(dāng)T/C工作在計數(shù)器時,計數(shù)脈沖來自外部脈沖輸入引腳T0或T1。當(dāng)T0或T1腳上負(fù)跳變需2個機器周期,即24個振蕩周期。所以T0或T1腳輸入的計數(shù)外部脈沖的最高頻率為fosc/12。當(dāng)晶振為12MHz時,最高技術(shù)頻率為500KHz,高于此頻率將計數(shù)出錯。
2.3.1 與T/C有關(guān)的特殊功能寄存器
(1)計數(shù)寄存器TH和TL
T/C是16位的,計數(shù)寄存器有TH高8位TL低8位構(gòu)成。在特殊功能寄存器中,對應(yīng)T/C0為TH0和TL0;對應(yīng)T/C1為TH1和TL1。定時器/計數(shù)器的初始值通過TH1/TL1和TH0/TL0設(shè)置
(2)定時器/計數(shù)器控制寄存器TCON
表4.5 定時器/計數(shù)器控制寄存器TCON
TR0、TR1:定時器/計數(shù)器0、1啟動控制位。1是啟動,0是停止
TCON復(fù)位后清零,T/C需要受到軟件控制才能啟動計數(shù);當(dāng)計數(shù)計滿時,產(chǎn)生向高位的進位TF,即溢出中斷請求標(biāo)志
T/C的方式控制寄存器TMOD
表4.6 T/C的方式控制寄存器TMOD
C/T:計數(shù)器或定時器選擇位。1位計數(shù)器,0位定時器
GATE:門控信號。1時T/C的啟動控制受到雙重控制,即要求TR0/TR1和INT0/INT1同時為高;0時T/C的啟動僅受TR0/TR1控制。
表4.7 M1和M0工作方式選擇位
| | |
| | 為13位定時器/計數(shù)器,TL存低5位,TH存高8位 |
| | 為16定時器/計數(shù)器,TL存低8,TH存高8位 |
| | 常數(shù)自動裝入的8位定時器/計數(shù)器 |
| | 僅適用于T/C0,兩個8為定時器/計數(shù)器 |
2.3.2 定時器/計數(shù)器的初始化
(1)初始化步驟
在使用89C51的定時器/計數(shù)器前,應(yīng)對它進行編程初始化,主要是對TCON和TMOD編程,還需要計算和裝載T/C的計數(shù)初值。一般完成以下幾個步驟:
- 確定T/C的工作方式----編程TMOD寄存器。
- 計算T/C中的計數(shù)初值,并裝載到TH和TL。
- T/C在中斷方式工作時,須開CPU中斷和源中斷----編程IE寄存器。
- 啟動定時器/計數(shù)器----編程TCON中TR1和TR0位
(2)計數(shù)初值的計算
在定時器方式下,T/C是對機器周期脈沖計數(shù)的,如果fosc=6MHz,一個機器周期為2us,則
方式0 13位定時器最大時間間隔=(2-1)×2us=16.384ms;
方式1 16位定時器最大時間間隔=(2-1)×2us=131.072ms;
方式2 8 位定時器最大時間間隔=(2-1)×2us=512us
若使T/C工作在定時器方式1,要求定時1ms,求計數(shù)初值。如設(shè)計數(shù)初值為x,則有(2-1)×2us=1000us
x=2-500
因此,TH,TL可置65536-500。
3 計價器系統(tǒng)設(shè)計
3.1 硬件設(shè)計
3.1.1 整體硬件電路圖
由上圖我們可以清楚地看到,本電路控制核心是AT89C51芯片。該方案我們采用動態(tài)顯示的方法。動態(tài)顯示的優(yōu)點是,它占用CPU的時間少,每次只把一個數(shù)據(jù)送到外部接口,雖然我們仿真看到的是全部數(shù)碼管都亮著,那是因為動態(tài)顯示的時間比較快,超過我們?nèi)搜鄣谋鎰e能力。若我們在仿真的時候暫停一下,就可以清楚地看到,時間單元和價格單元分別只顯示一位。靜態(tài)顯示,是每一個數(shù)碼管不論在什么時候都點亮,占用CPU的時間很多。按鍵主要控制系統(tǒng)的初始化、開始工作、數(shù)據(jù)鎖存三項工作。剛開始上電,則所有的數(shù)碼管同時顯示全0狀態(tài),當(dāng)?shù)谝淮伟聪麻_關(guān),價格從起步價005.0元開始計費,等待是否超過三公里以及計算,時間單元則從00.00.00開始計時,一秒一秒往上加。P0口作為數(shù)據(jù)總線口,分別把數(shù)據(jù)輸送到4個74LS273地址鎖存器中,而鎖存器的工作需要等待脈沖的到來。脈沖通過寫地址有些端口p3.6和端口p2.0-p2.3經(jīng)過或非門來產(chǎn)生。只有當(dāng)把數(shù)據(jù)送到外部接口時,p3.6口才為低電平,p2.0-p2.3用來控制到底是把數(shù)據(jù)送往哪一個鎖存器。
算法公式是:費用=起步價+(路程-3)×1.3
路程=速度×?xí)r間 (速度恒定,60Km/h,也就是1Km/min)
若路程小于等于3,則收起步價5元,否則按費用公式算。
由于速度恒定,所以計算的核心是時間,只要判斷時間超出2分鐘,則費用公式就開始計算,每多出一公里,費用就加上1.5元,一分鐘一公里來計算,因此本設(shè)計比較簡單。時間單元由單片機的定時器/計數(shù)器來計算,延時1ms時間的初值由程序來設(shè)定。
3.1.2 74LS273和74LS02簡介
引腳功能:74LS273是8位數(shù)據(jù)/地址鎖存器。74LS273是一種帶清除功能的8D觸發(fā)器,1D~8D為數(shù)據(jù)輸入端,1Q~8Q為數(shù)據(jù)輸出端,正脈沖觸發(fā),低電平清除,常用作8位地址鎖存器。
引腳功能:74LS02是四二輸入或非門。該芯片有四個或非門公選擇,如1A或1B后,經(jīng)過非門再輸出,只有當(dāng)輸入的兩個變量同時為0時,輸出才為1。具有緩沖倒相功能。
3.2 軟件設(shè)計
3.2.1 模塊介紹
該計費器系統(tǒng)的軟件設(shè)計分為一下幾個模塊:
(1)主程序模塊
在主程序模塊中,需要完成對個接口芯片的初始化、出租車起步價和單價、中斷向量的設(shè)計以及開中斷、循環(huán)等待等工作。另外,在主程序模塊中還需要設(shè)置啟動/清除標(biāo)志寄存器、里程寄存器和價格寄存器,并對它們進行初始化。然后,主程序?qū)⒏鶕?jù)各標(biāo)志寄存器的內(nèi)容,分別完成啟動、清除、計程和計價等不同的操作。流程圖如3-4所示。
當(dāng)按下輕觸開關(guān)時,開始對系統(tǒng)初始化,價格和時間都顯示0、0,再次按下開關(guān),時間單元開始計時,并計算時間是否超過2分鐘,超過2分鐘,則從第3分鐘開始計費。價格單元從起步價5.0元開始計費,每多一分鐘,價格單元多加1.5元。
(2)顯示子程序模塊
由于顯示是由顯示時間子程序DIS1和顯示價格子程序DIS組成的,時間由小時、分、秒三個單元組成,共六個數(shù)碼管。價格由元和角兩個單元組成,最大可以顯示999.9元。
3.2.2 程序流程圖
3.2.3 匯編程序
- ORG 0000H ;初始化段地址
- LJMP MAIN ;長跳轉(zhuǎn)到主函數(shù)MAIN處
- ORG 000BH ;TT0開始地址
- LJMP TT0 ;長跳轉(zhuǎn)到TT0 處
- ORG 0030H ;主函數(shù)開始地址,避開00—30敏感段
- MAIN: MOV SP,#40H ;設(shè)堆棧底指針,下一個數(shù)據(jù)將放在41H單元
- MOV 70H,#60 ;價格單元的起步價
- MOV 71H,#00 ;價格單元的十位和百位
- MOV 72H,#00 ;秒單元清零
- MOV 74H,#00 ;時單元清零
- MOV 75H,#00 ;75H單元清零備用
- CLR 00H
- CLR 01H ;將00H,01H單元清零
- MOV 6BH,#0AH ;將0AH(既十進制10)放入6B單元
- MOV R1,#76H ;把76H放到R1中
- KKK: MOV @R1,#00H ;將76H單元的內(nèi)容清零
- INC R1
- DJNZ 6BH,KKK ;76H—7FH單元全部清零,備用
- LCALL DIS ;調(diào)用價格顯示子程序
- LCALL DIS1 ;調(diào)用時間顯示子程序
- MOV TMOD,#11H ;定時器/計數(shù)器工作方式設(shè)置
- MOV TH0,#3CH
- MOV TL0,#0B0H ;這句和上一句設(shè)置延時50ms
- MOV 6EH,#20 ;將6EH單元設(shè)置20,達到1s的延時
- G2: LCALL DIS ;長調(diào)用價格顯示子程序
- LCALL DIS1 ;長調(diào)用時間顯示子程序
- JB P1.0,G2 ;開關(guān)沒按下,等待按下,顯示初始狀態(tài),全部為零
- LCALL TIME1 ;調(diào)用TIME1延時子程序
- JB P1.0,G2 ; 開關(guān)沒按下,跳到G2,否則轉(zhuǎn)到下一步
- G1: LCALL DIS
- LCALL DIS1
- JNB P1.0,G1 ;開關(guān)按下,繼續(xù)顯示價格和時間,并轉(zhuǎn)到中斷
- SETB EA ;開中斷
- SETB ET0 ;定時器0中斷允許,向CPU申請中斷
- SETB TR0 ;定時器0工作允許
- SETB 01H ;01H單元置位
- LLL: LCALL CHAI ;調(diào)用現(xiàn)場保護子程序
- LCALL DIS
- LCALL JISUAN ;調(diào)用計算子程序
- LCALL DIS1
- JB P1.0,G3 ;開關(guān)沒按下,則返回
- LCALL TIME1
- JB P1.0,G3
- CPL 01H ;01H單元此時為零
- JNB 01H,G5;01H ;單元內(nèi)容為0,跳到G5
- SETB ET0 ;定時器0中斷允許,向CPU申請中斷
- G6: LCALL DIS
- LCALL DIS1
- JNB P1.0,G6 ;開關(guān)按下,顯示所走的時間及費用
- LJMP MAIN ;重新等待下一個工作狀態(tài)
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼