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