單片機(jī)課程設(shè)計論文---出租車計價器_第1頁
已閱讀1頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  《單片機(jī)應(yīng)用與仿真訓(xùn)練》設(shè)計報告</p><p>  基于單片機(jī)的出租車計價器的設(shè)計</p><p><b>  摘 要</b></p><p>  本設(shè)計采用AT89S52單片機(jī)為主控器,并用霍爾傳感器檢測電機(jī)轉(zhuǎn)盤轉(zhuǎn)動模擬車速,實現(xiàn)對出租車的多功能的計價設(shè)計,輸出采用8段數(shù)碼顯示管。本電路設(shè)計的計價器可以實現(xiàn)要單程

2、,往返和中途等待來調(diào)節(jié)計費,并且能夠記錄等待時間。</p><p>  出租車計價是根據(jù)車所行駛的路程以及乘客乘車的方式綜合決定的。出租車行駛總路程可以通過車輪的周長乘車輪旋轉(zhuǎn)圈數(shù)得到。即可計算得到車輪旋轉(zhuǎn)幾周出租車能行駛一公里的路程。使用霍爾傳感器方便地計量車輪旋轉(zhuǎn)的圈數(shù)。輸出的脈沖信號被接入到AT89S52單片機(jī)系統(tǒng)中,通過計算接收到的脈沖個數(shù),計算出當(dāng)前所行駛的路程,并且可以計算實時的速度,在速度低于5公里

3、每小時是進(jìn)入等待計費。于此同時,根據(jù)不同的收費標(biāo)準(zhǔn),通過選擇相應(yīng)的起步價、單價等收費標(biāo)準(zhǔn)進(jìn)行計算。通過鍵盤能夠?qū)崿F(xiàn)往返設(shè)置,啟動、暫停、停止計價器以及切換顯示當(dāng)前的行駛里程和需支付的車費。</p><p>  本設(shè)計硬件電路總體可以分為五個單元:單片機(jī)最小系統(tǒng)單元,指示燈電路單元,按鍵電路單元,路程時間與金額顯示單元,轉(zhuǎn)速信號接收單元。軟件系統(tǒng)可以大致分為五個大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時模塊

4、,數(shù)據(jù)計算模塊,數(shù)碼管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)速信號接收與等待記時采用中斷方式。這些軟硬件系統(tǒng)構(gòu)成了最終的設(shè)計。</p><p>  關(guān)鍵詞單片機(jī)霍爾傳感器出租車計價器 </p><p>  摘 要- 1 -</p><p><b>  1概述- 2 -</b></p><

5、;p>  1.1 設(shè)計目的、意義- 2 -</p><p>  1.2 AT89S52單片機(jī)功能簡介- 3 -</p><p>  2.系統(tǒng)總體方案設(shè)計及硬件設(shè)計- 4 -</p><p>  2.1 設(shè)計要求- 4 -</p><p>  2.2設(shè)計參數(shù)- 5 -</p><p>  2.3 方案的選

6、取- 5 -</p><p>  2.4硬件設(shè)計- 5 -</p><p>  2.4.1 AT89S52單片機(jī)及最小系統(tǒng)- 5 -</p><p>  2.4.2 測距單元- 7 -</p><p>  2.4.3 顯示單元- 10 -</p><p>  2.4.4鍵盤與指示單元- 10 -</p

7、><p>  3軟件設(shè)計- 11 -</p><p>  3.1總體流程- 11 -</p><p>  3.2計算模塊- 12 -</p><p>  3.3鍵盤掃描- 12 -</p><p>  3.4顯示程序- 12 -</p><p>  4 Proteus軟件仿真- 13 -

8、</p><p>  5課程設(shè)計體會- 14 -</p><p>  參考文獻(xiàn)- 15 -</p><p>  附1:源程序代碼- 16 -</p><p>  附2:系統(tǒng)原理圖- 30 -</p><p><b>  1概述</b></p><p>  1.1 設(shè)

9、計目的、意義</p><p>  租車計價器技術(shù)也在不斷進(jìn)步和提高。國內(nèi)出租車計價器已經(jīng)經(jīng)歷了4個階段的發(fā)展。從傳統(tǒng)的全部由機(jī)械元器件組成的機(jī)械式,到半電子式即用電子線路代替部分機(jī)械元器件的出租車計價器;再從集成電路式到目前的單片機(jī)系統(tǒng)設(shè)計的出租車計價器。出租車計價器計費是否準(zhǔn)確、出租車司機(jī)是否作弊才是乘客最關(guān)心的問題,而計價器營運數(shù)據(jù)的管理是否方便才是出租車司機(jī)最關(guān)注的。因此怎樣設(shè)計出一種既能有效防止司機(jī)作弊又

10、能方便司機(jī)的計價器尤為重要。因此, 本文以單片機(jī)AT89S52為核心設(shè)計一款多功能出租車計價器,該計價器能實現(xiàn)按時間和里程綜合計算車價,能顯示時間、里程、單價、總車價等相關(guān)信息顯示。它比市場上的一些計價器使用更方便,功能更全,還具有有效防止司機(jī)作弊和系統(tǒng)穩(wěn)定性好的優(yōu)點。</p><p>  本次設(shè)計的目的在于現(xiàn)在各大中城市出租車行業(yè)都已普及自動計價器,所以計價器技術(shù)的發(fā)展已成定局。采用模擬電路和數(shù)字電路設(shè)計的計價

11、器整體電路的規(guī)模較大,用到的器件多,造成故障率高,難調(diào)試。而采用單片機(jī)進(jìn)行的設(shè)計,相對來說功能強(qiáng)大,是深化單片機(jī)應(yīng)用的良好途徑,用較少的硬件和適當(dāng)?shù)能浖嗷ヅ浜峡梢院苋菀椎貙崿F(xiàn)設(shè)計要求,且靈活性強(qiáng),可以通過軟件編程來完成更多的附加功能。</p><p>  1.2 AT89S52單片機(jī)功能簡介</p><p>  計算機(jī)系統(tǒng)已明顯地朝巨型化、單片化、網(wǎng)絡(luò)化三個方向發(fā)展。巨型化發(fā)展的目的在于

12、不斷提高計算機(jī)的運算速度和處理能力,以解決復(fù)雜系統(tǒng)計算和高速數(shù)據(jù)處理,比如系統(tǒng)仿真和模擬、實時運算和處理。單片化是把計算機(jī)系統(tǒng)盡可能集成在一塊半導(dǎo)體芯片上,其目的在于計算機(jī)微型化和提高系統(tǒng)的可靠性,這種單片計算簡稱單片機(jī)。單片機(jī)的內(nèi)部硬件結(jié)構(gòu)和指令系統(tǒng)主要是針對自動控制應(yīng)用而設(shè)計的,所以單片機(jī)又稱微控制器MCU(Micro Controller Unit)。用它可以很容易地將計算機(jī)嵌入到各種儀器和現(xiàn)場控制設(shè)備中,因此單片機(jī)又叫做嵌入式微

13、控制器(Embedded MCU)。單片機(jī)自20世紀(jì)70年代問世以來,以其鮮明的特點得到迅猛發(fā)展,已廣泛應(yīng)用于家用電器、智能玩具、智能儀器儀表、工業(yè)控制、航空航天等領(lǐng)域,經(jīng)過30多年的發(fā)展,性能不斷提高,品種不斷豐富,已經(jīng)形成自動控制的一支中堅力量。據(jù)統(tǒng)計,我國的單片機(jī)年容量已達(dá)1~3億片,且每年以大約16%的速度增長,但相對于國際市場我國的占有率還不到1%。這說明單片機(jī)應(yīng)用在我國有著廣闊的前景。對于從事自動控制的技術(shù)人員來講,掌握單片

14、機(jī)原理及其應(yīng)用已經(jīng)成為必不可少的學(xué)習(xí)任務(wù)。</p><p>  單片機(jī)的應(yīng)用十分廣泛,在工業(yè)控制領(lǐng)域、家電產(chǎn)品、智能化儀器儀表、計算機(jī)外部設(shè)備,特別是機(jī)電一體化產(chǎn)品中,都有重要的用途。其主要的用途可以分為以下方面:</p><p>  顯示:通過單片機(jī)控制發(fā)光二極管或是液晶,顯示特定的圖形和字符。</p><p>  機(jī)電控制:用單片機(jī)控制機(jī)電產(chǎn)品做定時或定向的動作

15、。</p><p>  檢測:通過單片機(jī)和傳感器的聯(lián)合使用,用來檢測產(chǎn)品或者工況的意外發(fā)生。</p><p>  通信:通過RS-232串行通信或者是USB通信,傳輸數(shù)據(jù)和信號。</p><p>  科學(xué)計算:用來實現(xiàn)簡單的算法。</p><p>  那么單片機(jī)是不是解決上述應(yīng)用的唯一選擇呢?淡然不是!目前,在自動控制中,一般有三種選擇,分別

16、是嵌入式微機(jī)、DSP和單片機(jī)。</p><p>  單片機(jī)最明顯的優(yōu)點是價格便宜,從幾元人民幣到幾十元人民幣。這是因為這類芯片的生產(chǎn)量很大,技術(shù)也很成熟。</p><p>  其次,單片機(jī)的體積也遠(yuǎn)小于其他兩種方案。單片機(jī)本身一般用40引腳封裝,當(dāng)然功能多一些的單片機(jī)也有引腳比較多的,如68引腳,功能少的只有10多個或20多個引腳,有的甚至只有8只引腳。</p><p&

17、gt;  當(dāng)然,單片機(jī)無論在速度還是容量方面都小于其他兩種方案,但是在實際工作中并不是任何需要計算機(jī)的場合都要求計算機(jī)有很高的性能。例如,控制電冰箱的控制器就不需要使用嵌入式系統(tǒng),用一片51就可以輕松實現(xiàn)。所以應(yīng)用的關(guān)鍵是看能否夠用,是否有很好的性能價格比。51系列的單片機(jī)已經(jīng)面世十多年,依然沒有被淘汰,還在不斷發(fā)展中,這就說明是他有廣闊的應(yīng)用前景。</p><p>  2.系統(tǒng)總體方案設(shè)計及硬件設(shè)計</p

18、><p><b>  2.1 設(shè)計要求</b></p><p> ?。?)能顯示里程,單位為公里,最后一位為小數(shù)位。</p><p> ?。?)能顯示金額數(shù),單位為元,最后一位為小數(shù)位。</p><p>  (3)可設(shè)定單程價格和往返價格,單程價格為2元/公里,往返價格為1.5元/公里。</p><p&g

19、t; ?。?)車速<5公里/小時的時間累積為總等待時間,每5分鐘等待時間相當(dāng)于里程數(shù)增加1公里。</p><p> ?。?)起步公里數(shù)為3公里,價格為5元,若實際距離大于3公里,按規(guī)則3計算價格。</p><p> ?。?)按暫停鍵,計價器可暫停計價,按查詢鍵,可顯示總等待時間。</p><p><b>  2.2設(shè)計參數(shù)</b><

20、/p><p>  由于要求沒有給出車輪的相關(guān)參數(shù),所以這里進(jìn)行一些基本參數(shù)的查詢。據(jù)調(diào)查統(tǒng)計,現(xiàn)行出租車輪胎直徑大致有四種,直徑分別為520mm、540mm、560mm和580mm.</p><p>  本作品針對560mm的出租車進(jìn)行設(shè)計。它的周長為:1.7584 m,57圈行駛100m. </p><p><b>  2.3 方案的選取</b>

21、;</p><p>  本設(shè)計可以分為五個單元,單片機(jī)最小系統(tǒng)單元,指示燈電路單元,按鍵電路單元,路程時間與金額顯示單元,轉(zhuǎn)速信號接收單元,如下圖:</p><p><b>  2.4硬件設(shè)計</b></p><p>  本設(shè)計的硬件設(shè)計包括單片機(jī)AT89S52單元、測距單元、顯示單元(數(shù)碼管顯示金額、等待時間和里程)、按鍵與指示單元(指示燈對

22、單雙程切換指示、暫停、等待指示)。</p><p>  2.4.1 AT89S52單片機(jī)及最小系統(tǒng)</p><p>  單片機(jī)最小系統(tǒng),或者稱為最小應(yīng)用系統(tǒng),是指用最少的元件組成的單片機(jī)可以工作的系統(tǒng)。對51系列單片機(jī)來說,最小系統(tǒng)一般應(yīng)該包括:單片機(jī)、晶振電路、復(fù)位電路。</p><p>  AT89S52具有如下特點:40個引腳,4k Bytes Flash片內(nèi)

23、程序存儲器, 128 bytes的隨機(jī)存取數(shù)據(jù)存儲器(RAM),32個外部雙向輸入/輸出(I/O)口,5個中斷優(yōu)先級2層中斷嵌套,2個16位可編程定時計數(shù)器,2個全雙工串行通信口,看門狗(WDT)電路,片內(nèi)時鐘振蕩器。</p><p><b>  P0口有二個功能:</b></p><p>  1、外部擴(kuò)展存儲器時,當(dāng)做數(shù)據(jù)/地址總線。</p><

24、p>  2、不擴(kuò)展時,可做一般的I/O使用,但內(nèi)部無上拉電阻,作為輸入或輸出時應(yīng)在外部接上拉電阻。</p><p>  P1口只做I/O口使用:其內(nèi)部有上拉電阻。  </p><p>  P2口有兩個功能: </p><p>  1、擴(kuò)展外部存儲器時,當(dāng)作地址總線使用。 </p><p>  2、做一般I/

25、O口使用,其內(nèi)部有上拉電阻。 </p><p>  P3口有兩個功能:除了作為I/O使用外(其內(nèi)部有上拉電阻),還有一些特殊功能,由特殊寄存器來設(shè)置。</p><p>  圖2 AT89S52引腳圖 圖3 AT89S52封裝圖</p><p>  設(shè)計中用到的單片機(jī)各管腳(圖2)功能以及與其他模塊連接介紹

26、如下:</p><p>  VCC:接+5V電源。VSS:接地。</p><p>  時鐘引腳:XTAL1和XTAL2兩端接晶振和30PF的電容,構(gòu)成時鐘電路。</p><p>  它可以使單片機(jī)穩(wěn)定可靠的運行。</p><p>  RST:復(fù)位信號輸入端,高電平有效。當(dāng)在此引腳加兩個機(jī)器周期的高電平時,就可以完成復(fù)位操作。</p>

27、;<p>  P1.0:接功能按鍵。</p><p>  P1.1:接切換鍵,表示單雙程切換。</p><p>  P1.2:接查詢(上次金額)鍵。</p><p>  P1.3:接清零鍵。</p><p>  P1.4:接空車指示燈。</p><p>  P1.5:接查詢指示燈。</p>

28、<p>  P1.6:接開始計時指示燈。</p><p>  P1.7:接雙程指示燈。</p><p>  P3.0:接查詢/確認(rèn)鍵。</p><p>  P0口接數(shù)碼管段選端,P2口接數(shù)碼管位選段。</p><p>  P3.2:接霍爾傳感器的輸出口。</p><p>  P3.3:接存儲器的SCL口。&l

29、t;/p><p>  P3.4:接儲存器的SDA口。</p><p>  P3.5:接時鐘電路DS1302的RST口。</p><p>  P3.6:接DS1302的SCLK口。</p><p>  P3.7:接DS1302的I/O口。</p><p>  復(fù)位電路和晶振電路是AT89S52工作所需的最簡外圍電路。單片機(jī)最

30、小系統(tǒng)電路圖如圖4所示。 </p><p>  圖4 單片機(jī)最小系統(tǒng)</p><p>  AT89S52 的復(fù)位端是一個史密特觸發(fā)輸入,高電平有效。RST端若由低電平上升到高電平并持續(xù)2個周期,系統(tǒng)將實現(xiàn)一次復(fù)位操作。在復(fù)位電路中,按一下復(fù)位開關(guān)就使在RST端出現(xiàn)一段時間的高電平,外接12M 晶振和兩個30pF 電容組成系統(tǒng)的內(nèi)部時鐘電路。</p><p>

31、;  2.4.2 測距單元</p><p>  本次設(shè)計我們選取了霍爾傳感器來進(jìn)行里程測量。</p><p>  霍爾器件是一種磁傳感器。用它們可以檢測磁場及其變化,可在各種與磁場有關(guān)的場合中使用?;魻柶骷曰魻栃?yīng)為其工作基礎(chǔ)。</p><p>  霍爾器件具有許多優(yōu)點,它們的結(jié)構(gòu)牢固,體積小,重量輕,壽命長,安裝方便,功耗小,頻率高,耐震動,不怕灰塵、油污、水汽

32、及鹽霧等的污染或腐蝕。</p><p>  霍爾器件分為:霍爾元件和霍爾集成電路兩大類,前者是一個簡單的霍爾片,使用時常常需要將獲得的霍爾電壓進(jìn)行放大。后者將霍爾片和它的信號處理電路集成在同一個芯片上。本次設(shè)計選取了霍爾集成電路來測量里程。</p><p>  里程測量是通過將霍爾傳感器的集成電路安裝在車輪上方的鐵板上,將磁鐵安裝在車輪上,旋轉(zhuǎn)的車輪將磁鐵對準(zhǔn)集成電路時,霍爾傳感器會輸出一

33、個脈沖信號,送到單片機(jī),經(jīng)過單片機(jī)的計算處理,將行駛的里程送到顯示單元并顯示出來。</p><p><b>  其原理示意圖如下:</b></p><p>  圖5 傳感器測距示意圖</p><p>  A44E是一種利用霍爾效應(yīng)做成的半導(dǎo)體集成電路器件,它被設(shè)計在交變磁場中運行,特別是能在低電源電壓和長時間運行溫度范圍可達(dá)到125℃。這種霍

34、爾IC可用作各種類型的傳感器(速度傳感器、位移傳感器、轉(zhuǎn)速傳感器等等),接觸開關(guān)以及相類似的應(yīng)用場合。其工作電壓比較寬(2.5~20V),可運行在較大的溫度范圍內(nèi)(-20℃~125℃), 其輸出的信號符合TTL電平標(biāo)準(zhǔn),可以直接接到單片機(jī)的IO 端口上,而且其最高檢測頻率可達(dá)到1MHZ。</p><p>  霍爾傳感器的特性如圖6所示,其中BOP為工作點“開”的磁感應(yīng)強(qiáng)度,BRP為釋放點“關(guān)”的磁感應(yīng)強(qiáng)度。當(dāng)外加

35、的磁感應(yīng)強(qiáng)度超過動作點BOP時,傳感器輸出低電平,當(dāng)磁感應(yīng)強(qiáng)度降到動作點BOP以下時,傳感器輸出電平不變,一直要降到釋放點BRP時,傳感器才由低電平躍變?yōu)楦唠娖?。BOP與BRP之間的滯后使開關(guān)動作更為可靠。</p><p>  圖6 A44E霍爾傳感器和其輸出特性</p><p>  A44E霍爾傳感器有3個外接口,2個是電源的正負(fù)極接口,最后一個是脈沖信號輸出口,只要將霍爾傳感器的信號

36、輸出端接到單片機(jī)的端口上便可以實現(xiàn)距離檢測。</p><p>  其中,單片機(jī)的P3.2(INT0)引腳作為信號的輸入端,采用外部中斷0進(jìn)行計數(shù)。車輪每轉(zhuǎn)一圈,霍爾傳感器就產(chǎn)生一個脈沖信號,根據(jù)霍爾效應(yīng)原理,當(dāng)霍爾片處在磁場中時,霍爾傳感器的輸出端輸出低電平。當(dāng)車輪轉(zhuǎn)動一圈時小磁鐵提供一個磁場,則霍爾傳感器輸出一次低電平完成一次數(shù)據(jù)采集,從而產(chǎn)生信號。霍爾傳感器檢測并輸出信號到單片機(jī)的INT0或INT1計算脈沖輸

37、入端,引起單片機(jī)的中斷,對脈沖計數(shù),當(dāng)計數(shù)達(dá)到特定的次數(shù)時,里程就會增加,單片機(jī)對里程進(jìn)行計算后,通過接口電路將計算好的結(jié)果傳送到數(shù)碼管并顯示出來。</p><p>  2.4.3 顯示單元</p><p>  本設(shè)計采用兩個四個一組的共陰八位數(shù)碼管來顯示,一組顯示金額,另一組顯示路程與等待時間配合按鍵來切換。</p><p>  數(shù)據(jù)端都用單片機(jī)P1口,片選端分別

38、接在P2口的高四位和低四位。它們的連線如下:</p><p>  2.4.4鍵盤與指示單元</p><p>  本設(shè)計按照功能要求設(shè)置了四個按鍵和四個LED燈。</p><p> ?。?)按鍵說明如下:</p><p>  key0 系統(tǒng)清零,用來將整個計費系統(tǒng)的顯示清零;</p><p>  key1 顯示切換,用來

39、切換路程與等待時間的顯示;</p><p>  key2 單程雙程,用來設(shè)置是單程還是往返計費;</p><p>  key3 系統(tǒng)暫停,用來將整個計費系統(tǒng)暫停;</p><p> ?。?)指示燈說明如下:</p><p>  led1 指示單程還是雙程,當(dāng)選擇雙程計費時亮;</p><p>  led2 指示系

40、統(tǒng)暫停與否,當(dāng)選擇暫停時亮;</p><p>  led3 指示是否進(jìn)入等待計費,計入等待計費時亮;</p><p>  led4 指示顯示的是路程還是等待時間,顯示等待時間時亮。</p><p><b>  3軟件設(shè)計</b></p><p><b>  3.1總體流程</b></p

41、><p>  本設(shè)計中,軟件系統(tǒng)可以大致分為五個大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時模塊,數(shù)據(jù)計算模塊,數(shù)碼管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)速信號接收與等待記時采用中斷方式。</p><p><b>  3.2計算模塊</b></p><p>  計算程序根據(jù)里程數(shù)分別進(jìn)入不同的計算公式。如果里程大于3公里,則執(zhí)

42、行公式:總金額=起步價+(里程-3)*單價+等待時間*等待單價;否則,執(zhí)行公式:總金額=起步價+等待時間*等待單價。</p><p>  對于里程數(shù)采用外部中斷零來記錄,車輪沒轉(zhuǎn)一周,霍爾傳感器發(fā)一個脈沖然后進(jìn)入中斷子程序,對相應(yīng)的變量進(jìn)行更新。</p><p>  對于速度的判斷及等待時間的記錄采用定時器零中斷,設(shè)定10ms一個中斷,然后判斷車速,小于5公里/小時時,則開始記錄等待時間。

43、</p><p><b>  3.3鍵盤掃描</b></p><p>  鍵盤掃描才用查詢方式,當(dāng)有按鍵按下時就對相應(yīng)的標(biāo)志進(jìn)行取反,或調(diào)用其他子函數(shù),在消抖過程中,這里將數(shù)碼管顯示程序潛入以保證顯示的穩(wěn)定。</p><p><b>  3.4顯示程序</b></p><p>  顯示程序利用主函數(shù)

44、內(nèi)的循環(huán),實現(xiàn)動態(tài)掃描顯示,同時根據(jù)數(shù)碼管余輝和人眼暫留現(xiàn)象,即可實現(xiàn)顯示。本設(shè)計采用兩個四個一組的八位數(shù)碼管來顯示,一組顯示金額,另一組顯示路程與等待時間配合按鍵來切換。數(shù)據(jù)端都用單片機(jī)P1口,片選端分別接在P2口的高四位和低四位。</p><p>  4 Proteus軟件仿真</p><p>  本設(shè)計需要用 Keil uVision3 對C51程序進(jìn)行編譯,生成“.hex”文件。&

45、lt;/p><p>  在Proteus軟件中畫出仿真電路(如圖19),把Keil uVision3編譯后生成的“.hex”導(dǎo)入到單片機(jī)中,按“運行仿真”鍵進(jìn)行仿真</p><p>  如圖顯示的狀態(tài)設(shè)置為:單程,車速大于5km/h,當(dāng)路程等于7.2km時的顯示情況。</p><p><b>  5課程設(shè)計體會</b></p><

46、;p>  在本次單片機(jī)課程設(shè)計中,我們選擇的題目是基于51單片機(jī)的出租車計價器的設(shè)計。老師統(tǒng)一配發(fā)的主控芯片是AT89S52單片機(jī),要實現(xiàn)的計價器的基本功能是以按鍵為輸入控制方式,實現(xiàn)對出租車運行過程中狀態(tài)信息的測量,主要包括等待時間、金額和里程等,并將其顯示出來。</p><p>  經(jīng)一個星期的努力我們完成了所有的基本功能,在完成整個課程設(shè)計的過程中,我們遇到了許多困難,但在解決困難的同時,也收獲了許多

47、,現(xiàn)在就將在整個課程設(shè)計過程中的幾點收獲與體會總結(jié)如下:</p><p>  1、提高了單片機(jī)的C語言編程能力。</p><p>  雖然單片機(jī)原理這門課程是在上學(xué)期修的,之后的這段時間也沒有使用單片機(jī)實際的做一些設(shè)計,因為當(dāng)時是用匯編語言學(xué)習(xí)的單片機(jī),對C語言的編程方法不是很熟悉。因此,選題后我們使用郭天祥的《新概念51單片機(jī)設(shè)計》開始練習(xí)51單片機(jī)的C程序設(shè)計,一開始我們總想一下子把整

48、個程序?qū)懲辏S著更深入的學(xué)習(xí)后來發(fā)現(xiàn)這種想法是不對的),因而使自己的自信心很受挫。在這里我們得到的經(jīng)驗是使程序模塊化:將一個大的程序分為幾個主要模塊,分別完成,最后再組合在一起調(diào)試成功。</p><p>  2、使我們對硬件電路的分析及設(shè)計能力有了不小的進(jìn)步。</p><p>  本設(shè)計的硬件設(shè)計包括單片機(jī)AT89S52單元、測距單元、顯示單元、按鍵與指示單元。通過上網(wǎng)查找相關(guān)資料,雖然找

49、到了比較合適的電路圖,但因為對其原理理解的不是特別透徹,在實際的焊接過程中遇到了不少的困難,比如沒有共地、缺少濾波電容、電源壓降太大、缺少下拉電阻,焊接中焊點虛焊和短路等。在這里我們得到的經(jīng)驗是:拿到一個電路圖之后要對其進(jìn)行深入的分析,了解其原理,并修改其錯誤,同時在焊接的過程中一定要細(xì)心、耐心,只有不停的分析電路,查找故障,久而久之我們才能成為一個很好的設(shè)計者。</p><p>  3、增強(qiáng)了我們的團(tuán)隊意識。&

50、lt;/p><p>  在整個設(shè)計的過程中,我們之間發(fā)生了不少的爭執(zhí),在設(shè)計硬件電路時,我們對電路圖的選擇持有不同意見,在焊接過程中我們對整體布局布線也有過爭議,在程序編寫過程中對算法的選取,流程的設(shè)計也各持己見。由于我們各自的過分,堅持導(dǎo)致了一些不必要的時間浪費。在這里我們得到的經(jīng)驗是:在合作的過程中要善于聆聽對方的一間,要發(fā)現(xiàn)別人的長處,彌補(bǔ)自己的不足。一個團(tuán)隊只有能夠相互取長補(bǔ)短,才能夠在愉快的合作中更好得完成

51、任務(wù)。</p><p>  4、不要過于追求實物的產(chǎn)品化。</p><p>  在做課程設(shè)計的過程中,由于我們一開始考慮了許多復(fù)雜細(xì)小的情況,導(dǎo)致我們不知道從哪里開始入手,產(chǎn)生了許多不必要的麻煩。我們得到的經(jīng)驗是:遇到問題要抓主要矛盾,解決主要矛盾(實現(xiàn)基本功能)之后,再去考慮其他的細(xì)節(jié)問題。遇到問題不要只想,試著動手做就有思路了。</p><p><b>

52、;  參考文獻(xiàn)</b></p><p>  郭天祥.新概念51單片機(jī)C語言教程.電子工業(yè)出版社,2008</p><p>  余發(fā)山,王福忠.單片機(jī)原理及應(yīng)用技術(shù).中國礦業(yè)大學(xué)出版社,2008.6</p><p>  侯玉寶,陳忠平,李成群.基于Proteus的51系列單片機(jī)設(shè)計與仿真.電子工業(yè)出版社,2008</p><p> 

53、 李泉溪.單片機(jī)原理與應(yīng)用實例仿真.北京航空航天大學(xué)出版社,2009</p><p>  譚浩強(qiáng).C程序設(shè)計.清華大學(xué)出版社,1991</p><p>  樓然苗,胡佳文,李光飛等.單片機(jī)實驗與課程設(shè)計.浙江大學(xué)出版社,2010.10</p><p>  王曉敏.傳感器檢測技術(shù)及應(yīng)用.北京大學(xué)出版社,2010</p><p>  吳紅星.電機(jī)

54、驅(qū)動與控制專用集成電路及應(yīng)用.中國電力出版社,2006</p><p><b>  附1:源程序代碼</b></p><p>  //"里程和價格顯示程序"</p><p>  #include<reg52.h></p><p>  #include<intrins.h><

55、;/p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}</p><p>  #define SlaveAddrW 0x

56、A0//"寫命令"</p><p>  #define SlaveAddrR 0xA1//"讀命令"</p><p>  //"IIC總線引腳定義"</p><p>  sbit SDA = P1^0; //"數(shù)據(jù)線" //</p><p>  sbit S

57、CL = P1^1; //"時鐘線 "//</p><p>  //"語音芯片定義"</p><p>  sbit SS =P1^3;//"片選" </p><p>  sbit MOSI=P1^4;//"數(shù)據(jù)輸入" </p><p>  sbit MISO=P

58、1^5;//"數(shù)據(jù)輸出" </p><p>  sbit SCLK=P1^6;//"ISD4004時鐘"</p><p>  sbit ls138A=P2^0;//"138譯碼器的3個位選,A為低位"</p><p>  sbit ls138B=P2^1;</p><p>  sbi

59、t ls138C=P2^2;</p><p>  sbit kds=P2^3; //"單雙程控制開關(guān)"</p><p>  sbit kks=P2^4; //"開始控制開關(guān)"</p><p>  sbit kcx=P2^5; //"查詢控制開關(guān)"</p><p>  sbit kzt

60、=P2^6; //"暫??刂崎_關(guān)"</p><p>  sbit kql=P2^7;//"清零控制開關(guān)"</p><p>  sbit kjy=P1^2; //"上次記憶值查詢"</p><p><b>  //"變量定義"</b></p><

61、p>  uchar code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//"數(shù)碼管段碼"</p><p>  uint count,num0,k,zhuan,z,su,n;</p><p>  float gong,quan,jin,deng;</p><p>

62、;  uchar qiane,baie,shie,gee;//"金額的千,百,十,個"</p><p>  uchar qianc,baic,shic,gec;//"路程的千,百,十,個"</p><p><b>  //"函數(shù)聲明"</b></p><p>  void displa

63、y(float cheng,float e,bit biao);</p><p>  //"24C02函數(shù)聲明"</p><p>  void IIC_Start(void); </p><p>  void IIC_Stop(void); </p><p>  void IIC_Ack(bit ackbit); <

64、;/p><p>  void IIC_SendByte(unsigned char byt); </p><p>  bit IIC_WaitAck(void); </p><p>  unsigned char IIC_RecByte(void); </p><p>  void Write(uchar add,uchar dat);<

65、/p><p>  uint Read(uchar add);</p><p>  /////////////"24c02操作函數(shù)"//////////////</p><p>  //"總線啟動條件 "</p><p>  void IIC_Start(void)</p><p>&

66、lt;b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p><b>  SDA = 0;</b>

67、;</p><p><b>  somenop;</b></p><p><b>  SCL = 0;</b></p><p><b>  }</b></p><p>  //"總線停止條件 "</p><p>  void IIC

68、_Stop(void)</p><p><b>  {</b></p><p><b>  SDA = 0;</b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><

69、p><b>  SDA = 1;</b></p><p><b>  }</b></p><p>  //"應(yīng)答位控制 "</p><p>  void IIC_Ack(bit ackbit)</p><p><b>  {</b></p>

70、<p>  if(ackbit) </p><p><b>  {</b></p><p><b>  SDA = 0;</b></p><p><b>  }</b></p><p><b>  else </b></p>

71、<p><b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  }</b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b

72、></p><p><b>  somenop;</b></p><p><b>  SCL = 0;</b></p><p><b>  SDA = 1; </b></p><p><b>  somenop;</b></p><

73、;p><b>  }</b></p><p><b>  //"等待應(yīng)答 "</b></p><p>  bit IIC_WaitAck(void)</p><p><b>  {</b></p><p><b>  SDA = 1;<

74、/b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p>  if(SDA) </p><p><b>

75、  { </b></p><p><b>  SCL = 0;</b></p><p>  IIC_Stop();</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b

76、>  else </b></p><p><b>  { </b></p><p><b>  SCL = 0;</b></p><p><b>  return 1;</b></p><p><b>  }</b></p>

77、<p><b>  }</b></p><p>  //"通過I2C總線發(fā)送數(shù)據(jù) "</p><p>  void IIC_SendByte(unsigned char byt)</p><p><b>  {</b></p><p>  unsigned cha

78、r i;</p><p>  for(i=0;i<8;i++)</p><p><b>  { </b></p><p>  if(byt&0x80) </p><p><b>  {</b></p><p><b>  SDA = 1;<

79、/b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p><b>  SDA = 0;</b></p><p><b> 

80、 }</b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><p>  byt <<= 1;</p><p><b>  somenop;</b></p><p&g

81、t;<b>  SCL = 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //"從I2C總線上接收數(shù)據(jù) "</p><p>  unsigned char IIC_RecByte(void

82、)</p><p><b>  {</b></p><p>  unsigned char da;</p><p>  unsigned char i;</p><p>  for(i=0;i<8;i++)</p><p><b>  { </b></p>

83、;<p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p><b>  da <<= 1;</b></p><p><b>  if(SDA) </b></p><p> 

84、 da |= 0x01;</p><p><b>  SCL = 0;</b></p><p><b>  somenop;</b></p><p><b>  }</b></p><p>  return da;</p><p><b>  

85、}</b></p><p>  void Write(uchar add,uchar dat)</p><p><b>  { </b></p><p>  IIC_Start();</p><p>  IIC_SendByte(0xa0); </p><p>  IIC_WaitA

86、ck();</p><p>  IIC_SendByte(add);//"數(shù)據(jù)地址"</p><p>  IIC_WaitAck();</p><p>  IIC_SendByte(dat);//"寫入數(shù)據(jù)"</p><p>  IIC_WaitAck();</p><p>  

87、IIC_Stop();</p><p><b>  }</b></p><p>  uint Read(uchar add)</p><p><b>  {</b></p><p>  uchar dat;</p><p>  IIC_Start();</p>

88、<p>  IIC_SendByte(0xa0);</p><p>  IIC_WaitAck();</p><p>  IIC_SendByte(add);//"數(shù)據(jù)地址"</p><p>  IIC_WaitAck();</p><p>  IIC_Start();</p><p> 

89、 IIC_SendByte(0xa1);</p><p>  IIC_WaitAck();</p><p>  dat=IIC_RecByte();</p><p>  IIC_Ack(0);//"無應(yīng)答"</p><p>  IIC_Stop();</p><p>  return dat;<

90、;/p><p><b>  }</b></p><p>  ///////////////////"語音操作函數(shù)"//////////////////////////////</p><p>  void delay(unsigned int time)//"us延時"</p><p&g

91、t;<b>  { </b></p><p>  while(time!=0) </p><p><b>  { </b></p><p><b>  time--; </b></p><p><b>  } </b></p><p&g

92、t;<b>  } </b></p><p>  void delayms(unsigned int time)//"ms延時"</p><p><b>  { </b></p><p>  TMOD=0x11; </p><p>  for(time;time>0

93、;time--) </p><p><b>  { </b></p><p>  TH1=0xfc; </p><p>  TL1=0x18; </p><p><b>  TR1=1; </b></p><p>  while(TF1!=1) </p><

94、;p><b>  {;} </b></p><p><b>  TF1=0; </b></p><p><b>  TR1=0; </b></p><p><b>  } </b></p><p><b>  } </b><

95、;/p><p>  void isd_send(unsigned char isdx)//"spi串行發(fā)送子程序,8位數(shù)據(jù)"</p><p><b>  { </b></p><p>  unsigned char isx_counter; </p><p>  SS=0;//"ss=0,打開

96、spi通信端"</p><p><b>  SCLK=0; </b></p><p>  for(isx_counter=0;isx_counter<8;isx_counter++)//"先發(fā)低位再發(fā)高位,依次發(fā)送。"</p><p><b>  { </b></p>&l

97、t;p>  if((isdx&0x01)==1) </p><p><b>  MOSI=1; </b></p><p><b>  else </b></p><p><b>  MOSI=0; </b></p><p>  isdx=isdx>>1

98、; </p><p>  SCLK=1; //"上升沿鎖存數(shù)據(jù)"</p><p>  delay(2); </p><p>  SCLK=0; //"下降沿將數(shù)據(jù)讀走"</p><p>  delay(2); </p><p><b>  } </b>&

99、lt;/p><p><b>  } </b></p><p>  void isd_stop()//"stop指令(停止當(dāng)前操作)"</p><p><b>  { </b></p><p>  delay(10); </p><p>  isd_send(

100、0x30); </p><p>  SS=1; //"ss=1,關(guān)閉spi通信端"</p><p>  delayms(50); </p><p><b>  } </b></p><p>  void isd_powerup()//"發(fā)送上電指令 "</p>

101、<p><b>  { </b></p><p>  delay(10); </p><p>  isd_send(0x20); </p><p>  SS=1; //"ss=1,關(guān)閉spi通信端"</p><p>  delayms(50); </p><p&g

102、t;  } </p><p>  void isd_stopwrdn()//"發(fā)送掉電指令"</p><p><b>  { </b></p><p>  delay(10); </p><p>  isd_send(0x10); </p><p>  S

103、S=1; //"ss=1,關(guān)閉spi通信端"</p><p>  delayms(50); </p><p><b>  } </b></p><p>  void isd_play()//"發(fā)送play指令,從當(dāng)前地址開始放音,IAB=1"</p><p><b>

104、;  { </b></p><p>  isd_send(0xf0); </p><p>  SS=1; //"ss=1,關(guān)閉spi通信端"</p><p><b>  } </b></p><p>  void isd_rec()//"發(fā)送rec指令,從當(dāng)前地址開始錄音,I

105、AB=1"</p><p><b>  { </b></p><p>  isd_send(0xb0); </p><p>  SS=1; //"ss=1,關(guān)閉spi通信端"</p><p><b>  } </b></p><p>  

106、void isd_setplay(unsigned char adl,unsigned char adh)//"發(fā)送放音指令,從指定地址開始放音"</p><p><b>  { </b></p><p>  delayms(1); </p><p>  isd_send(adl); //"發(fā)送放音起始地址低位&q

107、uot;</p><p>  delay(2); </p><p>  isd_send(adh); //"發(fā)送放音起始地址高位"</p><p>  delay(2); </p><p>  isd_send(0xe0); //"發(fā)送放音指令字節(jié),IAB=0"</p><p>

108、  SS=1; //"ss=1,關(guān)閉spi通信端"</p><p><b>  } </b></p><p>  /*void isd_setrec(unsigned char adl,unsigned char adh)//"發(fā)送錄音指令,從指定地址開始錄音"</p><p><b> 

109、 { </b></p><p>  delayms(1); </p><p>  isd_send(adl); //"發(fā)送錄音起始地址低位"</p><p>  delay(2); </p><p>  isd_send(adh); //"發(fā)送錄音起始地址高位"</p&

110、gt;<p>  delay(2); </p><p>  isd_send(0xa0); //"發(fā)送錄音指令字節(jié),IAB=0"</p><p>  SS=1; //"ss=1,關(guān)閉spi通信端"</p><p><b>  }*/ </b></p><p>

111、  //////////"其它操作函數(shù)"///////////////////</p><p>  void delaynms(uint nms)</p><p>  { uint i,j;</p><p>  for(i=0;i<nms;i++)</p><p>  for(j=110;j>0;j--)

112、;</p><p><b>  } </b></p><p>  void init()</p><p>  { quan=0;</p><p><b>  jin=0;</b></p><p><b>  deng=0;</b></p>

113、;<p><b>  n=0;</b></p><p><b>  z=0;</b></p><p><b>  su=0;</b></p><p><b>  gong=0;</b></p><p><b>  num0=0;&l

114、t;/b></p><p><b>  count=0;</b></p><p><b>  zhuan=0;</b></p><p><b>  k=0;</b></p><p><b>  kds=1;</b></p><p&

115、gt;<b>  IT0=1;</b></p><p>  TMOD=0x11;</p><p>  TH0=(65536-50000)/256;</p><p>  TL0=(65536-50000)%256;</p><p><b>  EA=1;</b></p><p>

116、;<b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p><b>  EX0=1;</b></p><p><b>  }</b></p><p>  void main()</p><p&g

117、t;<b>  {</b></p><p>  uint wait,money; </p><p>  uint xun=0;</p><p>  uchar flag=0;</p><p>  display(0,0,0);</p><p>  if(kjy==0)//"按下為查看

118、上次記憶值"</p><p><b>  { </b></p><p>  delaynms(10);</p><p>  if(kjy==0)</p><p><b>  {</b></p><p>  wait=Read(0x00); //"讀取

119、24C02中上一次的等待時間、金額數(shù)據(jù)"</p><p>  delaynms(10);</p><p>  money=Read(0x02);</p><p>  delaynms(10);</p><p>  for(xun=200;xun>0;xun--)</p><p>  display(wa

120、it,money,1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(kks==0)</p><p><b>  {</b></p><p>  delaynms(10);</p>

121、<p>  if(kks==0) </p><p><b>  {</b></p><p><b>  init();</b></p><p>  isd_powerup();</p><p>  isd_setplay(0x00,0x00);</p><p&

122、gt;  isd_play(); //"發(fā)送放音指令"</p><p>  if(kds==0) //"開始計價后,顯示2秒鐘單價"</p><p><b>  {</b></p><p>  for(xun=200;xun>0;xun--)</p><p>  displa

123、y(1.5,jin,0);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(xun=200;xun>0;xun--)</p><p>  di

124、splay(2.0,jin,0);</p><p><b>  }</b></p><p><b>  while(1)</b></p><p><b>  { </b></p><p>  gong=k+quan/500;//"公里=公里數(shù)+圈數(shù)除以500,5

125、00轉(zhuǎn)為一公里"</p><p>  if(kds==0) //"按下為雙程"下是雙程</p><p><b>  { </b></p><p>  if(gong<=3)</p><p><b>  jin=5;</b></p><p&g

126、t;<b>  else </b></p><p>  jin=gong*1.5;</p><p>  display(gong,jin,0); //"顯示公里,金額"</p><p><b>  }</b></p><p>  if(kds==1)</p><

127、;p><b>  { </b></p><p>  if(gong<=3)</p><p><b>  jin=5;</b></p><p><b>  else </b></p><p>  jin=gong*2;</p><p>  di

128、splay(gong,jin,0); //"顯示公里,金額"</p><p><b>  }</b></p><p>  if(kcx==0)//"按下為查詢"</p><p><b>  { </b></p><p>  delaynms(10);<

129、;/p><p>  if(kcx==0)</p><p><b>  {</b></p><p>  deng=n*2+su/60; //"等待時間=2分鐘乘以其個數(shù)+不到120秒的分鐘數(shù)"</p><p>  for(xun=200;xun>0;xun--)</p><p&

130、gt;  display(deng,jin,1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(kzt==0) //"按下為暫停"</p><p><b>  { </b></p>

131、;<p>  delaynms(10);</p><p>  if(kzt==0)</p><p><b>  {</b></p><p><b>  EX0=0;</b></p><p><b>  ET0=0;</b></p><p>

132、  isd_powerup();</p><p>  isd_setplay(0x00,0x01);</p><p>  isd_play(); //"發(fā)送放音指令"</p><p><b>  while(1)</b></p><p><b>  {</b></p>

133、<p>  display(gong,jin,0); //"顯示公里,金額"</p><p>  if(kql==0)</p><p>  delaynms(10);</p><p>  if(kql==0)</p><p><b>  {</b></p><p>

134、;  deng=n*2+su/60;</p><p>  Write(0x00,deng);</p><p>  delaynms(10);</p><p>  Write(0x02,jin);</p><p>  delaynms(10);</p><p><b>  init();</b>&l

135、t;/p><p><b>  flag=1;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  if(kcx==0)//"按下為查詢"</p><p><b>

136、;  { </b></p><p>  delaynms(10);</p><p>  if(kcx==0)</p><p><b>  {</b></p><p>  deng=n*2+su/60; //"等待時間=2分鐘乘以其個數(shù)+不到120秒的分鐘數(shù)"</p>&

137、lt;p>  for(xun=200;xun>0;xun--)</p><p>  display(deng,jin,1);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

溫馨提示

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

評論

0/150

提交評論