版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 1 引言</b></p><p> 1.1 出租車計價器發(fā)展背景</p><p> 出租車行業(yè)在我國是八十年代初興起的一項新興行業(yè),隨著我國國民經濟的高速發(fā)展,出租汽車已成為城市公共交通的重要組成部分。多年來國內普遍使用的計價器只具備單一的計量功能。目前全世界的計價器中有90%為臺灣所生產?,F(xiàn)今我國生產計價器的企業(yè)有上百家,主要
2、是集中在北京,上海,沈陽和廣州等地。</p><p> 近年來,我國出租汽車行業(yè)迅猛發(fā)展,出租汽車已經成為我國城市公共交通的重要組成部分和現(xiàn)代化城市必備的基礎設施,成為人們工作、生活中不可缺少的交通工具。出租汽車服務行業(yè)和出租汽車計價器緊密相關,因為出租汽車必須安裝出租汽車計價器才能投入營運。出租汽車計價器是一種能根據(jù)乘客乘坐汽車行駛距離和等候時間的多少進行計價,并直接顯示車費值的計量器具。計價器是出租汽車的經
3、營者和乘坐出租汽車的消費者之間用于公平貿易結算的工具,因而計價器計價準確與否,直接關系到經營者和消費者的經濟利益。依據(jù)國家有關法律、法規(guī),出租汽車計價器是列入國家首批強制檢定的工作計量器具之一,也是近年來國家質量技術監(jiān)督部門強化管理的六類重點計量器具之一。</p><p> 1.2 出租車計價器介紹</p><p> 出租車計價器是出租車營運收費的專用智能化儀表, 隨著電子技術的發(fā)展
4、,出租車計價器技術也在不斷進步和提高。國內出租車計價器已經經歷了4個階段的發(fā)展。從傳統(tǒng)的全部由機械元器件組成的機械式,到半電子式即用電子線路代替部分機械元器件的出租車計價器;再從集成電路式到目前的單片機系統(tǒng)設計的出租車計價器。出租車計價器計費是否準確、出租車司機是否作弊才是乘客最關心的問題,而計價器營運數(shù)據(jù)的管理是否方便才是出租車司機最關注的。因此怎樣設計出一種既能有效防止司機作弊又能方便司機的計價器尤為重要。因此, 本文以單片機AT8
5、9C51為核心設計一款多功能出租車計價器,該計價器能實現(xiàn)按時間和里程綜合計算車價,能顯示時間、里程、單價、總車價等相關信息顯示。它比市場上的一些計價器使用更方便,功能更全,還具有有效防止司機作弊和系統(tǒng)穩(wěn)定性好的優(yōu)點。</p><p> 2 系統(tǒng)整體設計</p><p> 2.1 設計任務及要求</p><p> (1)模擬一個檢測車輪轉動里程的計價系統(tǒng);
6、</p><p> (2)要求具有時鐘和計程計價顯示功能:當啟動鍵被按下時,系統(tǒng)開始計程,同時顯示出起價和每公里單價;在行使過程中,實時顯示已行走的里程數(shù)和當前累計價格;當清除鍵被按下時,計程計價器清零。</p><p> 2.2 方案論證與比較</p><p> 方案一: 采用數(shù)字電路控制,其原理如圖所示。采用傳感器件,輸出脈沖信號,經過放大整形作為移位寄
7、存器的脈沖,實現(xiàn)計價,但是考慮到這種電路過于簡單,性能不夠穩(wěn)定,而且不能調節(jié)單價,也不能根據(jù)天氣調節(jié)計費保準,電路不夠實用。電路框圖如圖2.1所示:</p><p> 圖2.1 數(shù)字電路方案</p><p> 方案二: 出租車驅動輪轉數(shù)與轉軸轉數(shù)的傳動比是一定的,磁感應傳感器會產生一個大約20 ms的低脈沖,可以通過計算磁感應傳感器產生的低脈沖數(shù)來計算出租車跑的里程數(shù)及相應的車費。
8、</p><p> 編碼器的單片機通過一個I/O口來檢測磁感應傳感器信號,當確定為傳感器產生的信號時,就通過另一個I/O口向解碼器的單片機發(fā)送一組編碼,而解碼器的單片機則首先判斷當前準備接收的數(shù)據(jù)是編碼器發(fā)送的編碼還是解碼寫入器發(fā)送的解碼。當判斷是解碼寫入器發(fā)送的解碼時,解碼器的單片機接收此解碼,并利用12C總線協(xié)議將解碼保存到EEPROM中去;當判斷是編碼器發(fā)送的編碼時,解碼器的單片機先接收此編碼,然后讀出自
9、己EEPROM中的解碼,將其與接收到的編碼相比較,如果相同則解碼器單片機通過一個I/0口向計價裝置發(fā)出計價脈沖,否則不發(fā)出計價脈沖。解決了以往計價器計價不準確、使用壽命短等缺點,但此方法通常使干擾信號也能產生計數(shù)脈沖,分立元件過于復雜,電路穩(wěn)定性不好。方案框圖如圖2.2所示:</p><p> 圖2.2 編碼器方案</p><p> 方案三: 采用單片機控制。以單片機為核心,設計上
10、采用89C51單片機為主控器,以A44E霍爾傳感器測距,并采用AT24C02實現(xiàn)在系統(tǒng)掉電的時候保存單價和系統(tǒng)時間等信息,輸出采用lcd1602。利用單片機豐富的I/O端口,及其控制的靈活性,實現(xiàn)基本的里程計價功能和價格調整、時鐘顯示功能。原理結構如圖2.3所示:</p><p> 圖2.3 單片機控制方案</p><p> 本出租車自動計費,上電后顯示最初的起步價,里程計費單價,等待
11、時間計費單價,通過按鍵可以調節(jié)起步價,里程計費單價,等待時間計費單價。同時具有運行,暫停,停止等狀態(tài),可以顯示運行的時間,同時可以顯示暫停的時間,具有累加功能,暫停和運行時間在暫停和運行前一次的狀態(tài)上計時。出租車停止后能夠顯示行駛的總費用。 </p><p> 通過比較以上三種方案,單片機方案有較大的活動空間,不但能實現(xiàn)所有要求的功能而且能在很大的程度上擴展功能,而且還可以方便的對系統(tǒng)進行升級,所以我們采用第三
12、種方案,用AT89C51單片機實現(xiàn)出租車計價的功能。</p><p> 2.3 系統(tǒng)總體設計</p><p> 出租車自動計費器,計費包括起步價、行車里程計費、等待時間計費三部分,用1602液晶 顯示總金額,運行時間,暫停時間,最大值為99.9元,起步價為8.0元,3Km之內起步價計費,超過3Km,每Km2.5元。等待時間單價為每分鐘1.5元,用液晶顯示總里程,同時用液晶顯示等待時間
13、和運行花費時間。</p><p> 費用的計算是按行駛里程收費。設起步價為8.00元。</p><p> 1、當里程<3km時,按起價計算費用</p><p> 2、當里程>3km時,每公里按2.5元計費</p><p> 3、等待累計時間>1min時,按1.5元/min計費</p><p>
14、 該設計以單片機為核心,設計上采用89C51單片機為主控器,以A44E霍爾傳感器測距,并采用AT24C02實現(xiàn)在系統(tǒng)掉電的時候保存單價和系統(tǒng)時間等信息,輸出采用lcd1602。利用單片機豐富的I/O端口,及其控制的靈活性,實現(xiàn)基本的里程計價功能和價格調整、時鐘顯示功能。</p><p> 本設計中由P.3口所接的一個開關代替霍爾傳感器,每摁一下相當于一Km的脈沖。</p><p>
15、3 相關芯片介紹</p><p> 3.1 控制核心芯片AT89C51</p><p> 3.1.1 主要特性</p><p> (1) 與MCS-51系列單片機產品兼容</p><p> ?。?) 4K字節(jié)在系統(tǒng)可編程Flash存儲器(片內具有4K字節(jié)閃速存儲器)</p><p> ?。?) 1000次擦
16、寫周期</p><p> ?。?) 128Bytes的內部RAM單元</p><p> ?。?) 4個8位I/O口,即32位可編程I/O口線</p><p> ?。?) 2個16位定時器/計數(shù)器</p><p><b> ?。?) 6個中斷源</b></p><p> ?。?) 可編程全雙工串行口
17、</p><p> ?。?) 低功耗空閑和掉電模式</p><p> ?。?0) 掉電后中斷可喚醒</p><p> (11) 雙數(shù)據(jù)指針</p><p> ?。?2) 靈活的ISP在線編程功能(字或字節(jié)模式)</p><p> ?。?3) 寬范圍的工作電壓,VCC的允許變化范圍為了2.7~6.0V</p>
18、;<p> ?。?4) 可設置為待機狀態(tài)和掉電狀態(tài)</p><p> ?。?5) 振蕩器及時鐘電路,全靜態(tài)工作方式,時鐘頻率可為0Hz~24MHz。具有全靜態(tài)的工作方式,表明它不一定要求連續(xù)的工作時鐘定時,在等待內部事件期間,時鐘頻率可降至0。</p><p> 3.1.2 AT89C51的管腳結構圖及管腳說明</p><p> VCC:供電電壓。
19、 GND:接地。 P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FLASH編程時,P0 口作為原碼輸入口,當FLASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電
20、流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 </p><p> P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉
21、的緣故。P2口當用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優(yōu)勢,當對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。</p><p> P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平
22、,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 如圖3.2所示:</p><p> 圖3.2 AT89C51管腳結構圖</p><p> P3口也可作為AT89C51的一些特殊功能口,如表3.1所示: P3口管腳 備選功能</p><p> P3.0 RXD(串行輸入口) P3.1 TXD
23、(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(記時器0外部輸入) P3.5 T1(記時器1外部輸入) P3.6 /WR(外部數(shù)據(jù)存儲器寫選通) P3.7 /RD(外部數(shù)據(jù)存儲器讀選通) P3口同時為閃爍編程和編程校驗接收一些控制信號。</p><p> RST:復位輸入。當振蕩器復位器件時,要保持R
24、ST腳兩個機器周期的高電平時間。 ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,M
25、OVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。 /EA/VPP:當EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時
26、,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳</p><p> XTAL2:來自反向振蕩器的輸出。</p><p> 3.2 掉電存儲芯片AT24C02</p><p><b> 3.2.1 概述</b></p><p> 單片機實現(xiàn)的儀器儀表,家用電
27、器,工業(yè)監(jiān)控等系統(tǒng)中,對某些狀態(tài)參數(shù),不僅要求能夠在線修改,而且斷電能保持,以備上電后恢復系統(tǒng)的狀態(tài)。斷電數(shù)據(jù)保護方法可選用具有斷電保護功能的RAM和電可擦存儲器EEPROM。具有斷電保護功能的RAM容量大,速度快,但占用線多,成本高,EEPROM適合數(shù)據(jù)交換量少,對傳送速度要求不高的場合。</p><p> EPROM有并行和串行之分,并行EEPROM速度比串行快,容量大。串行芯片成本低,線路簡單,工作可靠,
28、占用單片機口線資源少。</p><p> AT24CX系列串行EEPROM是目前單片機應用系統(tǒng)中使用較多的EEPROM芯片。其系列串行EEPROM除具有體積小、功耗低、工作電壓有效范圍寬等特點外,還具有型號多,容量大,I2C總線協(xié)議,占用I/O口線少,芯片擴展配置方便靈活,讀/寫操作相對簡單等優(yōu)點。在智能化裝置中,正日益獲得廣泛應用。</p><p> AT24CX系列EEPROM為串
29、行的用電擦除的可編程CMOS只讀存儲器。自定時寫周期包括自動擦除時間不超過10ms,典型時間為5ms。擦除/寫入周期壽命一般都可達到10萬次以上。片內數(shù)據(jù)保存壽命可達410年以上。采用單一電壓+5V,低功耗工作電流1mA,備用狀態(tài)只有10uA,端口為三態(tài)門輸出,與TTL電平兼容。一般商業(yè)品工作溫度為0~+70℃,工業(yè)品為-40~+85℃。這個系列的芯片有8腳DIP(雙列直插)封裝,8腳SOIC(表面貼裝)封裝,一部分型號還有14腳SOI
30、C封裝。</p><p> 目前,我國采用的AT24CX系列串行芯片EEPROM主要是由ATMEL,MICROCHIP,XICOR,NATIONAL等幾家公司提供。下面以ATMEL公司的產品進行說明。</p><p> 3.2.2 AT24C02介紹</p><p> AT24C02系列串行EEPROM引腳、容量及結構</p><p>
31、 目前我國應用最多的封裝形式是8腳封裝,如圖3.3所示:</p><p> 圖3.3 AT24C02型號和引腳</p><p> AT24C02的EEPROM的引腳說明如下:</p><p> (1)SCL—串行時鐘端,用于對輸入和輸出數(shù)據(jù)的同步。寫入串行EEPROM的數(shù)據(jù)用SCL上升沿同步,輸出數(shù)據(jù)用下降沿同步</p><p>
32、 (2)SDA—串行數(shù)據(jù)輸入/輸出端,漏極開路結構。</p><p> 使用時該引腳必須接一個5.1KΩ左右的上拉電阻。SDA線上數(shù)據(jù)傳送順序是高位在先,低位在后。</p><p> (3)WP—寫保護,用于硬件數(shù)據(jù)保護功能。</p><p> 當該引腳接地時,可以對整個存儲器進行正常讀/寫操作;當其接電源Vcc時,芯片就具有寫保護功能,被保護的區(qū)域因型號而異
33、。被保護部分的讀操作不受影響,實際上這時被保護的區(qū)域就可以作為串行只讀存儲器。英注意,對AT24C08芯片,雖然第7腳也定義為WP,但實際不起作用。</p><p> A0,A1,A2—片選或以頁面選擇地址輸入,用于EEPROM器件地址編碼。</p><p> 將這3個引腳配置成不同的編碼值,可選中不同的芯片。在同一串行總線上最多可擴充8片同一容量或不同容量的芯片。但注意,有些型號的地
34、址是無效的。例如,AT24C16所對應的3個引腳均無效,因此使用AT24C16時只能尋址1片,同樣,使用AT24C04時刻尋址4片;使用AT24C08可尋址2片。</p><p> (4)TEST—測試,用于對存儲器的檢測。</p><p> (5)Vcc—電源電壓+5V。</p><p> (6)GND—接地端。</p><p>
35、(7)NC—未連接。</p><p> ATC24C02是目前最常用的型號,支持器件地址編碼,統(tǒng)一串行總線最多時可同時連接1~8片,支持硬件設置數(shù)據(jù)保護。</p><p><b> 1602液晶的簡介</b></p><p> 字符型液晶1602主要技術參數(shù)如表3-1所示:</p><p> 表3-1 字符型液晶
36、1602主要技術參數(shù)</p><p> 接口信號說明如表3-2所示:</p><p> 表3-2 1602接口信號說明</p><p> 控制器接口說明(HD44780及兼容芯片)</p><p><b> 1、 基本操作時序</b></p><p> a 讀狀態(tài):輸入:Rs=L, R
37、w=H, E=H 輸出:D0—D7=狀態(tài)字</p><p> b 寫指令:輸入:Rs=L, Rw=L, D0—D7=指令碼 輸出:無</p><p><b> E=高脈沖</b></p><p> C 讀數(shù)據(jù):輸入:Rs=H, Rw=L, E=H 輸出:D0—D7=數(shù)據(jù)</p>
38、<p> d 寫數(shù)據(jù):輸入:Rs=H, Rw=L, D0—D7=數(shù)據(jù) 輸出:無</p><p><b> E=高脈沖</b></p><p> 狀態(tài)字說明如表3-3所示:</p><p> 表3-3狀態(tài)字說明(a)</p><p> 表3-4 狀態(tài)字說明(b)</p><
39、;p> 注:對控制器進行讀寫操作之前,都必須進行讀寫檢測,確保STA7為0</p><p><b> RAM地址映射圖</b></p><p> 控制器內部帶有80*8位的RAM緩沖區(qū),對應關系如下圖2-5所示:</p><p> 表3-5 RAM地址映射圖LCD16字*2行</p><p> 顯示模式設
40、置如表3-6所示:</p><p> 表2-6 顯示模式設置</p><p> 顯示開關及光標設置如表3-7所示:</p><p> 表3-7 顯示開關及光標設置</p><p> 控制器內部沒有一個數(shù)據(jù)地址指針,用戶可通過它們來訪問內部的全部80字節(jié)RAM。</p><p><b> 系統(tǒng)硬件設計
41、</b></p><p> 車輪轉動里程檢測電路模塊</p><p> 霍爾傳感器是一種磁傳感器。用它們可以檢測磁場及其變化,可在各種與磁場有關的場合使用?;魻柶骷曰魻栃獮槠涔ぷ骰A?;魻柶骷性S多優(yōu)點,它們的結構牢固,體積小,重量輕,壽命長,安裝方便,功耗小,頻率高(可達1MHZ),耐震動,不怕灰塵、油污、水汽及鹽霧等的污染或腐蝕。</p><p&
42、gt; 本設計采用霍爾傳感器A44E,用它來檢測車輪信號,送到單片機中,經處理計算后,送給顯示單元,原理圖如圖4.1所示:</p><p> 圖4.1 傳感器測距示意圖</p><p><b> 電路圖如下所示:</b></p><p> 圖4.2 里程檢測電路連接圖</p><p> 4.2 系統(tǒng)總原理圖
43、</p><p> 圖4.3 系統(tǒng)原理圖</p><p><b> 仿真結果</b></p><p><b> 計價器開始運行前</b></p><p><b> 計價器開始運行</b></p><p> 運行6Km后的顯示情況</p&
44、gt;<p><b> 等待29s顯示情況</b></p><p><b> 致謝</b></p><p> 在本次設計中,我們采用AT89C51芯片為核心器件,設計出了簡單的出租車計價器,能夠實現(xiàn)顯示總金額和總里程,按鍵控制清零,調價。</p><p> 選題后,我便開始復習單片機方面的知識,也查閱
45、、搜索了很多相關資料,進行總體設計與具體設計,同時也學習仿真軟件Protues和編程軟件KeiC。由于以前都采用匯編語言實現(xiàn)編程,對用C語言來實現(xiàn)單片機的編程不太習慣,花費了一些時間來熟悉C語言的編程。在設計開始,要形成流程圖,它可以使設計有一定的邏輯性與嚴密性,使得設計思路明確。采用模塊化的設計思想很重要,它方便編寫、修改與調試,另外加上必要的注釋,便于交流與理解。</p><p> 這次畢業(yè)設計完成后,體會
46、頗多,在學與做的過程中,取長補短,不斷學習新的知識,吸取經驗,達到進步的目的。通過自身的努力以及相關圖書資料的幫助,逐漸熟悉了KEIL、PROTEUS和C語言等軟件的使用以及硬件檢測過程中的一些小技巧。本次設計我學習到不少單片機的知識,但由于自己的理論知識水平有限,實踐知識和設計經驗不足,在設計過程中難免存在一些問題。懇請各位老師批評指正,以使我在以后的學習和實踐中加以改進和提高。</p><p><b&g
47、t; 參考文獻</b></p><p> [1] 李順增. 微機原理與接口技術[M]. 北京:機械工業(yè)出版社出版社,2005</p><p> [2] 顧德英. 計算機控制技術[M]. 北京:北京郵電大學出版社,2007</p><p> [3] 韓志軍,沈晉源,王振波.單片機應用系統(tǒng)設計[M].北京:機械工業(yè)出版社,1998</p>
48、<p> [4] 楊忠煌,黃博俊,李文昌. 單芯片8051實務與應用[M]. 北京:中國水利水電出版社,2001</p><p> [5] 畢滿清. 模擬電子技術[M]. 北京:電子工業(yè)出版社,2008</p><p> [6] 閻石. 數(shù)字電子技術基礎[M]. 北京:高等教育出版社,2007</p><p><b> 附:程序源代碼
49、</b></p><p> #include<reg52.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int </p><p> //***********************************</
50、p><p> int kk=0;//路程標志位</p><p> int dj=1;//路程單價 </p><p> //************************************</p><p> sbit rw=P2^1;//讀或寫</p><p> sbit rs=P2^0;//</
51、p><p> sbit en=P2^2;//讀寫時能控制端</p><p> sbit b=P0^7;//液晶判斷忙標志位</p><p> void lcd_init();//</p><p> void wr_com(uchar command);//液晶寫命令</p><p> void wr_data(u
52、char data0);//寫數(shù)據(jù)</p><p> void lcd_clear();//液晶清屏</p><p> void lcd_set();//設置液晶的起始位置</p><p> void busy();//液晶判忙函數(shù)</p><p> void display();//顯示</p><p>
53、void printstring(uchar *s);//直接寫字符</p><p> void display1();</p><p> void key1();</p><p> sbit K0=P1^0;</p><p> sbit K1=P1^1;</p><p> sbit K2=P1^2;<
54、/p><p> sbit K3=P1^3;</p><p> sbit K4=P3^4;</p><p> sbit led_run=P1^4;</p><p> sbit led_await=P1^5;</p><p> sbit led_stop=P1^6;</p><p> bit
55、 f_start;//開始標志位</p><p> bit jump_in;//跳入開始標志位</p><p> bit jump_out;//跳出標志位</p><p> void key();</p><p> uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
56、0x38,0x39,0x70};//字符1,2,3,,,,,0</p><p> uchar dispbuf[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};</p><p> uchar dispbuf1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};</p><p> uchar v,v1;//按鍵次數(shù)累加變量&l
57、t;/p><p><b> uchar i;</b></p><p> void init();//</p><p> void chuli();//</p><p> void chuli1();//</p><p> void delay(uchar t);//</p>&
58、lt;p> void clear();//</p><p> void set(uchar x);//</p><p> void set1(uchar y);//</p><p> uchar command;//</p><p> uchar count,count1;//</p><p> uc
59、har second,minite,second1,minite1;//</p><p> unsigned int tt,tt1;//</p><p> unsigned char value1=80,value2=25,value3=15;//起始價,運行價,等待價</p><p> unsigned int money;//金額變量</p>
60、<p> //*******************************************</p><p> void delay(uchar t)</p><p><b> {</b></p><p> while(--t);</p><p><b> }</b>&
61、lt;/p><p> //*******************************************</p><p> //*****************************************************</p><p> sbit SCL=P3^0; //IIC引腳*********掉電存儲
62、</p><p> sbit SDA=P3^1;</p><p> void start() //IIC開始位</p><p> { SDA = 1;</p><p><b> SCL = 1;</b></p><p><b> de
63、lay();</b></p><p><b> SDA = 0;</b></p><p><b> delay();</b></p><p><b> }</b></p><p> void stop() // IIC停止位
64、</p><p><b> {</b></p><p><b> SDA = 0;</b></p><p><b> delay();</b></p><p><b> SCL = 1;</b></p><p><b&
65、gt; delay();</b></p><p><b> SDA = 1;</b></p><p><b> }</b></p><p> void respons() //IIC應答位</p><p><b> {</
66、b></p><p><b> uchar i;</b></p><p><b> SCL=1;</b></p><p><b> delay();</b></p><p> while((SDA==1)&&(i<250))</p>
67、;<p><b> i++;</b></p><p><b> SCL=0;</b></p><p><b> delay();</b></p><p><b> }</b></p><p> void init1()</p&
68、gt;<p><b> {</b></p><p><b> SDA=1;</b></p><p><b> delay();</b></p><p><b> SCL=1;</b></p><p><b> delay(
69、);</b></p><p><b> }</b></p><p> uchar read_byte() // 從EEPROM讀到MCU</p><p><b> {</b></p><p> uchar i,j;</p><
70、;p> for(i=0;i<8;i++)</p><p><b> {</b></p><p><b> SCL=1;</b></p><p><b> j<<=1;</b></p><p><b> j|=SDA;</b>
71、;</p><p><b> SCL=0;</b></p><p><b> }</b></p><p> return(j);</p><p><b> }</b></p><p> void write_byte(uchar date)
72、 // 從MCU寫到EEPROM</p><p><b> {</b></p><p> uchar i,temp;</p><p> temp=date;</p><p> for(i=0;i<8;i++)</p><p><b> {</b&g
73、t;</p><p> temp=temp<<1;</p><p><b> SCL=0;</b></p><p><b> delay();</b></p><p><b> SDA=CY;</b></p><p><b>
74、; delay();</b></p><p><b> SCL=1;</b></p><p><b> delay();</b></p><p><b> }</b></p><p><b> SCL=0;</b></p>
75、<p><b> delay();</b></p><p><b> SDA=1;</b></p><p><b> delay();</b></p><p><b> }</b></p><p> void write_data(
76、uchar addr, uchar date) // 在指定地址addr處寫入數(shù)據(jù)date</p><p><b> {</b></p><p><b> start();</b></p><p> write_byte(0xa0);</p><p> respons();&
77、lt;/p><p> write_byte(addr);</p><p> respons();</p><p> write_byte(date);</p><p> respons();</p><p><b> stop();</b></p><p><b
78、> }</b></p><p> uchar read_data(uchar addr) // 在指定地址addr讀取數(shù)據(jù)</p><p><b> {</b></p><p> uchar date;</p><p><b> start();&
79、lt;/b></p><p> write_byte(0xa0);</p><p> respons();</p><p> write_byte(addr);</p><p> respons();</p><p><b> start();</b></p><
80、;p> write_byte(0xa1);</p><p> respons();</p><p> date=read_byte();</p><p><b> stop();</b></p><p> return date;</p><p><b> }</
81、b></p><p> //***************************************************</p><p> //*******************************************</p><p> void main()</p><p><b> {<
82、/b></p><p><b> init();</b></p><p> lcd_init();</p><p><b> while(1)</b></p><p><b> { </b></p><p><b> key1(
83、);</b></p><p><b> chuli();</b></p><p> display();</p><p> if(jump_in==1)</p><p><b> {</b></p><p> jump_in=0;</p>
84、<p> lcd_init();</p><p><b> while(1)</b></p><p><b> {</b></p><p><b> key();</b></p><p><b> chuli1();</b></p
85、><p> display1();</p><p> if(jump_out==1) </p><p><b> {</b></p><p> lcd_init();</p><p> jump_out=0;</p><p><b> clear();&l
86、t;/b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
87、t;/b></p><p><b> }</b></p><p> //*******************************************</p><p> void clear()//跳出下一次</p><p><b> {</b></p><
88、p><b> TR0=0;</b></p><p><b> TR1=0;</b></p><p><b> money=0;</b></p><p><b> second=0;</b></p><p> second1=0;</p
89、><p><b> minite=0;</b></p><p> minite1=0;</p><p> value1=80;</p><p> value2=25;</p><p> value3=15;</p><p> led_run=1;</p>
90、<p> led_await=1;</p><p> led_stop=1;</p><p><b> v=0;</b></p><p><b> v1=0;</b></p><p> for(i=0;i<15;i++)</p><p><
91、b> {</b></p><p> dispbuf[i]=0;</p><p> dispbuf1[i]=0;</p><p><b> }</b></p><p><b> }</b></p><p> //******************
92、*************************</p><p> void init()//定時器初始化</p><p><b> {</b></p><p> TMOD=0x11;</p><p> TH0=(65536-50000)/256;</p><p> TL0=(6553
93、6-50000)%256;</p><p> TH1=(65536-50000)/256;</p><p> TL1=(65536-50000)%256;</p><p><b> ET0=1;</b></p><p><b> ET1=1;</b></p><p>
94、<b> EA=1;</b></p><p><b> TR0=0;</b></p><p><b> TR1=0;</b></p><p><b> }</b></p><p> //******************************
95、*************</p><p> void t0_(void) interrupt 1 using 0//定時器0中斷</p><p><b> {</b></p><p><b> count++;</b></p><p> if(count==20)</p>&
96、lt;p><b> {</b></p><p><b> count=0;</b></p><p><b> second++;</b></p><p> if(second==60)</p><p><b> {</b></p>
97、;<p><b> second=0;</b></p><p><b> minite++;</b></p><p> if(minite==99)</p><p><b> {</b></p><p><b> minite=0;</b
98、></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%2
99、56;</p><p> dispbuf1[0]=minite/10;</p><p> dispbuf1[1]=minite%10;</p><p> dispbuf1[2]=second/10;</p><p> dispbuf1[3]=second%10;</p><p><b> }<
100、/b></p><p> //*******************************************</p><p> void t1_(void) interrupt 3 using 3//定時器1中斷</p><p><b> {</b></p><p><b> count1
101、++;</b></p><p> if(count1==20)</p><p><b> {</b></p><p><b> count1=0;</b></p><p> second1++;</p><p> if(second1==60)</
102、p><p><b> {</b></p><p> second1=0;</p><p> minite1++;</p><p> if(minite1==99)</p><p><b> {</b></p><p> minite1=0;&l
103、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> TH1=(65536-50000)/256;</p><p> TL1=(65536-50000)%256;<
104、;/p><p> dispbuf1[4]=minite1/10;</p><p> dispbuf1[5]=minite1%10;</p><p> dispbuf1[6]=second1/10;</p><p> dispbuf1[7]=second1%10;</p><p><b> }</b
105、></p><p> //*******************************************</p><p> void lcd_init()//液晶初始化</p><p><b> {</b></p><p> wr_com(0x3c);</p><p> w
106、r_com(0x06);</p><p> wr_com(0x0c);</p><p> wr_com(0x01);</p><p><b> }</b></p><p> //*******************************************</p><p> vo
107、id wr_com(uchar command)//液晶寫命令</p><p><b> {</b></p><p><b> busy();</b></p><p><b> rs=0;</b></p><p><b> rw=0;</b><
108、;/p><p> P0=command;</p><p><b> en=1;</b></p><p><b> en=0;</b></p><p><b> }</b></p><p> //***************************
109、****************</p><p> void wr_data(uchar data0)//液晶寫數(shù)據(jù)</p><p><b> {</b></p><p><b> busy();</b></p><p><b> rs=1;</b></p>
110、<p><b> rw=0;</b></p><p><b> P0=data0;</b></p><p><b> en=1;</b></p><p><b> en=0;</b></p><p><b> }</
111、b></p><p> //*******************************************</p><p> void busy()//液晶判忙</p><p><b> {</b></p><p><b> while(1)</b></p>&l
112、t;p><b> {</b></p><p><b> en=0;</b></p><p><b> rs=0;</b></p><p><b> rw=1;</b></p><p> P0=0xff;
113、 </p><p><b> en=1;</b></p><p> if(b!=1)break;</p><p><b> }</b></p>
114、;<p><b> en=0;</b></p><p><b> }</b></p><p> //*******************************************</p><p> void chuli()//數(shù)值處理</p><p><b>
115、 {</b></p><p> dispbuf[0]=value1/100%10;</p><p> dispbuf[1]=value1/10%10;</p><p> dispbuf[2]=value1%10;</p><p> dispbuf[3]=value2/100%10;</p><p>
116、; dispbuf[4]=value2/10%10;</p><p> dispbuf[5]=value2%10;</p><p> dispbuf[6]=value3/100%10;</p><p> dispbuf[7]=value3/10%10;</p><p> dispbuf[8]=value3%10;</p>
117、<p><b> }</b></p><p> //*******************************************</p><p> void display()</p><p><b> {</b></p><p><b> set(0);
118、</b></p><p> printstring("s:");</p><p> wr_data(table[dispbuf[0]]);</p><p> wr_data(table[dispbuf[1]]);</p><p> printstring(".");</p>
119、;<p> wr_data(table[dispbuf[2]]);</p><p><b> set(8);</b></p><p> printstring("m:");</p><p> wr_data(table[dispbuf[3]]);</p><p> wr_dat
120、a(table[dispbuf[4]]);</p><p> printstring(".");</p><p> wr_data(table[dispbuf[5]]);</p><p><b> set1(0);</b></p><p> printstring("a:"
121、);</p><p> wr_data(table[dispbuf[6]]);</p><p> wr_data(table[dispbuf[7]]);</p><p> printstring(".");</p><p> wr_data(table[dispbuf[8]]);</p><p&
122、gt;<b> }</b></p><p> //*******************************************</p><p> void chuli1()</p><p><b> {</b></p><p> if(f_start==1)</p>
123、<p><b> {</b></p><p> if(kk<=3)//計價方案</p><p> {money=80;//起步價8元</p><p><b> kk=3;</b></p><p><b> }</b></p><p
124、> else if(kk>3 && kk<=35)</p><p><b> {</b></p><p> money=80+dj*(kk-3)+1;</p><p><b> }</b></p><p> else if(kk>35&&am
125、p;kk<900) </p><p><b> {</b></p><p> money=80+2*dj*(kk-2)+1;</p><p><b> }</b></p><p> dispbuf1[0]=kk/10;//路程十位</p><p> disp
126、buf1[1]=kk%10;//路程個位</p><p> //***************************************</p><p> tt=minite*60+second;//總時間</p><p> tt1=minite1;//等待時間</p><p> money=value1+value2*0.1*
127、tt+value3*tt1;//起始價+每公里價*時間*速度+等待價*等待時間</p><p> //*************************</p><p><b> }</b></p><p> else if(f_start==0)</p><p><b> {</b><
128、;/p><p><b> money=0;</b></p><p><b> }</b></p><p> dispbuf1[8]=money/100%10;//</p><p> dispbuf1[9]=money/10%10;//</p><p> dispbuf1
129、[10]=money%10;//</p><p><b> }</b></p><p> //******************************************</p><p> void display1()</p><p><b> {</b></p>&
130、lt;p><b> set(0);</b></p><p> printstring("run: ");</p><p> wr_data(table[dispbuf1[0]]);</p><p> wr_data(table[dispbuf1[1]]);</p><p><b&g
131、t; set(8);</b></p><p> printstring("a:");</p><p> wr_data(table[dispbuf1[4]]);</p><p> wr_data(table[dispbuf1[5]]);</p><p> printstring(":&quo
132、t;);</p><p> wr_data(table[dispbuf1[6]]);</p><p> wr_data(table[dispbuf1[7]]);</p><p><b> set1(0);</b></p><p> printstring("sum: ");</p>
133、<p> wr_data(table[dispbuf1[8]]);</p><p> wr_data(table[dispbuf1[9]]);</p><p> printstring(".");</p><p> wr_data(table[dispbuf1[10]]);</p><p><b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論