出租車計費器設計-電子信息工程本科畢業論文_第1頁
出租車計費器設計-電子信息工程本科畢業論文_第2頁
出租車計費器設計-電子信息工程本科畢業論文_第3頁
出租車計費器設計-電子信息工程本科畢業論文_第4頁
出租車計費器設計-電子信息工程本科畢業論文_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 本科生畢業設計報告系(院) 物理與電子工程學院 專 業 電子信息工程 論文題目 出租車計費器的設計 學生姓名 指導教師 (姓名及職稱)班 級 2012級電信4班 學 號 完成日期:2016年4月出租車計費器的設計xxx物理與電子工程學院 電子信息工程 xxxxx摘要本設計主要是針對城市出租車運營而設計的一款智能收費系統。是以單片機STC89C52RC為核心,通過光電傳感器來累加車輪旋轉的圈數和算法來計算出行駛的路程,并根據相應的收費標準計算出應當收取的費用;以LCD12864液晶顯示屏來顯示路程、單價、行駛的時間和消費金額等信息;利用SYN6288語音模塊在一些特定的時候進行語音播報提示。本

2、設計還可以根據用戶的自身情況對收費的標準進行調整。關鍵詞出租車計費器 SYN6288 LCD12864 光電傳感器 1 前言1.1 設計背景在國民經濟的快速發展下,城市的交通治安逐漸變得整齊有序,出租車計價器在城市的交通中也得到廣泛的使用。雖然私家車擁有的數量在逐漸的增長,但是出租車依然是城市交通運輸乘客的重要角色。出租車計價器是出租車上統計路程及時間和通過收費標準計算消費金額的儀表儀器,是出租車上必不可少的部分,它是負責計算出租車營運收費的專用智能儀表。不管是消費的乘客還是出租車的司機都要求計價器在性能方面能夠穩定、計價準確而且在它的功能方面也要求越來越高。有史以來,在城市出租車已經成為人們

3、工作、生活中不可缺少的交通工具。出租車計價器是一種能根據乘客乘坐出租車行駛的路程和收費的方式計算出乘客消費的金額并直接顯示車費值的計量工具。出租車計價器是出租車上結算消費金額的計算工具,所以計價器計價準確與否,直接關系到雙方的經濟利益。1.2 設計目的和意義大力提高城市安全文明的建設是當前城市建設的主要內容之一,隨著人們生活水平的不斷提高,人們對各種工具的功能要求也越來越高。就出租車收費器而言,人們對它的功能要求也是逐漸的增加,雖然它的功能在趨于完善,但任然有很多可以改進的地方。本次的設計選用的主要元件是單片機,不僅是為了完成設計的要求和各功能的實現,更是為了檢驗我們對所學知識的應用能力以及我

4、們解決問題的能力。2 任務的提出與方案論證2.1 設計要求 1、能對出租車行駛的路程進行統計并顯示; 2、能根據行駛的路程和相應的收費標準計算出消費的金額; 3、具有計時的功能; 4、在一些特定的時候,有語音提醒播報的功能; 5、有按鍵控制的功能。2.2 方案選擇控制芯片的選擇:方案一:采用單片機控制,利用單片機控制的靈活性以及豐富的IO端口,不僅能實現基本的計程和價格實現,還能實現計時、和語音提醒播報的功能。方案二:采用數字電路控制,通過傳感器輸出脈沖信號,進過放大整形作為位移寄存器的脈沖信號,實現計價,但這種電路能實現的功能比較單一、簡單,已經不能滿足現在出租車的使用。在上述兩種方案中,很

5、明顯方案一的適用能力要比方案二強,方案一能實現的功能也多余方案二,故選用第一種方案。傳感器的選擇:方案一:霍爾傳感器,霍爾傳感器的測速靈敏度比較高,有使用方便、價格便宜等優點,很適合汽車測速等應用場合。方案二:光電傳感器,光電傳感器工作比較穩定,使用方便、價格便宜,很適合用在統計數量、自動開關等方面。以上兩種傳感器都是汽車測速原件的很好選擇,由于我對光電傳感器工作原理的了解比較了解,而對霍爾傳感器原件的工作原理不是很了解,所以本次我選擇了光電傳感器。顯示電路的選擇:方案一:采用數碼管顯示,采用數碼管顯示它需要幾段才能顯示一個信息,此次設計的顯示信息量有點偏大,若采用數碼管顯示電路,則加大了硬件

6、電路的連接。方案二:采用液晶LCD1602顯示,LCD1602只能顯示兩行的信息,適用于信息量顯示不大的場合,而且只能顯示字符不能顯示漢字,所以在此次設計中不易使用。方案三:采用液晶LCD12864顯示,LCD12864可以顯示四行信息,它不僅能顯示字符,還能顯示漢字。綜合以上三種顯示電路的特點和結合此次設計的需求,覺得LCD12864更能適用于本次設計,故選擇方案三。2.3 總體方案設計此次設計的總體方案規劃如下:在整個控制系統中以單片機STC89C52RC為核心。光電傳感器在電機的作用下產生信號脈沖,并將脈沖信號傳送給主控芯片單片機,單片機通過一系列的計算和處理后將要顯示的信息送給液晶LC

7、D12864顯示出來,將要播報的語音信號發送給SYN6288語音模塊進行播報;此外,單片機還受按鍵的控制,其目的是方便人們對整個系統進行選擇和操作控制。整個系統的電路框圖如圖2.1所示。圖2.1 整個系統電路框圖3 系統電路設計 3.1 主控模塊電路本次的設計中單片機STC89C52RC為主控芯片,是整個設計中的核心元件。它在電子行業的市場上已成為大眾化器件,它與51單片機完全兼容。我們在使用的時候可以多次下載修改的程序,大大的提高了芯片的使用率,所以在很多簡單的設計中,人們都選擇采用單片機。其目的就是價格便宜,使用靈活。STC89C52RC單片機同一般的單片機芯片一樣,在工作和燒寫程序的時候

8、必需要外接最小系統。最小系統包括晶振電路、復位電路和電源電路,它們是單片機能否正常工作的最基本條件。單片機最小系統電路圖如圖3.1所示。圖3.1 單片機最小系統電路圖3.2 光電傳感器模塊本次設計在測量路程的過程中選用的是光電測速傳感器模塊(寬槽板),它的外形如圖3.2所示。圖3.2 光電傳感器模塊外形用途:主要廣泛的應用于電機轉速檢測、脈沖計數、位置閑位、開關控制等方面。工作原理:此次選用的光電傳感器內部主要由指示燈電路、光耦傳感器、寬電壓LM393比較器輸出電路組成。當光耦傳感器槽中無遮擋時,接收管導通,模塊OUT輸出低電平(輸出0狀態),此時指示燈會處于點亮狀態;當光耦傳感器槽中有遮擋時

9、,接收管截止,模塊OUT輸出高電平(輸出1狀態),此時指示燈會處于熄滅狀態。引腳連接:此模塊有三個引腳,他們分別是VCC、GND、OUT,其連接方式是:VCC接電源正極3.35V;GND接電源的負極;OUT 為TTL開關輸出端,本次我采用的是外部中斷1的連接方式,因此我將OUT腳接到單片機的13腳(即P33/腳)。電路的連接方式如圖3.3所示。圖3.3 光電傳感器工作原理圖3.3 SYN6288語音模塊SYN6288語音模塊屬于中文語音合成模塊電路,是北京宇音天下科技公司于2010年初推出的一款性價比高、音質清晰、自然的語音合成芯片。它的外形如圖3.4所示。圖3.4 SYN6288語音模塊外形

10、SYN6288語音模塊的應用領域很廣,其中在公交報站器、銀行叫號機、自動售貨機、語音電子書等方面得到廣泛的應用。此模塊采用的是串口通信接收數據的方式,支持三種通信波特率:9600bps、19200bps、38400bps。在使用SYN6288語音模塊的時候,外部電路的連接方式很簡單,它有兩組端口,一組是外接喇叭負載的端口,接入的喇叭規格為8歐0.5瓦,在接線的時候沒有正負之分,還有一組有5個引腳構成,分別是VDD、RXD、TXD、GND、BY,其中VDD和GND分別接電源的正極和負極;而RXD、TXD與單片機上的串口腳RXD(P3.0)和TXD(P3.1)交叉相連;最后的一個引腳BY為檢測是否

11、為忙碌狀態,當BY為低電平時,說明模塊處于空閑狀態、為高電平時模塊處于忙碌狀態,此引腳可以選擇性的接單片機的IO口,也可以不接。此模塊電路的電路連接圖如圖3.5所示。圖3.5 語音模塊電路連接圖3.4 顯示模塊電路設計中采用的LCD12864有20個引腳,其中DB0DB7是接受數據的并口,我采用的是與單片機的P0口相接,但P0口的驅動能力不夠強,所以必須外接上拉電阻;除此以外還有幾個控制腳,它們的功能和作用分別是:RS:當液晶采用并行連接方式時為指令/數據選擇信號,當液晶采用串行連接方式時為片選信號控制端。R/W:當液晶采用并行連接方式時為讀寫控制腳,即當R/W = 0時,液晶處于寫狀態,當R

12、/W = 1時,液晶處于讀狀態;當液晶采用串口連接方式時為數據傳送口。E:當液晶采用并行連接方式時為使能控制端,當液晶采用串行連接方式時為同步時鐘控制端。PSB:串并口方式控制,PSB = 0為串口方式,PSB = 1為并口方式。RST:復位端,低電平有效。BLA:背光源正極,可直接接+5V電源。BLK:背光源負極,可直接接地。VCC:電源正極,接+5V電源。GND:電源負極,接地。除此以外的其它三個引腳對本次的電路沒有特別的影響,所以可以選擇不接,根據以上對各引腳的了解和為了方便電路板布線,所以本次的顯示電路的連接方式為如圖3.6所示。圖3.6 LCD12864顯示電路連接圖3.5 按鍵控制

13、電路任何一個系統電路都需要有按鍵控制電路,其主要目的是方便人們控制操作、修改設置等,此次在我的設計中,也需要有按鍵控制電路,方便出租車司機在使用的時候進行操作控制和一些簡單的設置。在這次的電路中初步用六個按鍵(不包括電源按鍵),它們分別是開始按鍵、暫停按鍵、結束按鍵、設置按鍵、調節按鍵兩個。電路的連接方式采用將每一個按鈕開關與單片機的P1口的每一個引腳相連接,然后另一端公共接地。電路的連接如圖3.7所示。圖3.7 按鍵控制電路圖3.6 系統的總體電路此次設計的電路總共分為5部分,它們分別是以上介紹的單片機最小系統、光電傳感器測速電路、12864液晶信息顯示電路、按鍵控制系統電路、SYN6288

14、語音播報電路。在整個系統電路中,這五部分電路是主要以單片機來協調、控制工作的,單片機也是整個電路的核心原件,整個硬件的系統電路如圖3.8所示。圖3.8 系統電路原理圖4 系統程序設計硬件電路的連接是為了支持軟件程序的運行,所以在編寫軟件程序的時候軟件一般都要參照硬件電路編寫,不能盲目的去寫,如若不然我們編寫的程序將無法在我們的電路板上運行;所以編寫的程序必須與硬件電路相互兼容,才能實現出我們預期的效果。4.1 計時中斷程序設計設計中的計時功能是采用的單片機內部的定時/計數器T0進行計數,當計數達到溢出時產生中斷,通過執行中斷函數而實現計時。要開啟定時/計數器T0,首先要對與之相關的幾個寄存器進

15、行設置。對寄存器的設置程序需要放在主程序的一開始,以便于程序在運行的時候一開始就可以開啟中斷,進行計時。開啟定時/計數器T0主要涉及到以下幾個寄存器的設置:方式寄存器TMOD的設置,它的格式如表4.1所示。定時/計數器T0只與TMOD寄存器的第四位有關,如果我們的設計與定時/計數器T1無關的話,我們可以忽略高四位。此次我選用的是方式1工作模式,所以我們要將M1、M0兩位賦值為01;是定時或計數方式的選擇位,這里選用的是定時方式,所以給位賦值0;對于GATE是啟動方式位,直接賦值0,表示由軟件啟動定時器。表4.1 方式寄存器TMODD7D6D5D4D3D2D1D0-GATEM1M0定時/計數器T

16、0的初值設置,定時/計數器T0由特殊寄存器TH0和TL0組成,此次我們需要以1s為單位來計算時間,但是1s的時間太長,單片機的定時器采用方式1最長也只能定時65536us,所以采用定時50ms,中斷20次來獲得1s的時間;由此可以計算出初值為65536-50000=15536;所以給T0的初值應該為15536;TH0賦值高8位:15536右移8位,TL0賦值為低8位:15536與上255。由于T0工作在方式1,不具有自動重裝初值的功能,所以在每次中斷發生以后都需要在中斷程序里利用程序給TH0和TL0重新賦初值。另外與T0中斷有關的、需要設置的寄存器還有定時器控制寄存器TCON的TR0位和中斷允

17、許寄存器IE的EA位和ET0位,在這里,我們只需要將這些位設置為1就可以完成定時器0的初始化設置。T0中斷源在C程序的中斷號是interrupt 1,在編寫中斷程序的時候需要加上中斷號。在中斷程序中我們主要計算時間的時、分、秒,用于系統電路的計時功能,此中斷程序只會在中斷觸發以后執行,程序的流程圖如圖4.1所示。圖4.1 定時器T0中斷程序流程圖4.2 外部中斷計程程序設計STC89C52RC單片機有兩個外部中斷源,本次的設計在計算路程的程序中就用到了一個外部中斷源,選擇的是外部中斷1,它對應的是我們單片機的P3.3腳,它在C程序中的中斷號是interrupt 2。外部中斷1的設置主要是它的觸

18、發方式,它的觸發方式有兩種:一是低電平觸發方式、二是邊沿觸發方式;P3.3腳外接的光電傳感器模塊在沒有遮擋時會長時間輸入低電平,如果采用低電平觸發方式有可能會出現一次中斷請求而發生多次中斷請求的情況,所以在這里選擇邊沿觸發方式。選擇邊沿觸發方式的設置只需要把定時控制寄存器TCON的IT1設置為1。中斷允許寄存器IE的EA和EX1也與外部中斷1有關,所以也要將其設置為1。在外部中斷1的程序中我們只作統計發生外部中斷1的次數的工作,其余計算路程和金額的程序放在主程序中進行計算,以便于縮短CPU執行中斷程序的時間。 串口中斷的初始化程序設計主要是對相關寄存器的設置和串口波特率的設置,需要設置的寄存器

19、主要有控制狀態寄存器SCON、電源控制寄存器PCON的SMOD位、定時控制寄存器TCON的TR1位和T1定時/計數器。SCON寄存器的設置,主要用于定義串口通信口的工作方式和反映串行口狀態,這次我們選用的是方式1的工作方式,表示8位UATR(串行異步通信接口);打開寄存器的REN位,所以給SCON寄存器賦值0X50。PCON寄存器與串口相關的只有SMOD位,它是波特率倍增位,當將該位設置位1的時候,表示串口波特率加倍。波特率的發生需要定時器產生時鐘信號,由于在前面已經用了T0定時/計數器,所以這里只能用T1定時/計數器,這里T1定時/計數器選用方式2的工作模式,便于每次溢出后能夠自動的重裝初值

20、;串口語音信號發送的波特率選用的是9600;外部的石英晶振頻率為11.0592MHz,根據公式1通過計算得出T1的初始值X為0xFA,即表示我們要給TH1和TH1都賦值為0xFA。 (公式1)當這些寄存器設置完畢以后將TCON寄存器的TR1置1即可運行T1定時/計算器。串口數據在發送前要根據通信協議設置TB8,然后將要發送的數據在主程序中直接寫入發送緩沖器SBUF,便可自動啟動發送過程。串行口能自動的把TB8取出,并裝入到第九位的數據位的位置,再逐一發送出去1。在整個程序的設計中最重要的是主程序,它的主要任務是完成中斷的初始化、液晶初始化及液晶信息顯示、開關狀態檢測、模式的調節等。它的主要流程

21、圖如下圖4.2所示。在主程序中很多地方都采用了調用子函數的方法來縮短主函數代碼,由于子函數封裝得比較多,這里就不對他們做過多的說明。開始初始化液晶顯示信息、設置中斷否開始計費按鈕是否按下是開啟中斷、液晶清屏、發送語音提示信息計算路程、計算消費金額、液晶顯示信息否暫停計費按鈕是否按下是關閉中斷、發送語音提示信息否開始按鈕是否按下是開啟中斷、發送語音提示信息否是否已剛好行駛2km是發送語音提示信息清出所有計費數據否消費金額是否為10的倍數是發送語音提示信息否結賬按鈕是否按下是發送語音提示信息、關閉中斷是 返回主界面按鈕是否按下否圖4.2 主程序流程圖5 硬件電路的制作與調試5.1 硬件電路的制作整

22、個硬件電路是在萬能板上面焊接原件和連接焊點而組成的,在制作的時候首先是布局的問題,只有一開始布好局在走線的時候才不會顯得那么亂,制作好以后才會顯得美觀,電路的性能才會可靠,不會出現接觸不良等問題。這次在電路板上,為了擔心元器件損壞,或者為了有些元器件能夠再次利用,我都采用了焊接芯片座的方式將一些引腳比較多的原件直接插在座子上面實驗。硬件電路的實物圖如圖5.1所示。此電路板上加了一個電機,其目的是方便演示和調試。圖 5.1 電路實物圖5.2 硬件調試的結果在經過多次的程序修改和硬件電路的改進后,整個硬件電路的調試結果已經能夠達到預期設想的效果了,圖5.2和5.3是最終調試成功后在某個時候的顯示結

23、果圖。電路能夠正常的通過光電傳感器計算行駛的路程;在開關的控制下能夠正常的運行;液晶能正常的把信息顯示出來;也能在特殊的時候進行語音提示播報。圖 5.2 硬件的初始顯示界面圖圖 5.3 硬件的行程信息顯示圖5.3 PCB板的繪制硬件電路的調試成功,說明電路的可行性。為了便于生產與使用,我將電路繪制成PCB板。本次繪制PCB板選用的是protel 99 se軟件。在前面我們已將電路的原理圖繪制成功了,所以在現在只需要將原有的電路添加到PCB板界面進行繪制就可以完成制作了。完成的結果如圖5.4所示;進過3D視圖看到的效果如圖5.5所示。 圖5.4 PCB板圖圖5.5 PCB板3D視圖6 總結思考本

24、次的畢業設計雖然順利的完成了,但是并不能完全的投入到實際中去使用,其原因是存在計算精度和功能方面的缺陷問題。在計算精度方面存在的主要問題就是計算路程并沒有以實際的車輪周長去計算,而是為了方便演示隨便給了一個比實際值要大的值,這就造成了計算的路程和費用出現嚴重的誤差,但這個問題可以通過修改調試程序解決;在功能方面的主要缺陷問題就是時間和計費方式方面,因為電路不能自動的去獲取當前的時間,就沒有辦法去區分晚上和白天,而且也沒有掉電保護功能,在異常掉電的情況下,所有的計算數據就清零了,這是電路存在的兩大缺陷問題,這兩個問題就需要在單片機外圍加上一些輔助電路和配合單片機的程序去解決,這是此次電路設計的主

25、要缺陷問題。在經過了長達一個月的努力后,畢業設計已經完成得差不多了,雖然還有許多需要改進和不足的地方,但是大部分的功能已經完整的實現了。在這期間經歷了選題、查資料、選材料、電路板焊接、程序的編寫、論文的撰寫等過程。其實最讓我痛苦的是選題的階段;在后期的制作與調試階段雖然也遇到過很多困難,但在指導老師和一些同學們的幫助或建議下順利地度過了難關。本次的畢業設計不但強化了我所學過的專業基礎知識,而且還學到了很多新的知識,更讓我們懂得了如何將所學到的知識應用于實際的生活中;讓我收獲最大的就是懂得了如何客服困難,這在以后的生活和工作中都是最寶貴的財富。參考文獻1周國運. 單片機原理及應用 C語言版. 北

26、京:中國水利水電出版社, 2009.02. 2王柏盛.C 程序設計M.高等教育出版社. 2004.3楊志忠主編. 數字電子技術基礎. 北京:高等教育出版社, 2004.01.4楊居義編著. 單片機案例教程. 北京:清華大學出版社, 2015.01.5楊庚辰.自動控制原理M.西安:電子科技大學出版社,2011.4.6代萬輝,陳松方編著. 全國電子設計大賽培訓寶典. 北京:北京航空航天大學出版社, 2012.05. 7張義和等編著. 例說51單片機 C語言版. 北京:人民郵電出版社, 2008.04.8侯殿有主編. 單片機C語言程序設計. 北京:人民郵電出版社, 2010.11. 9孫少文,陸中宏

27、主編. 傳感器. 北京:中央廣播電視大學出版社, 2014.01. 10丁繼斌編著. 傳感器. 北京:化學工業出版社, 2010.03. 11張玉蓮.傳感器與自動檢測技術J.北京:機械工業出版社,2007.9:4-8.12王英主編. 電子技術實驗教程 電工學 2 模電實驗 數電實驗 綜合設計與仿真實驗. 成都:西南交通大學出版社, 2015.03. 13胡新宇.傳感器與自動檢測技術M.北京:高等教育出版社,2006.14鄧興成.單片機原理與實踐指導M.北京:機械工業出版社,2010.2.15劉向宇.單片機C語言程序設計實例精粹J.北京:電子工業出版社,2010,2:12-21.16夏路易,石宗

28、義編著. 電路原理圖與電路板設計教程 Protel 99SE. 北京:北京希望電子出版社, 2002.06. 17姚年春編著. Protel 99SE基礎教程. 北京:人民郵電出版社, 2009.04. 18童詩白,華成英主編.模擬電子技術基礎(第四版)M.北京:高等教育出版社,2007.9.19SYN6288中文語音合成芯片數據手冊J.The Design Of Taxi MeterXxxInstitute of physics and electronic engineeri Electronic information engineering 1230xxxxxAbstract The

29、design is a shart changing system which mainly for the arban taxi operation.and it core for the single chip processor STC89C52RC. Through the photoelectric sensor to accumulate the number of turns of the rotation of the wheels and algorithms to calculate the driving distance. And according to the co

30、rresponding fee standards to get the charge should be. Through the LCD12864 to show the distance, unit price, the information of the time and the amount of consumption and so on. In certain time there is speech hint by using voice module of SYN6288. This design can also adjust the charge standard ac

31、cording to the user's own situation.Key words Taxi meter, SYN6288, LCD12864, Photoelectric sensor.附錄系統源代碼main.h文件源代碼:#ifndef _main_h_#define _main_h_#include "12864.h"#include <string.h>sbit begin_key = P10;/開始計費按鈕sbit pause_key = P11;/暫停計費按鈕sbit end_key = P12;/結算費用按鈕sbit mface_k

32、ey = P13;/返回主界面按鈕sbit nigday_key = P16;/晚上白天切換按鈕unsigned short degree = 0; /統計T0發生中斷的次數,滿20次清零,時間加1sunsigned short flag1 = 0; /協助語音發送,以免重復unsigned short flag2 = 0; /協助語音發送,以免重復unsigned short flag3 = 0; /判斷當前是白天狀態還是晚上狀態float runs = 2.5; /路程的比較值,當路程大于runs則加上單價unsigned short hour = 0; /時unsigned short

33、minutes = 0; /分unsigned short seconds = 0; /秒unsigned short value = 0;unsigned int run_int = 0; / 路程的整數部分unsigned int run_fac = 0; /路程的小數部分unsigned int money_int = 5; /金額的整數部分unsigned int money_fac = 0; /金額的小數部分unsigned char time10; /要顯示的時間字符串unsigned char money_str10; /要顯示的金錢字符串unsigned char voice4

34、0; /要發送的語音字符串unsigned char run_str10; /要顯示的路程字符串unsigned char* time_string(); /將時、分、秒轉換成一個字符串unsigned char* run_string(); /將路程轉換成一個字符串unsigned char* money_string(); /將金額轉換成一個字符串void send(char *text,char length);/發送一個要播放的語音信號void interrupt_set(); /中斷相關寄存器設置void count_run(); /路程算法函數 void count_money()

35、; /金額算法函數void Init_show(); /液晶初始顯示信息void mess_show(); /計費時動態顯示信息void init_data(); /還原所有的數據#endifmain.c文件源代碼:#include "main.h"int main()while(1) Init_show(); interrupt_set(); /設置中斷strcpy(voice,"計費開始起步價五元"); send(voice,strlen(voice);LcdInit(); /初始化液晶while(1)count_run();count_money(

36、);mess_show();if(nigday_key = 0) if(flag3 = 0)flag3 = 1;else flag3 = 0; if(pause_key = 0) /暫停開關按下執行 EA = 0;strcpy(voice,"計費暫停"); send(voice,strlen(voice);while(1)if(begin_key = 0)/開始開關按下執行并跳出循環EA = 1;strcpy(voice,"計費開始"); send(voice,strlen(voice);break;if(end_key = 0) strcpy(voic

37、e, "您本次消費");strcat(voice, money_str);strcat(voice,"元");send(voice,strlen(voice);while(1)if(mface_key = 0)break;init_data();break; if(run_int = 2) && (flag1 = 0)/如果行駛路程超過2KM,則播放語音if(flag3 = 0)strcpy(voice,"您已行駛兩公里現在以1.6元一公里計費"); elsestrcpy(voice,"您已行駛兩公里現在以1

38、.8元一公里計費");send(voice,strlen(voice);flag1 = 1;if(money_int-9)%10 = 0)flag2 = 0;if(money_int % 10 = 0) && (flag2 = 0) /如果消費金額滿10元則播放此語音strcpy(voice,"您已消費");money_str3 = '0'money_str4 = '0'strcat(voice, money_str);strcat(voice,"元"); send(voice,strlen(vo

39、ice);flag2 = 1;/*恢復變量函數,以便對下次收費進行計費*/void init_data()hour = 0; minutes = 0; seconds = 0;run_int = 0;run_fac = 0;runs = 2.5;value = 0;flag1 = 0;flag2 = 0;money_int = 5;money_fac = 0;EA = 0; /*LCD初始化顯示*/void Init_show()begin_key = 1;pause_key = 1;end_key = 1;mface_key = 1;nigday_key = 1;LcdInit();Loca

40、tion(1,0);Print("歡迎乘坐出租車");Location(2,0);Print("起步價¥5");Location(3,0);Print("單價:白天¥1.6");Location(4,3);Print("晚上¥1.8");while(1)if(begin_key = 0)break;return;/*顯示信息*/void mess_show() Location(1,0);if(flag3 = 0)Print("單價:¥1.6 ");else Print("單價:¥1.

41、8 ");Location(2,0);Print("計時:");Print(time_string();Location(3,0);Print("計程:");Print(run_string();Location(4,0);Print("消費金額:");Print(money_string();DelayMs(10);/*中斷設置函數*/void interrupt_set() EA = 1; /開中斷允許請求總開關 ET0 = 1; /開T0中斷請求EX1 = 1; /允許外部中斷1請求IT1 = 1; /采用下降沿觸發T

42、MOD = 0x21; /選擇方式0計數方式TH0 = (65536 - 50000) >> 8; TL0 = (65536 - 50000) & 255;TR0 = 1; /開啟中斷TL1 = 0xFA;TH1 = 0xFA;SCON = 0x50;PCON = 0x80;REN = 1;RI = 0;TI = 0;TR1 = 1;/*發送語音信號函數*/void send(char *text,char length)unsigned int i = 0;unsigned char det = 0;char set5 = 0xfd,0x00,0,0x01,0x01;se

43、t2 = length + 3;for(i=0; i<5; i+)det = seti;SBUF = seti;while(TI = 0);TI = 0;for(i = 0; i<length; i+)det = texti;SBUF = texti;while(TI = 0);TI = 0;SBUF = det;while(TI=0);TI=0; /*=計程中斷 X1中斷=-*/void optoelectronic_switch() interrupt 2 EX1 = 0;value+;EX1 = 1;/*=中斷計時函數 ,interrupt 1表示第一個中斷源 =*/void

44、 timing() interrupt 1 TH0 = (65536 - 50000) >> 8; TL0 = (65536 - 50000) & 255;degree+;if(degree = 20) degree = 0; seconds+;if(seconds >= 60)seconds = 0;minutes+;if(minutes >= 60)minutes = 0; hour+;/*計算總價的函數*/void count_money()float run = run_int + 0.1 * run_fac;if(run >= runs)runs

45、 += 0.5;if(flag3 = 0)money_fac += 8;else money_fac += 9;if(money_fac >= 10)money_int+;money_fac = money_fac % 10 ;/*將消費金額轉換成一個字符串*/unsigned char* money_string() int i = 0;if(money_int < 10)money_stri+ = money_int + '0'else if(money_int >= 10 && money_int < 100) money_stri

46、+ = money_int / 10 + '0'money_stri+ = money_int % 10 + '0' else money_stri+ = money_int / 100 + '0'money_stri+ = (money_int % 100) / 10 + '0'money_stri+ = money_int % 10 + '0'money_stri+ = '.'money_stri+ = money_fac + '0'money_stri = '0'

47、;return money_str;/*計算路程的函數*/void count_run()if(value >= 100)run_fac+;value = 0;if(run_fac >= 10)run_fac = 0;run_int+;/*將路程的整數和小數部分轉換成字符串*/unsigned char* run_string()int i = 0;if(run_int < 10)run_stri+ = run_int + '0'else if(run_int >= 10 && run_int < 100) run_stri+ =

48、run_int / 10 + '0'run_stri+ = run_int % 10 + '0' else run_stri+ = run_int / 100 + '0'run_stri+ = (run_int % 100) / 10 + '0'run_stri+ = run_int % 10 + '0'run_stri+ = '.'run_stri+ = run_fac + '0'run_stri+ = 'k'run_stri+ = 'm'run_stri = '0'return run_str;/*將一個時間轉換成字符串*/unsigned char* time_string() *(time + 0) = hour / 10 + '0'*(time

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論