|
目 錄
第1節 引 言·································································· 1
1. 1 出租車計價器概述········································································· 1
1. 2 本設計任務··················································································· 1
1.2.1 設計任務················································································· 1
1.2.2 設計要求················································································· 1
1. 3 系統主要功能··············································································· 2
第2節 出租車計價器硬件設計················································· 3
2.1 系統的硬件構成及功能···································································· 3
2. 2 AT89S51單片機及其引腳說明·························································· 3
2.3 AT24C02引腳圖及其引腳功能··························································· 6
2. 4 AT24C02 掉電存儲單元的設計························································· 6
2.5 里程計算、計價單元的設計····························································· 7
2.6 數據顯示單元設計·········································································· 8
第3節 系統軟件設計···························································10
3. 1 系統主程序設計············································································ 10
3. 2 定時中斷程序設計········································································ 10
3. 3 里程計數中斷服務程序設計···························································· 10
3.4 中途等待中斷服務程序設計···························································· 10
3. 5 鍵盤服務程序設計·········································································10
3. 6 顯示子程序服務程序設計······························································· 10
第4節 系統調試與測試結果分析·············································· 13
4. 1 使用的儀器儀表··········································································· 13
4.2 系統調試····················································································· 13
4.3 測試結果····················································································· 13
4.4 測試結果分析·············································································· 13
第5節 結束語································································· 14
附錄··········································································· 15
參考文獻······································································· 40
多功能出租車計價器
第1節 引 言
本次課程設計利用單片機技術來實現一臺多功能出租車計價器,具有性能可靠、電路簡單、成本低等特點。
1.1 出租車計價器概述
計價器顯示的營運金額是營運里程與價格的函數(等候時間一般折算成一定比例的里程來計算)。出租車計價器通過傳感器與行駛車輛連接。出租汽車的實際里程通過傳感器的脈沖信號在計價器里折算成一定的計價營運里程。目前市場上出租車計價器功能主要有具有數據的復位功能、白天/晚上轉換功能、數據輸出功能、計時計價功能等等,但能夠進行語音播報數據信息的出租車計價器還是比較少見的,針對這一點我們來設計一款多功能出租車計價器,在原有功能的基礎上增加單價輸出、單價調整、路程輸出、顯示當前的系統時間、語音播報數據信息等功能。
1.2 本設計任務
1.2.1 設計任務
設計一款基于AT89S51單片機的出租車計價器。
1.2.2 設計要求
1.基本要求
(1)不同情況具有不同的收費標準。
l 白天
l 晚上
l 途中等待(>10min 開始收費)
(2)能進行手動修改單價。
(3)具有數據的復位功能。
(4)IO 口分配的簡易要求。
l 距離檢測使用霍爾開關A44E
l 白天/晚上收費標準的轉換開關
l 數據的清零開關
l 單價的調整(最好使用+和-按鍵)
(5)數據輸出(采用LCM103)。
l 單價輸出 2 位
l 路程輸出 2 位
l 總金額輸出 3 位
(6)按鍵。
l 啟動計時開關
l 數據復位(清零)
l 白天/晚上轉換
2.發揮部分
(1) 能夠在掉電的情況下存儲單價等數據。
(2) 能夠顯示當前的系統時間。
(3) 語音播報數據信息。
1.3 系統主要功能
本課程設計所設計的出租車計價器的主要功能有:數據的復位、白天/晚上轉換、數據輸出、計時計價、單價輸出及調整、路程輸出、語音播報數據信息、實現在系統掉電的時候保存單價和系統時間等信息等功能。輸出采用8 段數碼顯示管。本電路設計的計價器不但能實現基本的計價,而且還能根據白天、黑夜、中途等待來調節單價,同時在不計價的時候還能作為時鐘為司機同志提供方便。
第2節 計價器硬件設計
本系統的硬件設計主要包括單片機AT89S51、數據顯示部件、A44E霍爾傳感器電路、AT24C02 掉電存儲單元的設計、里程計算及計價單元的設計。在硬件設計過程中,充分利用各部件的功能,實現多功能的出租車計價器設計。
2.1 系統的硬件構成及功能
計價器的單片機控制方案圖如圖1所示。它由以下幾個部件組成:單片機AT89S51、總金額及單價顯示部件、鍵盤控制部件,AT24C02 掉電存儲控制、里程計算單元、串中顯示驅動電路等。
利用單片機豐富的IO端口,及其控制的靈活性,實現基本的里程計價功能和價格調節、時鐘顯示功能。不但能實現所要求的功能而且能在很大的程度上擴展功能,而且還可以方便的對系統進行升級。具體電路參見“多功能出租車計價器總體電路圖”。
圖1 單片機控制方案圖
2.2 AT89S51單片機及其引腳說明
AT89S51是美國ATMEL公司生產的低功耗,高性能CMOS 8位單片機,片內含4KB的可系統編程的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準8051指令系統及引腳。它集Flash程序存儲器既可在線編程(ISP)也可用傳統方法進行編程及通用 8位微處理器于單片芯片中,具有高性價比。
AT89S51是一個有40個引腳的芯片,引腳配置如圖2所示。
圖2 AT89S51引腳配置
AT89S51芯片的40個引腳功能為:
VCC 電源電壓。
GND 接地。
RST 復位輸入。當RST變為高電平并保持2個機器周期時,將使單片機復位。WDT溢出將使該引腳輸出高電平,設置SFR AUXR的DISRTO位(地址8EH)可打開或關閉該功能。DISKRTO位缺省為RESET輸出高電平打開狀態。
XTAL1 反向振蕩放大器的輸入及內部時鐘工作電路的輸入。
XTAL2 來自反向振蕩放大器的輸出。
P0口 一 組8位漏極開路型雙向I/O口。也即地址/數據總線復用口。作為輸出口用時,每位能驅動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪 問外部數據存儲器或程序存儲器時,這組口線分時轉換地址(低8位)和數據總線復用,在訪問期間激活內部上拉電阻。在Flash編程時,P0口接收指令字 節,而在程序校驗時,輸出指令字節,校驗時,要求外接上拉電阻。
P1口 一個帶內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。Flash編程和程序校驗期間,P1接收低8位地址。P1口部分端口引腳及功能如表1所示。
表1 P1口特殊功能
P1口引腳 | 特殊功能 |
P1.5 | MOSI(用于ISP編程) |
P1.6 | MOSI(用于ISP編程) |
P1.7 | SCK(用于ISP編程) |
P2口 一個帶內部上拉電阻的8位雙向I/O口。P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數據存儲器時,P2口送出高8位地址數據。在訪問8位地址的外部數據存儲器時,P2口線上的內容在整個訪問期間不改變。Flash編程和程序校驗期間,P2亦接收低8位地址。
P3口 一個帶內部上拉電阻的8位雙向I/O口。P3的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫“1”時,它們被內部的上拉電阻把拉到高電并可作輸入端口。作輸入端口使用時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,如表2所示。P3口還接收一些用于Flash閃速存儲器編程和程序校驗期間的控制信號。
表2 P3口特殊功能
P3口引腳 | 特殊功能 |
P3.0 | RXD(串行輸入口) |
P3.1 | TXD(串行輸出口) |
P3.2 |
|
P3.3 |
|
P3.4 | T0(定時器0外部輸入)
|
P3.5 | T1(定時器1外部輸入) |
P3.6 | |
P3.7 | |
PSEN/ 程序儲存允許輸出是外部程序存儲器的讀先通信號,當AT89S51由外部程序存儲器取指令(或數據)時,每個機器周期兩次PSEN/有效,即輸出兩個脈沖。當訪問外部數據存儲器,沒有兩次有效的PSEN/信號。
EA/VPP 外部訪問允許。欲使CPU僅訪問外部程序存儲器,EA端必須保持低電平,需注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態。Flash存儲器編程時,該引腳加上+12V的編程電壓VPP。
2.3 AT24C02引腳圖及其引腳功能
AT24C02芯片引腳配置如圖3所示。
圖3 AT24C02引腳配置圖
AT24C02芯片DIP封裝,共有8個引腳,其中:
A2~A0 地址引腳;
SDA、SCL I2C總線接口;
WP 寫保護引腳,WP接VSS時,禁止寫入高位地址,WP接VDD時,允許寫入任何地址;
VCC 電源端
GND 接地端
2.4 AT24C02 掉電存儲單元的設計
掉電存儲單元的作用是在電源斷開的時候,存儲當前設定的單價信息。AT24C02 是ATMEL公司的2KB 字節的電可擦除存儲芯片,采用兩線串行的總線和單片機通訊,電壓最低可以到2.5V,額定電流為1mA,靜態電流10Ua(5.5V),芯片內的資料可以在斷電的情況下保存40 年以上,而且采用8 腳的DIP 封裝,使用方便。其電路如圖4所示。
圖 4 掉電存儲電路原理圖
圖中R8、R10 是上拉電阻,其作用是減少AT24C02 的靜態功耗,由于AT24C02 的數據線和地址線是復用的,采用串口的方式傳送數據,所以只用兩根線SCL(移位脈沖)和SDA(數據/地址)與單片機傳送數據。
每當設定一次單價,系統就自動調用存儲程序,將單價信息保存在芯片內;當系統重新上電的時候,自動調用讀存儲器程序,將存儲器內的單價等信息,讀到緩存單元中,供主程序使用。
2.5 里程計算、計價單元的設計
里程計算是通過安裝在車輪上的霍爾傳感器A44E檢測到的信號,送到單片機,經處理計算,送給顯示單元的。其原理如圖5所示。
圖 5 傳感器測距示意圖
由于A44E 屬于開關型的霍爾器件,其工作電壓范圍比較寬(4.5~18V),其輸出的信號符合TTL 電平標準,可以直接接到單片機的IO 端口上,而且其最高檢測頻率可達到1MHZ。
A44E 集成霍耳開關由穩壓器A、霍耳電勢發生器(即硅霍耳片)B、差分放大器C、施密特觸發器D 和OC 門輸出E 五個基本部分組成。
在輸入端輸入電壓CC V ,經穩壓器穩壓后加在霍耳電勢發生器的兩端,根據霍耳效應原理,當霍耳片處在磁場中時,在垂直于磁場的方向通以電流,則與這二者相垂直的方向上將會產生霍耳電勢差H V 輸出,該H V 信號經放大器放大后送至施密特觸發器整形,使其成為方波輸送到OC 門輸出。當施加的磁場達到“工作點”(即OP B )時,觸發器輸出高電壓(相對于地電位),使三極管導通,此時OC 門輸出端輸出低電壓,通常稱這種狀態為“開”。當施加的磁場達到“釋放點”(即rP B )時,觸發器輸出低電壓,三極管截止,使OC 門輸出高電壓,這種狀態為“關”。這樣兩次電壓變換,使霍耳開關完成了一次開關動作。
我們選擇了P3.2 口作為信號的輸入端,內部采用外部中斷0(這樣可以減少程序設計的麻煩),車輪每轉一圈(我們設車輪的周長是1 米),霍爾開關就檢測并輸出信號,引起單片機的中斷,對脈計數,當計數達到1000 次時,也就是1 公里,單片機就控制將金額自動的加增加,其計算公式:當前單價×公里數=金額。
2.6 數據顯示單元設計
由于設計要求有單價(2 位)、路程(2 位)、總金額(3 位)顯示輸出,加上我們另外擴展了時鐘顯示(包含時分秒的顯示),采用LCD 液晶段碼顯示,在距離屏幕1 米之外就無法看清數據,不能滿足要求,而且在白天其對比度也不能夠滿足要求,因此我們采用6 位LED數碼管的分屏顯示,如圖6 所示:
圖 6 采用6 位LED數碼管的分屏顯示
數據的分屏的顯示是通過按鍵S1 來實現切換的,如圖7 所示。
在出租車不走的時候,按下S1,可以實現數據的分屏顯示;車在行走的時候只有總金額和單價顯示屏在顯示,當到達目的地的時候,客戶要求查看總的里程的時候,就可以按下S1 切換到里程和單價顯示屏,供客戶查詢。顯示電路的電路原理圖如圖8所示。
圖 7 S1切換顯示屏
圖 8 顯示器原理圖
從單片機串口輸出的信號先送到左邊的移位寄存器(74HC164),由于移位脈沖的作用,使數據向右移,達到顯示的目的。移位寄存器74HC164還兼作數碼管的驅動,插頭1(header1)接電源,插頭2(header2)接數據和脈沖輸出端。電路中的三個整流管D1~D3 的作用是降低數碼管的工作電壓,增加其使用壽命。
第3節 系統的軟件設計
本系統的軟件設計主要可分為主程序模塊、定時計數中斷程序、里程計數中斷服務程序、中途等待中斷服務程序、顯示子程序服務程序、鍵盤服務程序六大模塊。下面對各部分模塊作介紹。
3.1 系統主程序設計
在主程序模塊中,需要完成對各接口芯片的初始化、出租車起價和單價的初始化、中斷向量的設計以及開中斷、循環等待等工作。另外,在主程序模塊中還需要設置啟動/清除標志寄存器、里程寄存器和價格寄存器,并對它們進行初始化。然后,主程序將根據各標志寄存器的內容,分別完成啟動、清除、計程和計價等不同的操作。主程序流程圖如圖9 所示。當按下S1時, 就啟動計價,將根據里程寄存器中的內容計算和判斷出行駛里程是否已超過起價公里數。若已超過,則根據里程值、每公里的單價數和起價數來計算出當前的累計價 格,并將結果存于價格寄存器中,然后將時間和當前累計價格送顯示電路顯示出來。當到達目的地的時候,由于霍爾開關沒有送來脈沖信號,就停止計價,顯示當前 所應該付的金額和對應的單價,到下次啟動計價時,系統自動對顯示清零,并重新進行初始化過程。
3.2 定時中斷服務程序
在定時中斷服務程序中,每100ms 產生一次中斷,當產生10 次中斷的時候,也就到了一秒,送數據到相應的顯示緩沖單元,并調用顯示子程序實時顯示。其程序流程如圖10 所示。
3.3 里程計數中斷服務程序
每當霍爾傳感器輸出一個低電平信號就使單片機中斷一次,當里程計數器對里程脈沖計滿1000 次時,使微機進入里程計數中斷服務程序中。在該程序中,需要完成當前行駛里程數和總額的累加操作,并將結果存入里程和總額寄存器中。
3.4 中途等待中斷服務程序
當在計數狀態下霍爾開關沒有輸出信號,片內的T1 定時器便被啟動,每當計時到達10分鐘,就對當前金額加上中途等待的單價,以后每十分鐘都自動加上中途等待的單價。當中途等待結束的時候,也就自動切換到正常的計價。
3.5 顯示子程序服務程序
由于是分屏顯示數據,所以就要用到4 個顯示子程序,分別是:時分秒顯示子程序(HMS_DIS)、金額單價顯示子程序(CP_DIS)、路程單價顯示子程序(DP_DIS)、單價調節子程序(PA_DIS)。
3.6 鍵盤服務程序
鍵盤采用查詢的方式,放在主程序中,當沒有按鍵按下的時候,單片機循環主程序,一旦有按鍵按下,便轉向相應的子程序處理,處理結束再返回。
圖10 定時中斷服務程序
第4節 系統調試與測試結果分析
根據系統設計方案,本系統的調試共分為三大部分:硬件調試,軟件調試和軟硬件聯調。測試包括里程計價測試、掉電存儲測試測試。
4.1 使用的儀器儀表
數字萬用表 DT9203
單片機仿真器 WAVE6000
燒寫器 GF2100
雙蹤穩壓穩流電源 DH1718E-5
數字示波器 TDS1002
4.2 系統調試
根據系統設計方案,本系統的調試共分為三大部分:硬件調試,軟件調試和軟硬件聯調。由于在系統設計中采用模塊設計法,所以方便對各電路模塊功能進行逐級測試。
4.3 測試結果
略。
4.4 測試結果分析
略。
結 束 語
本款出租車計價器比目前市場現在的增加了不少功能,其中包括單價輸出、單價調整、路程輸出、顯示當前的系統時間、語音播報數據信息等功能。另外,多功能出租車計價器還具有性能可靠、電路簡單、成本低、實用性強等特點,加上經過優化的程序,使其有很高的智能化水平。
通過本次課程設計,又使我學到了許多書本上無法學到的知識,也使也深該體會到單片機技術應用領域的廣泛,不僅使我對學過的單片機知識有了很多的鞏固,同時也對單片機這一門課程產生了更大的興趣。
在本次課程設計過程中,我學會了在網絡上查找有關本設計的各硬件的資源,其中包括:AT89S51單片機及其引腳說明、AT24C02引腳圖及其引腳功能等,為本次課程設計提供了一定的資料。由于平時很少進行課程設計,所以對于課程設計報告的格式也是近期才接觸到,經過這兩次的設計,為我們以后畢業設計的制作也奠定了一定的基礎。
附 錄
1.系統實物圖
略。
2. 總體設計電路圖
多功能出租車計價器總體電路圖
3.計價表使用說明
(1)S1按鍵的功能
在出租車不走的時候,按下S1,可以實現數據的分屏顯示;車在行走的時候只有總金額和單價顯示屏在顯示,當到達目的地的時候,客戶要求查看總的里程的時候,就可以按下S1 切換到里程和單價顯示屏,供客戶查詢。
(2)S2按鍵的功能
在 按下S1按鍵之后,若接著按下S2鍵則進行單價調整(默認為調整白天單價),當接著按下S1時,則進行晚上單價調,再次按下S1可進行中途等待單價調整。 當單價調整結束后,可以通過過按下S2按鍵進行時間調整,默認為調整時,接著按下S1可進行調整分,分調整后再接下S1可進行秒調整。當時調整完成后,若 接著按下S2則又可進行單價調整。
(3)S3按鍵的功能
在顯示金額及單價時,若按下S3鍵則顯示路程和單價,再次按下S3,可返回顯示金額及單價。
(4)S4按鍵的功能
在按下S1按鍵之后,若接著按下S4按鍵,則進行設定默認晚上單價,并啟動計價器,若沒有按下S4則可設定默認單價(白天),并啟動計價器。當設定默認晚上單價結束后,再次接下S4按鍵,則可設定默認中途等待單價,并啟動計價器。當設定默認中途等待單價后,若還按一次S4,則返回系統時間的顯示。
4. 全部源程序
該出租車計價器的系統軟件設計源程序如下:
DAY_PRICEEQU 6FH
NIGHT_PRICEEQU 6EH
MIDWAY_PRICEEQU 6DH
START_PRICEEQU 6CH
COUNTL EQU 6BH
COUNTH EQU 6AH
M100 EQU 69H ; 外部中斷次數
DISTANCE EQU 68H ; 行車距離
MS100 EQU 67H
SEC EQU 66H
MIN EQU 65H
HOUR EQU 64H
LEDSL EQU 63H ; 時分鈔顯示緩沖區
LEDSH EQU 62H
LEDML EQU 61H
LEDMH EQU 60H
LEDHL EQU 5FH
LEDHH EQU 5EH
LEDDANJIAL EQU 5DH ; 總額,單價顯示緩沖區
LEDDANJIAH EQU 5CH
LINE_ EQU 5BH
LEDCOUNT1 EQU 5AH
LEDCOUNT2 EQU 59H
LEDCOUNT3 EQU 58H
LEDDANJIA2L EQU 57H ; 路程,單價顯示緩沖區
LEDDANJIA2H EQU 56H
LINE__ EQU 55H
LINE___ EQU 54H
LEDDISTANCEL EQU 53H
LEDDISTANCEH EQU 52H
LEDDAY_PL EQU 51H ; 中途,晚上,白天顯示緩沖區
LEDDAY_PH EQU 50H
LEDNIG_PL EQU 4FH
LEDNIG_PH EQU 4EH
LEDW_PL EQU 4DH
LEDW_PH EQU 4CH
S1 BIT P1.0
S2 BIT P1.1
S3 BIT P1.2
S4 BIT P1.3
S11 EQU 4BH
S22 EQU 4AH
S33 EQU 49H
S44 EQU 48H
M1 EQU 47H
H1 EQU 46H
M2 EQU 45H
H2 EQU 44H
PRICE EQU 43H
ORG 0000H
AJMPMAIN
ORG 0003H
AJMPTO
ORG 000BH
AJMPTOTIME
ORG 001BH
AJMPTOSTART
ORG 0030H
MAIN: MOV SP,#70H
MOV TMOD, #11H
MOV TH0, #3CH
MOV TL0, #0B0H
MOV TH1, #3CH
MOV TL1, #0B0H
MOV 22H, #0AH
SETB EA
SETB TR0
SETB EX0
SETB IT0
SETB ET0
SETB ET1
MOV R7,#34
MOV R0,#69H
LOOPL:MOV @R0,#0
DEC R0
DJNZR7,LOOPL
MOV COUNTL, #00H ; 起步價
MOV COUNTH, #05H
MOV DAY_PRICE,#25H ; 白天價格初始化
MOV NIGHT_PRICE,#30H ; 晚上價格初始化
MOV MIDWAY_PRICE,#10H ; 中途等待初始化
MOV START_PRICE, #50H ; 起步價初始化
MOV S11, #0
MOV S22, #0
MOV S33, #0
MOV S44, #0
MOV DISTANCE, #02H
MOV HOUR, #12H
KEY_MAIN: SETB TR0
ACALL HMS_DIS
ACALL T100MSD
ACALL T100MSD
ACALL T100MSD
JB S1, KEY_MAIN
ACALL T10MSD
JB S1, KEY_MAIN
JNB S1,$
SJMP WAI1
WA1:JB S1, K1
ACALL T10MSD
JB S1, K1
WAIT1:JNB S1, WAIT1
MOV R0, #LEDDANJIAL
MOV R2, #6
CLR A
MOV COUNTL,A
MOV COUNTH,A
MOV M100, A
MOV DISTANCE,A
BK1: MOV @R0, A
DEC R0
DJNZ R2, BK1
MOV PRICE,DAY_PRICE; 起動初始化
MOV COUNTL, #00H; 起步價
MOV COUNTH, #05H
LCALL CP_DIS; 總金額和單價顯示
K1: JB S2, K2
ACALL T10MSD
JB S2, K2
WAIT2: JNB S2, WAIT2
INC S22
MOV A, S22
CJNE A, #1, NEXT1
LCALL PA_DIS
LJMP KEY_DJ
NEXT1:CJNE A, #2, NEXT2
CLR TR0
LCALL HMS_DIS
LJMP KEY_SJ
NEXT2:CJNE A, #3, K2
MOV S22, #0
K2: JB S3, K3
ACALL T10MSD
JB S3, K3
WAIT3:JNB S3, WAIT3
INC S33
MOV A, S33
CJNE A, #1, NXT1
LCALL DP_DIS
NXT1: CJNE A, #2, NXT2
CLR C
MOV A, M2
SUBB A, M1
MOV M1, A
MOV A, H2
SUBB A, H1
MOV H1, A
NXT2: CJNE A, #3, K3
MOV S33, #0
LCALL CP_DIS
K3: JB S4, BK_KEY_MAIN
ACALL T10MSD
JB S4, BK_KEY_MAIN
WAIT4:JNB S4, WAIT4
INC S44
MOV A, S44
CJNE A, #1, NT1
MOV PRICE,DAY_PRICE
LCALL CP_DIS
NT1:CJNE A, #2, NT2
MOV PRICE,NIGHT_PRICE
LCALL CP_DIS
NT2:CJNE A, #3, NT3
MOV PRICE,MIDWAY_PRICE
SETB TR1
LCALL CP_DIS
NT3:CJNE A, #4, BK_KEY_MAIN
MOV S44, #0
LJMP KEY_MAIN
BK_KEY_MAIN: LJMP WA1
KEY_DJ:JB S1, KY1
ACALL T10MSD
JB S1, KY1
WAIT5:JNB S1, WAIT5
INC S11
MOV A, S11
CJNE A, #1, NEXT11
LJMP DAY_P
NEXT11: CJNE A, #2,
NEXT12
LCALL NIG_P
NEXT12:CJNE A, #3, KY1
LCALL MID_P
MOV S11, #0
LJMP KEY_MAIN
KY1:JB S2, KY2
ACALL T10MSD
JB S2, KY2
WAIT6:JNB S2, WAIT6
INC S22
MOV A, S22
CJNE A, #1, NEXT13
LCALL PA_DIS
LJMP KEY_DJ
NEXT13:CJNE A, #2, NEXT14
CLR TR0
LCALL HMS_DIS
LCALL KEY_SJ
NEXT14:CJNE A, #3, KY2
MOV S22, #0
LJMP KEY_MAIN
KY2:AJMP KEY_DJ
KEY_SJ:JB S1, KEY1
ACALL T10MSD
JB S1, KEY1
WAIT7:JNB S1, WAIT7
INC S11
MOV A, S11
CJNE A, #1,NEXT21
LCALL HOU_T
NEXT21:CJNE A, #2,NEXT22
LCALL MIN_T
NEXT22: CJNE A, #3,KEY1
MOV S11, #0
LJMP KEY_MAIN
KEY1: JB S2, KEY2
ACALL T10MSD
JB S2, KEY2
WAIT8:JNB S2, WAIT8
INC S22
MOV A, S22
CJNE A, #1, NEXT23
LCALL PA_DIS
LJMP KEY_DJ
NEXT23:CJNE A, #2, NEXT24
CLR TR0
LCALL HMS_DIS
NEXT24:CJNE A, #3, KEY2
MOV S22,#0
LCALL KEY_SJ
LJMP KEY_MAIN
KEY2:AJMP KEY_SJ
DAY_P:SETB F0
LCALL T100MSD
LCALL T100MSD
MOV LEDDAY_PL, #0AH
MOV LEDDAY_PH, #0AH
LCALL PA_DIS1
LCALL T100MSD
LCALL T100MSD
LCALL PA_DIS
LP1: JB S3, KEY11
MOV A, #1
ADD A, DAY_PRICE
DA A
MOV DAY_PRICE,A
MOV A, DAY_PRICE
CJNE A, #99H, KEY11
MOV DAY_PRICE, #0
KEY11: JB S4, KEY12
LCALL T10MSD
JB S4, KEY12
MOV A,DAY_PRICE
ADD A, #99H
DA A
MOV DAY_PRICE,A
CJNE A, #00H, KEY12
MOV A, #99H
KEY12: JB S1, KEY13
ACALL T10MSD
JB S1, KEY13
WAIT11: JNB S1, WAIT11
INC S11
MOV A, S11
CJNE A, #1,
NEXT31
LCALL DAY_P
NEXT31:CJNE A, #2,NEXT32
LCALL NIG_P
NEXT32:CJNE A, #3,NEXT33
LCALL MID_P
NEXT33:CJNE A, #4, KEY13
MOV S11, #0
KEY13:JB S2, KEY14
LCALL T10MSD
JB S2, KEY14
WAIT12:JNB S2, WAIT12
LJMP KEY_MAIN
KEY14:AJMP DAY_P
NIG_P:SETB F0 ;調用定時延時標志位
LCALL T100MSD
LCALL T100MSD
MOV LEDNIG_PL, #0AH
MOV LEDNIG_PH, #0AH
LCALL PA_DIS1
LCALL T100MSD
LCALL T100MSD
LCALL PA_DIS
JB S3, KEY21
LCALL T10MSD
JB S3, KEY21
MOV A, #1
ADD A, NIGHT_PRICE
DA A
MOV NIGHT_PRICE,A
CJNE A, #99H,KEY21
MOV NIGHT_PRICE,#0
KEY21:JB S4, KEY22
LCALL T10MSD
JB S4, KEY22
MOV A, NIGHT_PRICE
ADD A, #99H
DA A
MOV NIGHT_PRICE,A
CJNE A, #00H, KEY22
MOV NIGHT_PRICE,#99H
KEY22:JB S1, KEY23
ACALL T10MSD
JB S1, KEY23
WAIT15:JNB S1, WAIT15
INC S11
MOV A, S11
CJNE A, #1,
NEXT41
LCALL DAY_P
NEXT41:CJNE A, #2,NEXT42
LCALL NIG_P
NEXT42:CJNE A, #3,NEXT43
LCALL MID_P
NEXT43:CJNE A, #4, KEY23
MOV S11, #0
LJMP KEY_DJ
KEY23:JB S2, KEY24
LCALL T10MSD
JB S2, KEY24
WAIT30:JNB S2, WAIT30
LJMP KEY_MAIN
KEY24: AJMP NIG_P
MID_P: SETB F0 ;調用定時延時標志位
LCALL T100MSD
MOV LEDW_PL, #0AH
MOV LEDW_PH, #0AH
LCALL PA_DIS1
LCALL T100MSD
LCALL PA_DIS
JB S3, KEY31
LCALL T10MSD
JB S3, KEY31
MOV A, MIDWAY_PRICE
ADD A, #1
DA A
MOV MIDWAY_PRICE,A
CJNE A, #99H, KEY31
MOV MIDWAY_PRICE, #00H
CJNE A, #100, KEY31
MOV MIDWAY_PRICE, #0
KEY31: JB S4, KEY32
LCALL T10MSD
JB S4, KEY32
MOV A, MIDWAY_PRICE
ADD A, #99H
DA A
MOV MIDWAY_PRICE,A
CJNE A, #00H, KEY32
MOV NIGHT_PRICE,#99H
KEY32: JB S1, KEY33
ACALL T10MSD
JB S1, KEY33
WAIT18: JNB S1, WAIT18
INC S11
MOV A, S11
CJNE A, #1,
NEXT51
LCALL DAY_P
NEXT51: CJNE A, #2,NEXT52
LCALL NIG_P
NEXT52: CJNE A, #3,NEXT53
LCALL MID_P
NEXT53: CJNE A, #4, KEY33
MOV S11, #0
LJMP KEY_DJ
KEY33: JB S2, KEY34
LCALL T10MSD
JB S2, KEY34
WAIT31:JNB S2, WAIT31
LJMP KEY_MAIN
KEY34: AJMP MID_P
HOU_T: SETB F0 ;調用定時延時標志位
LCALL T100MSD
LCALL T100MSD
MOV LEDHL, #0AH
MOV LEDHH, #0AH
LCALL HMS_DIS1;直接調用顯示,不經過拆分程序
LCALL T100MSD
LCALL T100MSD
MOV SEC, #0
LCALL HMS_DIS
JB S3, KEY41
MOV A, HOUR
ADD A, #1
DA A
MOV HOUR,A
CJNE A, #24H, KEY41
MOV HOUR, #0
KEY41: JB S4, KEY42
MOV A, HOUR
ADD A, #99H
DA A
MOV HOUR,A
CJNE A, #99H, KEY42
MOV HOUR, #23H
KEY42: JB S1, KEY43
ACALL T10MSD
JB S1, KEY43
WAIT21: JNB S1, WAIT21
INC S11
MOV A, S11
CJNE A, #1,NEXT61
LJMP HOU_T
NEXT61: CJNE A, #2,NEXT62
LJMP MIN_T
NEXT62: CJNE A, #3,KEY43
MOV S11, #0
LJMP KEY_SJ
KEY43: JB S2, KEY44
LCALL T10MSD
JB S2, KEY44
WAIT32: JNB S2, WAIT32
LJMP KEY_MAIN
KEY44: AJMP HOU_T
MIN_T: SETB F0 ;調用定時延時標志位
LCALL T100MSD
LCALL T100MSD
MOV LEDML, #0AH
MOV LEDMH, #0AH
LCALL HMS_DIS1;直接調用顯示,不經過拆分程序
LCALL T100MSD
LCALL T100MSD
MOV SEC, #0
LCALL HMS_DIS
JB S3, KEY51
MOV A, MIN
ADD A, #1
DA A
MOV MIN, A
CJNE A, #60H, KEY51
MOV MIN, #0
KEY51: JB S4, KEY52
MOV A, MIN
ADD A, #99H
DA A
MOV MIN, A
CJNE A, #99H, KEY52
MOV MIN, #59H
KEY52: JB S1, KEY53
ACALL T10MSD
JB S1, KEY53
WAIT24: JNB S1, WAIT24
INC S11
MOV A, S11
CJNE A, #1,NEXT71
LCALL HOU_T
NEXT71: CJNE A, #2,NEXT72
LCALL MIN_T
NEXT72: CJNE A, #3,KEY53
SETB TR0
MOV S11, #0
LJMP KEY_SJ
KEY53: JB S2, KEY54
LCALL T10MSD
JB S2, KEY54
WAIT33: JNB S2, WAIT33
LJMP KEY_MAIN
KEY54: AJMP MIN_T
TOTIME: PUSH PSW
PUSH ACC
MOV TH0, #3CH
MOV TL0, #0B0H
INC MS100
MOV A, MS100
CJNE A, #10,RETURN
MOV MS100,#0
MOV A, SEC
ADD A, #1
DA A
MOV SEC,A
CJNE A,#60H,RETURN
MOV SEC,#0
MOV A, #1H
ADD A, MIN
DA A
MOV MIN,A
CJNE A,#60H, RETURN
MOV MIN,#0
MOV A, #1H
ADD A, HOUR
DA A
MOV HOUR,A
CJNE A, #24H,RETURN
MOV HOUR,#0
RETURN: POP ACC
POP PSW
RETI
TO: PUSH PSW
PUSH ACC
MOV A,#1
ADD A,M100
MOV M100,A
MOV A, M100
CJNE A, #100,RETURN1
MOV M100,#0
INC 21H
MOV A,21H
CJNE A, #0AH, RETURN1 ;已經到了1公里
MOV 21H,#0
MOV A, #1
ADD A, DISTANCE
DA A
MOV DISTANCE,A
MOV A, PRICE
ADD A, COUNTL
DA A
MOV COUNTL,A
CJNE A, #10H,RETURN1
MOV COUNTL,#0
MOV A, #1
ADD A, COUNTH
DA A
MOV COUNTH,A
CJNE A, #99H, RETURN1
MOV COUNTH,#0
RETURN1: POP ACC
POP PSW
RETI
TOSTART: PUSH PSW
PUSH ACC
MOV TH1, #3CH
MOV TL1, #0B0H
DJNZ 22H, RETURN2 ;1S未到返回
MOV 22H, #0AH
MOV A, #1
ADD A, 23H
DA A
MOV 23H, A
CJNE A, #60H, RETURN2
MOV 23H, #0
MOV A, #1
ADD A, 24H
DA A
MOV 24H,A
CJNE A, #10H, RETURN2
MOV 24H, #0
MOV A, START_PRICE
ADD A, COUNTL
DA A
MOV COUNTL,A
CJNE A, #10H, RETURN2
MOV COUNTL, #0
MOV A, #1
ADD A, COUNTH
DA A
MOV COUNTH,A
CJNE A, #99H,RETURN2
MOV COUNTH,#0
RETURN2: POP ACC
POP PSW
RETI
HMS_DIS:PUSHACC
PUSHPSW
SETBRS1
MOV R0,#SEC ;時分秒的拆分(三個字節)
MOV R1,#LEDSL
MOV R6,#03H
LOOP1:MOV A, @R0
MOV B, A
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A, B
SWAPA
ANL A, #0FH
MOV @R1,A
DEC R1
DEC R0
DJNZR6,LOOP1
POP PSW
POP ACC
HMS_DIS1: PUSH ACC
PUSH PSW
MOV R7,#06H
MOV R0,#LEDSL
LOOP: MOVA, @R0
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOV SBUF,A
BK: JBCTI,NEXT
SJMPBK
NEXT: DECR0
DJNZR7,LOOP
CLRRS1
POPPSW
POPACC
RET
CP_DIS:PUSH ACC
PUSH PSW
SETB RS1
MOV R0,#COUNTH ;
MOV R1,#LEDCOUNT2
MOV A, @R0
MOV B, A
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A, B
SWAPA
ANL A, #0FH
MOV @R1,A
MOV LEDCOUNT1,COUNTL
MOV A,LEDCOUNT1 ;送總金額低位
MOV DPTR,#TAB
MOVC A, @A+DPTR
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,LEDCOUNT2 ;送總金額中位
MOV DPTR,#TAB
MOVC A,@A+DPTR
CPL ACC.4
MOV SBUF,A
JNB TI, $
CLR TI
MOV A,LEDCOUNT3 ;送總金額高位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOVSBUF,A
JNB TI,$
CLR TI
CLR RS1
MOV SBUF,#0FEH ;送短線(短線的字型碼是0FEH)
JNB TI, $
CLR TI
MOV R0,#PRICE;單價拆分(兩個字節)
MOV R1,#LEDDANJIAL
MOV R6,#03H
MOV A, @R0
MOV B, A
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A, B
SWAPA
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A,LEDDANJIAL ;送單價低位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI, $
CLR TI
MOV A, LEDDANJIAH ;送單價高位
MOV DPTR,#TAB
MOVCA,@A+DPTR
CPL ACC.4
MOV SBUF,A
JNB TI,$
CLR TI
POP PSW
POP ACC
RET
DP_DIS:PUSH ACC
PUSH PSW
SETB RS1
MOV R0,#PRICE ;單價的拆分(一個字節)
MOV R1,#LEDDANJIAL
MOV A, @R0
MOV B, A
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A, B
SWAPA
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A,LEDDANJIAL ;送單價低位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI, $
CLR TI
MOV A,LEDDANJIAH ;送單價高位
MOV DPTR,#TAB
MOVCA,@A+DPTR
CPL ACC.4
MOV SBUF,A
JNB TI,$
CLR TI
MOV SBUF,#0FEH ;
JNB TI, $
CLR TI
MOV SBUF,#0FEH ;送短線
JNB TI,$
CLR TI
MOV R0,#DISTANCE
MOV R1,#LEDDISTANCEL
MOV A, @R0
MOV B, A
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A, B
SWAPA
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A,LEDDISTANCEL ;送路程低位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI, $
CLR TI
MOV A,LEDDISTANCEH ;送路程高位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOVSBUF,A
JNB TI,$
CLR TI
CLR RS1
POP PSW
POP ACC
RET
PA_DIS:PUSH ACC
PUSH PSW
SETB RS1
MOV R0,#DAY_PRICE ;價格調整拆分(三個字節)
MOV R1,#LEDDAY_PL
MOV R6,#03H
LOOP2:MOV A, @R0
MOV B, A
ANL A, #0FH
MOV @R1,A
DEC R1
MOV A, B
SWAPA
ANL A, #0FH
MOV @R1,A
DEC R1
DEC R0
DJNZR6,LOOP2
POP PSW
POP ACC
PA_DIS1:PUSH ACC
PUSH PSW
MOV A,LEDDAY_PL ;白天單價
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI, $
CLR TI
MOV A, LEDDAY_PH
MOV DPTR,#TAB
MOVCA,@A+DPTR
CPL ACC.4
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,LEDNIG_PL ;晚上單價
MOV DPTR,#TAB
MOVCA,@A+DPTR
MOV SBUF,A
JNB TI, $
CLR TI
MOV A,LEDNIG_PH
MOV DPTR,#TAB
MOVC A, @A+DPTR
CPL ACC.4
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,LEDW_PL ;中途等待單價
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SBUF,A
JNB TI, $
CLR TI
MOV A,LEDW_PH
MOV DPTR,#TAB
MOVC A,@A+DPTR
CPL ACC.4
MOVSBUF,A
JNB TI,$
CLR TI
CLR RS1
POP PSW
POP ACC
RET
TAB:DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D1H,10H,90H,0FFH
T10MSD: SETBRS0; 10毫秒延時程序
MOVR4,#12
TM:MOVR3,#128
TM6:DJNZR3,TM6
DJNZR4,TM
CLRRS0
RET
T100MSD: MOV R3, #200
D11: MOV R4, #125
D12: DJNZ R4, D12
DJNZ R3, D11
RET
END
參考文獻
[1]張鑫、華臻、陳書謙.《單片機原理及應用》[M].電子工業出版社,2005.P110~136.
[2]丁元杰、吳大偉.《單片微機實題集與實驗指導書》[M].機械工業出版社, 2004.P124~125.