版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 摘 要</b></p><p> 出租車已經(jīng)是城市交通的重要組成部分,從加強行業(yè)管理以及減少司機與乘客的糾紛出發(fā),具有良好性能的計價器對出租車司機和乘客來說都是很必要的。而采用模擬電路和數(shù)字電路設(shè)計的計價器整體電路的規(guī)模較大,用到的器件多,造成故障率高,難調(diào)試。而采用單片機進行的設(shè)計,相對來說功能強大,用較少的硬件和適當?shù)能浖嗷ヅ浜峡梢院苋菀椎貙崿F(xiàn)設(shè)計要求,
2、且靈活性強,可以通過軟件編程來完成更多的附加功能。本設(shè)計的是一個基于單片機AT89S52的出租車自動計費設(shè)計,附有復(fù)位電路,時鐘電路,鍵盤電路等。復(fù)位電路是單片機的初始化操作,除了正常的初始化外,為擺脫困境,通過復(fù)位電路可以重新開始。時鐘電路采用12MHz的晶振,作為系統(tǒng)的時鐘源,具有較高的準確性。</p><p> 在上電時LED數(shù)碼管顯示最初的起步價,里程收費,等待時間收費三種收費。按暫停鍵,計價器可暫停計
3、價,按查詢鍵,在LED數(shù)碼管上可以顯示運行時等待的時間。通過計算可以得出總共的費用和總的路程。在這里主要是以AT89S52單片機為核心控制器,P0口、P2 口接兩片四合一數(shù)碼管,P1口接按鍵,通過按鍵輸入。</p><p> 關(guān)鍵詞:單片機 AT89S52;LED數(shù)碼管;出租車計費器;</p><p><b> 目 錄</b></p><p&g
4、t;<b> 1 概述1</b></p><p> 1.1 課題簡介1</p><p> 1.2 功能要求1</p><p> 2 系統(tǒng)總體方案及硬件設(shè)計2</p><p> 2.1 系統(tǒng)工作原理及總體方案2</p><p> 2.2 單片機最小系統(tǒng)單元3</p>
5、;<p> 2.3 霍爾傳感器檢測單元3</p><p> 2.4 鍵盤調(diào)整單元5</p><p> 2.5 顯示單元5</p><p><b> 3 軟件設(shè)計7</b></p><p> 3.1系統(tǒng)主程序7</p><p> 3.2 按鍵掃描程序8</
6、p><p> 3.3 中斷程序9</p><p> 3.4 計算程序10</p><p> 3.5 顯示程序10</p><p><b> 4 實驗仿真12</b></p><p> 4.1 Proteus介紹12</p><p> 4.2 調(diào)試與測試1
7、2</p><p> 4.3 里程計價測試12</p><p> 5 課程設(shè)計體會14</p><p><b> 參考文獻15</b></p><p> 附1:系統(tǒng)原理圖16</p><p> 附2:源程序代碼16</p><p><b>
8、1 概述</b></p><p><b> 1.1 課題簡介</b></p><p> 出租車已經(jīng)是城市交通的重要組成部分,從加強行業(yè)管理以及減少司機與乘客的糾紛出發(fā),具有良好性能的計價器對出租車司機和乘客來說都是很必要的。為此,我們采用單片機系統(tǒng)設(shè)計了一款符合大眾化的計費系統(tǒng)。</p><p> 本方案以At89s52單片機
9、為中心、配合LED數(shù)碼管,實現(xiàn)對出租車計價統(tǒng)計。本方案可以實現(xiàn):</p><p> 1. 系統(tǒng)接收里程傳感器的脈沖輸入,并對脈沖進行計數(shù),繼而轉(zhuǎn)換為里程。</p><p> 2. 采用現(xiàn)行出租車的計價系統(tǒng)的計算方法,并對行駛里程進行計費,提供友好的用戶界面,并具有發(fā)光二極管指示操作狀態(tài)功能。</p><p><b> 1.2 功能要求</b&g
10、t;</p><p> 利用AT89s52單片機配合LED數(shù)碼管,實現(xiàn)基本的出租車計價功能,具體設(shè)計規(guī)格如下:</p><p> 1. 用前4位數(shù)碼管實時顯示里程數(shù),單位為公里,最后一位為小數(shù)位;用后4位數(shù)碼管時時顯示金額數(shù),單位為元,最后一位為小數(shù)位。</p><p> 2. 規(guī)定出租車單程價格為2元/公里,往返則價格為1.5元/公里;單程/往返分別由“單程
11、” 按鍵和“往返” 按鍵設(shè)定。</p><p> 3. 車速<5公里/小時的時間累積為總等待時間T(分鐘),每5分鐘等待時間相當于里程數(shù)增加1公里。</p><p> 4. 起步公里數(shù)為3公里,價格為5元;若實際運行大于3公里, 按“設(shè)計任務(wù)2”計算價格。</p><p> 5. 到達目的地后,按“暫停” 鍵,計價器可暫停計價。</p><
12、p> 6. 按“清除” 鍵,計價器能將記錄數(shù)據(jù)(里程、等待時間與價格等)自動清0。</p><p> 7. 按“查詢”鍵,能自動顯示總等待時間T,再按下該鍵回到顯示里程數(shù)、金額狀態(tài)。</p><p> 8. 擴展:空車指示、語音提示、信息存儲等</p><p> 2 系統(tǒng)總體方案及硬件設(shè)計</p><p> 2.1 系統(tǒng)工作原
13、理及總體方案</p><p> 出租車計價器用于記錄里程、等待時間、是否往返、起步公里數(shù)與價格的關(guān)系,它能有效地避免司機與乘客間的矛盾,保障雙方的利益。出租車行駛總路程可以通過車輪的周長乘車輪旋轉(zhuǎn)圈數(shù)得到。即可計算得到車輪旋轉(zhuǎn)幾周出租車能行駛一公里的路程。因此,使用霍爾傳感器的目的就是方便地計量車輪旋轉(zhuǎn)的圈數(shù)??稍谲囕嗈D(zhuǎn)盤上粘一個小磁鋼,當轉(zhuǎn)輪轉(zhuǎn)動時,霍爾傳感器檢測到磁場及其變化,產(chǎn)生脈沖信號。輸出的脈沖信號被
14、接入到AT89S52單片機系統(tǒng)中,通過計算接收到的脈沖個數(shù),計算出當前所行駛的路程。同時,根據(jù)不同的收費標準,選擇相應(yīng)的起步價、單價等收費標準進行計算。再配置上鍵盤和數(shù)碼顯示,通過鍵盤能夠?qū)崿F(xiàn)啟動、暫停計價器、切換顯示當前的行駛里程和需支付的車費。</p><p> 通過分析,需要實現(xiàn)四個主要的功能模塊,分別為脈沖計數(shù)模塊、定時器計時模塊、按鍵的處理以及數(shù)碼管動態(tài)掃描等功能。</p><p&
15、gt; 定時器計時模塊主要完成途中等待(即沒有脈沖來時)30秒的計時。在啟動鍵按下后,定時器就不停的計時,只要有脈沖來就將計時的值清除為零。如果沒有脈沖來,當計時超過30秒時,相應(yīng)的總金額要按照收費標準計價。</p><p> 中斷的管理:盡管中斷有嵌套以及優(yōu)先級的功能,但是由于定時器已經(jīng)使用一個了中斷資源,脈沖檢測不宜再采用中斷方式,而是采用查詢方式。由于需要不停的要清除30秒的計時,因此,脈沖的計數(shù)不采用
16、定時器的計數(shù)方式。</p><p> 啟動鍵觸發(fā)定時器開始工作,而定時器的運行可以作為脈沖計數(shù)的標志,只要定時器計時在運行,每來一個中斷都應(yīng)該計數(shù)。</p><p> 主程序完成鍵盤的掃描和按鍵的處理,查詢脈沖產(chǎn)生的中斷,并完成脈沖的計數(shù)。若每個脈沖代表1米,則當計數(shù)到1000時表示1千米的距離,相應(yīng)的總金額要按照收費標準計價。</p><p> 采用MCS5
17、1系列單片機AT89S51作為主控制器,外圍電路器件包括數(shù)碼管、獨立式鍵盤、復(fù)位電路等。</p><p> 模擬出租車計價器能根據(jù)總里程數(shù)、總等待時間長短、是否往返、起步公里數(shù)的情況作出相應(yīng)報價等。當然實際的出租車計價器還具有打印票據(jù),顯示是否空車等功能??傮w模塊如圖2.1所示。</p><p> 圖2.1 電路的組成部分</p><p> 2.2 單片機最小
18、系統(tǒng)單元</p><p> 主控機系統(tǒng)采用了Atmel 公司生產(chǎn)的 AT89S52單片機,它含有256 字節(jié)數(shù)據(jù)存儲器,內(nèi)置8K的電可擦除FLASH ROM,可重復(fù)編程,大小滿足主控機軟件系統(tǒng)設(shè)計,所以不必再擴展程序存儲器。復(fù)位電路和晶振電路是AT89S52工作所需的最簡外圍電路。單片機最小系統(tǒng)電路圖如圖2.2所示。</p><p> 圖2.2 單片機最小系統(tǒng)圖</p>
19、<p> 在復(fù)位電路中,按一下復(fù)位開關(guān)就使在RST端出現(xiàn)一段時間的高電平,外接11.0592M 晶振和兩個30pF電容組成系統(tǒng)的內(nèi)部時鐘電路。</p><p> 2.3 霍爾傳感器檢測單元</p><p> Us1881 屬于開關(guān)型的霍爾器件,其工作電壓范圍比較寬(3.5~24V),其輸出的信號符合TTL電平標準,可以直接接到單片機的IO 端口上,而且其最高檢測頻率可達到1
20、MHZ。</p><p> Us1881 集成霍耳開關(guān)由穩(wěn)壓器A、霍耳電勢發(fā)生器(即硅霍耳片)B、差分放大器C、施密特觸發(fā)器D和OC門輸出E五個基本部分組成。</p><p> 在輸入端輸入電壓Vcc,經(jīng)穩(wěn)壓器穩(wěn)壓后加在霍爾電勢發(fā)生器的兩端,根據(jù)霍爾效應(yīng)原理,當霍爾片處在磁場中時,在垂直于磁場的方向通以電流,則與這二者相垂直的方向上將會產(chǎn)生霍爾電勢差VH輸出,該VH信號經(jīng)放大器放大后送
21、至施密特觸發(fā)器整形,使其成為方波輸送到OC門輸出。當施加的磁場達到工作點(即Bop)時,觸發(fā)器輸出高電壓(相對于地電位),使三極管導(dǎo)通,此時OC門輸出端輸出低電壓,三極管截止,使OC門輸出高電壓,這種狀態(tài)為關(guān)。這樣兩次電壓變換,使霍爾開關(guān)完成了一次開關(guān)動作。</p><p> 圖2.3 霍爾開關(guān)集成傳感器原理圖及其輸出特性 </p><p> 里程計算是通過安裝在車輪上的霍爾元件檢測到
22、的信號,送到單片機,經(jīng)過處理計算,送給顯示顯示單元的?;魻杺鞲衅魇且环N磁傳感器。用它可以檢測磁場及其變化,可在各種與磁場有關(guān)的場合中使用?;魻杺鞲衅饕曰魻栃?yīng)為其工作基礎(chǔ),是由霍爾元件和它的附屬電路組成的集成傳感器?;魻杺鞲衅鞣譃榫€性型霍爾傳感器和開關(guān)型霍爾傳感器兩種。我們所用的是開關(guān)型霍爾傳感器。其原理圖如圖2.4所示:</p><p> 圖2.4 傳感器測距示意圖</p><p>
23、 我們選擇P3.2口作為信號輸入端,車輪每轉(zhuǎn)一圈(假設(shè)車輪周長為1米),霍爾開關(guān)就檢測并輸出信號,引起單片機中斷,對脈沖計數(shù),當計數(shù)達到一千次時,也就是1公里,單片機就控制金額自動增加。</p><p> 2.4 鍵盤調(diào)整單元</p><p> 獨立式鍵盤:獨立式鍵盤中,每個按鍵占用一根I/O口線,每個按鍵電路相對獨立。I/O口通過按鍵與地相連,I/O口有上拉電阻,無鍵按下時,引腳端為
24、高電平,有鍵按下時,引腳電平被拉低。I/O口內(nèi)部有上拉電阻時,外部可不接上拉電阻。鍵盤接口電路如圖2.5所示:</p><p> 圖2.5 鍵盤接口電路 </p><p> S1:接P1.0口,對上一次的計費進行清零,為下次載客準備。</p><p> S2:接P1.1口,能自動顯示總等待時間T,再按下該鍵回到顯示里程數(shù)、金額狀態(tài)。</p>&l
25、t;p> S3:接P1.2口,選擇是按單程計費還是雙程計費。</p><p> S4:接P1.3口,可以暫停計費,方便乘客結(jié)賬。 </p><p> 2.5 顯示單元 </p><p> 對于現(xiàn)實電路我們可以采用數(shù)碼管,也可以采用液晶顯示。LED數(shù)碼管特點有:壽命長、成本低、亮度高、故障少、視角大、可視距離遠等,但其顯示內(nèi)容有限。液晶顯示的特點有:顯
26、示內(nèi)容豐富等,但其驅(qū)動復(fù)雜,成本高;外部光線強時,可視距離近。綜合考慮,本次設(shè)計采用LED數(shù)碼管。顯示電路如圖2.6所示:</p><p><b> 圖2.6 顯示電路</b></p><p><b> 3 軟件設(shè)計</b></p><p> 軟件是單片機系統(tǒng)的靈魂,根據(jù)設(shè)計的要求,在本系統(tǒng)中本系統(tǒng)軟件中包括下面程序
27、模塊:</p><p> 主程序: 初始化系統(tǒng)涉及到的硬件模塊,掃描鍵盤,根據(jù)按鍵啟動/停止里程測量,實時更新單價、里程、等待時間、費用等信息顯示。 </p><p> 按鍵掃描程序:掃描按鍵,返回掃描結(jié)果。</p><p> 計算程序:將傳感器發(fā)出脈沖數(shù)轉(zhuǎn)換為公里數(shù),并根據(jù)規(guī)則計算對應(yīng)的費用。</p><p> 顯示子程序:將計算程
28、序得到的數(shù)據(jù)反映到數(shù)碼顯示管上。</p><p> 中斷程序:監(jiān)測行駛速度,統(tǒng)計等待時間。</p><p> 現(xiàn)在應(yīng)用更廣泛的是單片機C語言,因其簡單明了,故此次課程設(shè)計采用單片機C語言編程。</p><p><b> 3.1系統(tǒng)主程序</b></p><p> 在主程序模塊中,需要完成對各參量和接口的初始化、出
29、租車起價和單價的初始化以及中斷、計算、循環(huán)等工作。 </p><p> 當汽車運行起來時,就啟動計價,根據(jù)里程寄存器中的內(nèi)容計算和判斷行駛里程是否已超過起步價公里數(shù)。若已超過,則根據(jù)里程值、每公里的單價數(shù)和起步價數(shù)來計算出當前的總金額,并將結(jié)果存于總金額寄存器中;中途等待時,無脈沖輸入,不產(chǎn)生中斷,當
30、時間超過等待設(shè)定值時,開始進行計時,并把等待價格加到總金額里,然后將總金額、里程和單價、往返價格送數(shù)碼管顯示出來。程序流程如圖3.1所示:</p><p> 圖3.1 主程序流程</p><p> 3.2 按鍵掃描程序</p><p> 鍵盤實質(zhì)上是一組按鍵開關(guān)的集合,均利用機械觸點的合、斷作用。按鍵在閉合及斷開的瞬間均伴隨有一連串的抖動,抖動反應(yīng)在電壓上就是
31、呈現(xiàn)出高電平或低電平,為了確保CPU對一次按鍵動作只確認一次,必須消除抖動的影響。去抖通常有硬件去抖和軟件去抖兩種方法,本程序使用軟件延時去抖。 </p><p> 圖3.2 按鍵抖動信號波形</p><p> 對于獨立式鍵盤判鍵,首先看有鍵按下不,如果有鍵按下則延時一會兒,在判斷是否真的有鍵按下,如果確實有鍵按下,再判鍵釋放,最后執(zhí)行鍵功能程序。判鍵子函數(shù)的流程框圖如圖3.3所示:&
32、lt;/p><p> 圖3.3 判鍵子程序流程圖</p><p> 3.3 中斷程序 </p><p> 每當霍爾傳感器輸出一個低電平信號就使單片機中斷一次,當里程計數(shù)器對里程脈沖計滿1500次時,進入里程計數(shù)中斷服務(wù)程序中,里程變量加一。主函數(shù)中總金額也相應(yīng)地變化。在中途等待中斷程序中,每1ms產(chǎn)生一次中斷,將由當前里程計算出速度值送入某個緩存變量。把當前速度
33、值與預(yù)先設(shè)定的速度值相</p><p> 比較,當小于設(shè)定的車速時,進入等待計時。等待時間5分鐘相當于里程增加一公里。流程如圖3.4所示:</p><p><b> 圖3.4 中斷流程</b></p><p><b> 3.4 計算程序</b></p><p> 計算程序根據(jù)里程數(shù)分別進入不
34、同的計算公式。如果里程大于3公里,則執(zhí)行公式:總金額=起步價+(里程-3)*單價;否則,執(zhí)行公式:總金額=起步價。程序流程如3.5所示:</p><p> 圖3.5 計算程序流程</p><p><b> 3.5 顯示程序</b></p><p> 程序利用定時器每1ms產(chǎn)生一次中斷,相應(yīng)變量置位,點亮一個數(shù)碼管,顯示一位數(shù)據(jù),利用主函數(shù)
35、內(nèi)的循環(huán),實現(xiàn)動態(tài)掃描顯示,同時根據(jù)數(shù)碼管余輝和人眼暫留現(xiàn)象,即可實現(xiàn)顯示。</p><p> {0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段碼表示0-9</p><p> 圖3.6 顯示子程序流程</p><p><b> 4 實驗仿真</b></p>
36、<p> 4.1 Proteus介紹</p><p> Proteus軟件是來自英國Labcenter electronics公司的EDA工具軟件,它組合了高級原理布圖、混合模式SPICE仿真,PCB設(shè)計以及自動布線來實現(xiàn)一個完整的電子設(shè)計系統(tǒng)。此系統(tǒng)受益于15年來的持續(xù)開發(fā),被《電子世界》在其對PCB設(shè)計系統(tǒng)的比較文章中評為最好產(chǎn)品—“The Route to PCB CAD”。Proteus 產(chǎn)
37、品系列也包含了我們革命性的VSM技術(shù),用戶可以對基于微控制器的設(shè)計連同所有的周圍電子器件一起仿真。用戶甚至可以實時采用諸如LED/LCD、鍵盤、RS232終端等動態(tài)外設(shè)模型來對設(shè)計進行交互仿真。</p><p> 其功能模塊:—個易用而又功能強大的ISIS原理布圖工具;PROSPICE混合模型SPICE仿真;ARES PCB設(shè)計。PROSPICE 仿真器的一個擴展PROTEUS VSM:便于包括所有相關(guān)的器件的
38、基于微處理器設(shè)計的協(xié)同仿真。此外,還可以結(jié)合微控制器軟件使用動態(tài)的鍵盤,開關(guān),按鈕,LEDs甚至LCD顯示CPU模型。支持許多通用的微控制器,如PIC,AVR,HC11以及8051。最新支持ARM。交互的裝置模型包括:LED和LCD顯示,RS232終端,通用鍵盤,I2C,SPI器件。強大的調(diào)試工具,包括寄存器和存儲器,斷點和單步模式。IAR C-SPY 和Keil uVision2等開發(fā)工具的源層調(diào)試。應(yīng)用特殊模型的DLL界面-提供有關(guān)
39、元件庫的全部文件。</p><p><b> 4.2 調(diào)試與測試</b></p><p> 采用KeilC51編譯器進行源程序編譯及仿真調(diào)試,同時進行硬件電路板的設(shè)計制作。硬件電路制作完畢,用萬用表檢測有無短路開路等現(xiàn)象,確定硬件電路沒有問題后,用仿真頭與硬件電路相連,運行程序進行調(diào)試。</p><p> 若調(diào)試不成功,則可再單獨調(diào)試程序
40、和硬件電路。程序用軟件仿真運行,硬件電路再次檢查有無焊錯,或者元件與插座接觸不良等方面問題;確認均無問題后,再次把軟件和硬件聯(lián)機調(diào)試,直至功能正常。把程序燒錄進單片機STC89C52結(jié)束調(diào)試。</p><p> 4.3 里程計價測試</p><p> 由于實驗條件的限制,我們采用霍爾傳感器產(chǎn)生外部中斷,設(shè)定中斷間隔為10ms,假定1500個脈沖為1公里,則此時車速為1km/h=5圈/S
41、。整個系統(tǒng)以此為基礎(chǔ),通過計費程序完成中金額的計算。表4.1的測試條件是:假設(shè)單程的單價是2元,起步價為5元(包含3公里),分別不公里程測試得數(shù)據(jù)如表:</p><p> 表4.1 實際金額和里程數(shù)</p><p> 表4.2的測試條件是:假設(shè)在單程運行中的單價2元的情況下行駛了6km,進行中途等待,分別等待不同的時間(每5分鐘相當于增加1公里),起步價為5元(包含3km)。</
42、p><p> 表4.2 總金額對比</p><p><b> 5 課程設(shè)計體會</b></p><p> 出租車計費器系統(tǒng)的設(shè)計已經(jīng)全部完成,能按預(yù)期的效果進行模擬汽車啟動,停止,暫停等功能并能夠通過數(shù)碼管顯示車費數(shù)目。本款出租車計價器包括單價輸出、單價調(diào)整、顯示當前的行駛里程等功能。另外,多功能出租車計價器還具有性能可靠、電路簡單、成本低、
43、實用性強等特點,加上經(jīng)過優(yōu)化的程序,使其有很高的智能化水平。</p><p> 一個月來,經(jīng)過自己努力,基本上完成了設(shè)計要求的內(nèi)容,在系統(tǒng)可行性分析、原理圖設(shè)計等方面都作了許多實際工作,取得了一些成績,同時也遇到了一些問題,存在一些不足。經(jīng)過這一個月的學習,我覺得自己不論是在理論知識方面還是在動手能力方面都有了不小的進步,自己從中受益匪淺。這次設(shè)計很好的把以前學到的理論知識應(yīng)用于實踐,使我認識到理論知識與實踐之
44、間有一定的差距,只有通過不斷的努力學習和實踐才能很好的把理論知識應(yīng)用到實踐當中,也只有通過不斷的實踐才能對理論知識的理解。</p><p> 通過這次設(shè)計不僅學會了如何去查找相關(guān)資料,更重要的是通過查找資料和翻閱書籍學到了不少知識,擴大了知識面,提高了知識水平。經(jīng)過單元設(shè)計和系統(tǒng)設(shè)計鞏固了以前所學的專業(yè)知識,自己真正認識到理論聯(lián)系實際的重要性,為以后的學習和工作提供了很多有價值的經(jīng)驗。通過這次設(shè)計不僅增強了自己
45、的動腦能力和動手能力,也提高了我思考問題、分析問題、解決問題的能力,更重要的是學會用工程化的思想來解決問題。這在以前的學習過程中是不曾學到的。并且這次設(shè)計還使我認識到完整、嚴謹、科學分析問題、解決問題的思想是多么的重要,只有擁有了科學的態(tài)度才能設(shè)計出有用的產(chǎn)品。。</p><p> 為了使我們設(shè)計的系統(tǒng)更具人性化,電機的啟動,使用了手動開關(guān)按鍵,使用起來比較方便。</p><p> 通
46、常在不同的方式,不同的情況下都會有不同的收費標準;單程、白天和中途等待,考慮后首選用開關(guān)來實現(xiàn)這些切換功能,簡單方便,同時顯示器會顯示相應(yīng)的指示。最大的方便了司機的計費控制。并且能根據(jù)市場經(jīng)濟的變化而發(fā)生相應(yīng)的跳動計價。</p><p> 但是在設(shè)計和調(diào)試的過程中,也發(fā)現(xiàn)了一些問題,譬如計價的金額數(shù)有限,實際的里程可能會很遠,會超出實際的顯示范圍;計價過程出現(xiàn)突然斷電時如何處理這些問題,因此對此方案還可以進行進
47、一步改進,如:實現(xiàn)白天、晚上計費自動切換和具有記憶功能,也可以加上語音提示功能,防作弊功能等,這樣可能會更讓乘客放心乘坐出租車,并得到廣泛的應(yīng)用。</p><p><b> 參考文獻</b></p><p> [1] 譚浩強著. C程序設(shè)計[M]. 北京:清華大學出版社, 2005</p><p> [2] 余發(fā)山、王福忠編著.單片機原理
48、及應(yīng)用技術(shù)[M].中國礦業(yè)大學出版社,2008.6</p><p> [3] 賈宗璞、許合利.C語言程序設(shè)計[M].中國礦業(yè)大學出版社,2007.2</p><p> [4] 孫余凱.傳感器應(yīng)用電路300例[M]. 北京:電子工業(yè)出版社, 2008.</p><p> [5] 田立. 51單片機C語言程序設(shè)計快速入門[M]. 北京:人民郵電出版社, 2007&
49、lt;/p><p> [6] 霍爾傳感器原理及其應(yīng)用</p><p> 附1:系統(tǒng)原理圖 </p><p><b> 附2:源程序代碼</b></p><p> #include<reg52.h></p><p> #define uchar unsigned char<
50、/p><p> #define uint unsigned int</p><p> uchar qianwei,baiwei,shiwei,gewei; //顯示數(shù)據(jù)各個位置數(shù)字的臨時變量</p><p> char led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6
51、f};//段碼表示0-9</p><p> uint tt,aa,round,distance,cost,price,wait;//定義路程、價錢、等待時間及一些全局的變量等;</p><p> uchar dengdai,second,minute;</p><p> unsigned long wait_ten_ms;//記錄等待時間多少個10m
52、s</p><p> //按鍵的定義,所有按鍵按下去為低電平</p><p> sbit key0=P1^0; //清零</p><p> sbit key1=P1^1; //切換路程與等待時間</p><p> sbit key2=P1^2;
53、 //單程還是往返設(shè)置</p><p> sbit key3=P1^3; //暫停按鈕</p><p> sbit led1=P3^6;// 雙程 </p><p> sbit led2=P4^7;// 暫停</p><p> sbit led3=P5^4;// 堵車</p>
54、<p> sbit led4=P6^5; // 切換</p><p> bit key1_flag;//由于按鍵會自動復(fù)位,這個為標志位</p><p> bit key2_flag;</p><p> bit key3_flag;</p><p> bit flag;</p>
55、<p><b> //初始化函數(shù)</b></p><p> void initial_data(void)</p><p><b> {</b></p><p> distance=0;</p><p><b> cost=0;</b></p>
56、<p><b> second=0;</b></p><p><b> minute=0;</b></p><p> wait_ten_ms=0;</p><p> key1_flag=1; //</p><p> key2_flag=0; //單程or往返,接指示燈
57、;</p><p> key3_flag=1; //暫停,接指示燈;</p><p><b> flag=0;</b></p><p><b> round=0;</b></p><p> dengdai=0;</p><p> led1=1; //雙程指示
58、</p><p> led2=1; //暫停指示</p><p> led3=1; //堵車指示</p><p> led4=1; // 等待時間切換標志</p><p><b> }</b></p><p><b> //暫停程序</b></p&
59、gt;<p> void zanting(void)</p><p><b> {</b></p><p> if(key3_flag) </p><p><b> {</b></p><p> EX0=0; //關(guān)閉中斷和定時器</p>&
60、lt;p><b> TR0=0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> EX0=1;</b></
61、p><p><b> TR0=1;</b></p><p><b> }</b></p><p> key3_flag=!key3_flag;</p><p><b> }</b></p><p><b> //計算數(shù)據(jù)處理 </b
62、></p><p> void jisuan()</p><p><b> {</b></p><p> distance=round/60+wait_ten_ms/3000;//車輪轉(zhuǎn)60圈為100m,等待時間30s為100m</p><p> if(distance<=30) &
63、lt;/p><p> cost=50; </p><p> price=20; //單程價格 </p><p> if(key2_flag)price=15; //往返價格 </p><p> if(distance>30)</
64、p><p> cost=price*(distance-30)/10+50;</p><p> wait=minute*100+second;</p><p><b> }</b></p><p> //顯示的輔助程序,分離一個數(shù)的各個數(shù)字</p><p> void fenli(uint
65、 temp) //數(shù)據(jù)的分離處理 </p><p><b> {</b></p><p> if(temp>9999) temp=9999;</p><p> qianwei=temp/1000;</p><p> baiwei=temp/100%10;</p><p> shi
66、wei=temp%100/10;</p><p> gewei=temp%10; </p><p><b> }</b></p><p> //延時約1ms,數(shù)碼管顯示時使用</p><p> void diplay_delay(void) </p><p>
67、<b> {</b></p><p><b> uint i;</b></p><p> for(i=0;i<290;i++);</p><p><b> }</b></p><p><b> //顯示程序;</b></p>
68、<p> void led_show()</p><p><b> {</b></p><p> //-----顯示路程或者等待時間----</p><p> if(key1_flag) fenli(distance);</p><p> else fenli(wait);</p>
69、<p> P2=0xfe; </p><p> P0=led_seg_code[gewei];</p><p> diplay_delay();</p><p><b> P2=0xfd;</b></p><p> if(key1_flag) P0=led_seg_code[shiwei]|0
70、x80; //如果是路程,點亮小數(shù)點兒</p><p> else P0=led_seg_code[shiwei]; //如果是時間,不需要點亮小數(shù)點兒</p><p> diplay_delay();</p><p><b> P2=0xfb;</b></p><p> if(key1_fl
71、ag) P0=led_seg_code[baiwei];</p><p> else P0=led_seg_code[baiwei]|0x80; </p><p> diplay_delay();</p><p><b> P2=0xf7;</b></p><p> P0=led_seg
72、_code[qianwei];</p><p> diplay_delay();</p><p> //-----顯示價格----</p><p> fenli(cost);</p><p><b> P2=0xef;</b></p><p> P0=led_seg_code[gewei
73、];</p><p> diplay_delay();</p><p><b> P2=0xdf;</b></p><p> P0=led_seg_code[shiwei]|0x80;</p><p> diplay_delay();</p><p><b> P2=0xbf;
74、</b></p><p> P0=led_seg_code[baiwei];</p><p> diplay_delay();</p><p><b> P2=0x7f;</b></p><p> P0=led_seg_code[qianwei];</p><p> dipl
75、ay_delay();</p><p><b> P2=0xff;</b></p><p><b> }</b></p><p> //延時時基為1ms</p><p> void delay(uint x) </p><p&
76、gt;<b> {</b></p><p><b> int i,j;</b></p><p> for(i=x;i>0;i--)</p><p> for(j=340;j>0;j--);</p><p><b> }</b></p><
77、;p><b> //鍵盤的掃描</b></p><p> void keyscan()</p><p> { if(key1==0) // 按鍵消抖并判斷按下去的次數(shù)為基數(shù)還是偶數(shù) </p><p> { delay(5);</p><p>
78、 if(key1==0)</p><p> key1_flag=!key1_flag;</p><p> while(!key1)led_show();</p><p><b> delay(5);</b></p><p> while(!key1)led_show(); </p><p
79、><b> }</b></p><p> if(key0==0) // 清零 </p><p> { delay(5);</p><p> if(key0==0)</p><p> initial_data();</p><
80、p><b> }</b></p><p> if(key3==0) // 暫停 </p><p> { delay(5);</p><p> if(key3==0)</p><p> zanting();</p><p>
81、; while(!key3)led_show();</p><p><b> delay(5);</b></p><p> while(!key3)led_show();</p><p><b> }</b></p><p> if(key2==0) // 單程還是往返
82、 </p><p> { delay(5);</p><p> if(key2==0) </p><p> key2_flag=!key2_flag;</p><p> while(!key2)led_show();</p><p><b> delay
83、(5);</b></p><p> while(!key2)led_show();</p><p><b> }</b></p><p><b> //指示燈掃描</b></p><p> led1=!key2_flag; // 指示,單程還是往返,燈低電平點亮; 往返亮;&
84、lt;/p><p> led2=key3_flag; // 指示,暫停時亮;</p><p> led3=flag; // 指示是否等待;</p><p> led4=key1_flag; //切換指示,顯示路程還是等待時間;</p><p> diplay_delay(); </p><
85、p><b> }</b></p><p> //中斷及定時器初始化 </p><p> void initial_time() </p><p><b> {</b></p><p> TMOD=0x01; //工作在模式1</p><p>
86、TH0=(65536-10000)/256;</p><p> TL0=(65536-10000)%256;</p><p><b> IE=0x83;</b></p><p> IT0=1; //外部邊沿觸發(fā)方式 </p><p><b> TR0=1;</b></p>
87、<p><b> }</b></p><p> // 中斷記錄脈沖數(shù)</p><p> void zd() interrupt 0 //中斷0</p><p><b> {</b></p><p><b> aa++;</b></p>&
88、lt;p> if(flag)round++; </p><p><b> }</b></p><p> //********* 定時器 ********</p><p> void time0() interrupt 1 //定時0</p><p><b> {</b>&
89、lt;/p><p> TH0=(65536-10000)/256; //10ms</p><p> TL0=(65536-10000)%256;</p><p><b> tt++;</b></p><p> if(tt>=100) //1s采樣</p><p><b
90、> {</b></p><p><b> tt=0;</b></p><p> aa=aa/5; //速度(n*圈/s)</p><p> if(aa<=5) flag=0;</p><p> else flag=1; </p>
91、<p><b> aa=0;</b></p><p><b> }</b></p><p><b> if(!flag)</b></p><p><b> { </b></p><p> wait_ten_ms++;</p>
92、<p> dengdai++;</p><p> if(dengdai==100)</p><p> { dengdai=0;</p><p><b> second++;</b></p><p> if(second==60)</p><p><b> { &
93、lt;/b></p><p><b> minute++;</b></p><p><b> second=0;</b></p><p><b> }</b></p><p><b> } </b></p><p
94、><b> }</b></p><p><b> }</b></p><p> //主程序 </p><p> void main(void)</p><p><b> {</b></p><p>
95、 initial_data(); //初始化數(shù)據(jù)</p><p> initial_time(); //初始化定時器</p><p><b> while(1)</b></p><p><b> {</b></p><p> keyscan();<
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計--出租車計價器
- 單片機課程設(shè)計---出租車計價器
- 單片機課程設(shè)計--出租車計價器
- 單片機課程設(shè)計出租車計價器
- 單片機課程設(shè)計----出租車計價器
- 單片機課程設(shè)計-出租車計價器
- 單片機課程設(shè)計--出租車計價器
- 單片機課程設(shè)計--出租車計價器設(shè)計
- 單片機課程設(shè)計---出租車計價器設(shè)計
- 單片機課程設(shè)計論文---出租車計價器
- 課程設(shè)計---基于51單片機的出租車計價器
- 課程設(shè)計--基于單片機的出租車計價器的設(shè)計
- 基于單片機的出租車計價器的設(shè)計(課程設(shè)計)
- 畢業(yè)設(shè)計(論文)-單片機課程設(shè)計出租車計價器
- 基于單片機的出租車計價器設(shè)計
- 基于單片機的出租車計價器
- 出租車計價器課程設(shè)計
- 出租車計價器課程設(shè)計
- 出租車計價器課程設(shè)計
- 出租車計價器課程設(shè)計
評論
0/150
提交評論