版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 基于STC89C52單片機出租車計價器設計</p><p><b> 摘 要</b></p><p> 隨著城市建設日益加快,象征著城市面貌的出租車行業(yè)也將加速發(fā)展?,F(xiàn)在各大中城市出租車行業(yè)都已普及自動計價器,所以計價器技術的發(fā)展有很好的前景。盡管小城市尚未普及,但計價器的普及也是毫無疑問的,所以未來汽車計價器的市場還是十分有潛力的。<
2、/p><p> 出租車計價器是單片機的一種典型應用?;趩纹瑱C的計價器是由單片機和外部電路組成。包括檢測模塊,控制模塊,人機模塊。里程檢測模塊由A44E構成,控制模塊包括STC89C52單片機和AT24C02,人機模塊包括獨立鍵盤和LED動態(tài)顯示。</p><p><b> 系統(tǒng)性能指標</b></p><p><b> 1.設定價
3、格;</b></p><p> 2.顯示當前單價、行駛里程和總金額;</p><p> 3.里程精確到0.1公里。</p><p> 通過多次調試系統(tǒng)性能達到設計要求。</p><p> 關鍵詞:STC89C52,霍爾傳感器A44E ,I2C總線,動態(tài)顯示</p><p> Design of T
4、aximeter Based on STC89C52</p><p><b> ABSTRACT</b></p><p> With the rapid development of city constriction, the taxi industry which symbolizes the cityscape also has an accelerated
5、 progress. Nowadays the automatic taximeter has been widely used in taxi industry in many cites. Therefore, the development of automatic taximeter is doomed. Although automatic taximeter is not spread in some towns, ther
6、e is no doubt that it would be popularized. Thus, in future the business of automatic taximeter is still potential. </p><p> One typical application of single chip computer is automatic taximeter. The hardw
7、are of this design is composed of single chip computer and peripheral circuits which consist of Detection Unit, Processing Unit and Human Computer Interaction Unit. The Detection Unit is based on Hall-effect sensor. The
8、Processing Unit contains STC89C52 and AT24C02. Human Computer Interaction Unit is composed of keyboard and LED.</p><p> The function of this system includes as follows:</p><p> Set the unit pr
9、ice;</p><p> Display the unit price, total amount and mileage.</p><p> Accuracy: 0.1km. </p><p> After repeatedly debugging, the performance of this system is reached the design
10、requirements. </p><p> KEY WORDS: STC89C52, Hall-effect sensor, A44E, I2C Bus, Dynamic display</p><p><b> 目 錄</b></p><p><b> 前 言1</b></p><p>
11、; 第1章 系統(tǒng)工作原理3</p><p> 1.1功能要求3</p><p> 1.2基本原理3</p><p> 第2章 硬件設計5</p><p> 2.1 單片機最小系統(tǒng)單元5</p><p> 2.2 霍爾傳感器單元6</p><p> 2.3 掉電存儲單
12、元8</p><p> 2.4 鍵盤調整單元9</p><p> 2.5 顯示單元10</p><p> 第3章 軟件設計14</p><p> 3.1 系統(tǒng)主程序14</p><p> 3.2 里程計數(shù)中斷程序15</p><p> 3.3 中途等待中斷程序15<
13、;/p><p> 3.4 計算程序17</p><p> 3.5 顯示程序18</p><p> 3.6 鍵盤程序18</p><p> 第4章 調試改進過程及運行結果分析21</p><p> 4.1 動態(tài)掃描的調試和分析21</p><p> 4.2 AT24C02的編程與
14、調試21</p><p> 4.3 按鍵查詢功能的實現(xiàn)21</p><p> 4.4 計算程序的分析與設計22</p><p> 4.5 結果分析與性能改進23</p><p> 4.6 計價器系統(tǒng)的仿真23</p><p><b> 結 論26</b></p>
15、<p><b> 謝 辭27</b></p><p><b> 參考文獻28</b></p><p> 附 錄A 系統(tǒng)原理圖30</p><p> 附 錄B 仿真圖PCB板31</p><p> 附 錄C 系統(tǒng)源程序33</p><p>
16、;<b> 外文資料翻譯55</b></p><p><b> 前 言</b></p><p> 單片機是一種可通過編程控制的微處理器,雖其自身不能單獨用在某項工程或產(chǎn)品上,但當其與外圍數(shù)字器件和模擬器件結合時便可發(fā)揮強大的功能,現(xiàn)在單片機已廣泛應用于眾多領域。舉例如下:</p><p> 1. 工業(yè)自動化。如數(shù)
17、據(jù)采集、測控技術。</p><p> 2. 智能儀器儀表。如數(shù)字示波器、數(shù)字信號源、感應電流表等。</p><p> 3. 消費類電子產(chǎn)品。如空調機、微波爐、IC卡、汽車電子設備等。</p><p> 4. 通信方面。如調制解調器、程控交換技術等。</p><p> 5. 武器裝備。如飛機、軍艦、導彈、魚雷制導、智能武器等。</
18、p><p> 作為與自動化技術和電子密切相關的理工科學生,掌握單片機是最簡單也最基礎的要求。為了進一步豐富和鞏固單片機知識,也為了能更好的聯(lián)系實際應用,本次畢業(yè)設計選擇了基于單片機STC89C52控制的出租車計價器,并力求能做出實物。</p><p> 鑒于電子技術、計算機技術以及各種更先進的仿真軟件的出現(xiàn),使用高級語言如C代替匯編語言進行編程和控制已成為現(xiàn)實,也成為一種發(fā)展趨勢。單片機C
19、語言編程相對于MC51匯編語言編程有如下優(yōu)點:</p><p> 1. 對單片機的指令系統(tǒng)不需要有很深的理解就可以編程操作單片機。</p><p> 2. 寄存器分配、不同存儲器的尋址及數(shù)據(jù)類型等細節(jié)完全由編輯器自動處理。</p><p> 3. 程序有規(guī)范的結構,可分為不同的函數(shù),可使程序結構化。</p><p> 4. 庫中包括許
20、多標準子程序,具有較強的處理能力,使用方便。</p><p> 5. 具有方便的模塊化編程技術,使已編好的程序便于移植,可極大縮短開發(fā)時間,增加程序的可讀性和可維護性。</p><p> 事實上,當今許多硬件的開發(fā)都已開始用C語言編程,如各種單片機、DSP、ARM等,用C語言進行工業(yè)控制也已成為一種趨勢,為了更好的適應當今社會形勢,為了更好的面對挑戰(zhàn)、把握機遇,此次畢業(yè)設計決定嘗試用C
21、語言編程完成。也希望能在進一步熟悉單片機控制的同時,對數(shù)字電子技術、模擬電子技術、計算控制技術以及常用外圍芯片有更深層次的了解,提高自己的綜合能力。</p><p> 綜上:基于單片機STC89C52設計的出租車計價器不僅可方便的用軟件代替硬件,降低成本,具備一般計價器的計算里程和顯示總金額的功能,還具備了掉電保持,白天、夜晚單價切換,并且還可很方便的擴展為速度測試儀,具有很好市場前景。</p>
22、<p><b> 功能要求</b></p><p> 1. 設計一個出租車計價器,并利用霍爾傳感器和單片機內(nèi)集成的計數(shù)器測試出出租車運行里程。</p><p> 2. 要求單價可調,里程精確到0.1公里,并要求對等待時間進行計時。</p><p> 3. 利用I2C總線通過EEPROM對存儲空間進行擴展,使其具備掉電存儲功能。
23、</p><p> 4. 有完整的軟件仿真結果和硬件電路,并用Protel設計系統(tǒng)原理圖。</p><p> 第1章 系統(tǒng)工作原理</p><p><b> 功能要求</b></p><p> 出租車計價器是根據(jù)乘客乘坐汽車行駛距離和等候時間的多少進行計價的,并在行駛中同步顯示本次消費、運行里程、運行單價以及等待
24、時間等信息。從起步開始,當汽車行駛里程未滿3公里時,均按起步價計算。超過3公里后,實現(xiàn)每1公里單價收費,中間遇到暫停時,計程數(shù)不再增加,開始計時收費,計程收費和計時收費的和便構成了一位乘客的車費。同時,白天和夜晚價格不同,可以進行切換。白天單價、夜晚單價、等待單價和起步價格都可通過獨立鍵盤進行調節(jié)。(默認起步價為5元/3公里,里程單價白天為2.5元/公里,夜晚為3.5元/公里,等待計時單價為1元/1分鐘)</p><
25、p> 為提高計時、計價精度,確保乘客對自己消費的知情權,出租車計價器應做到里程數(shù)精確到0.1公里,同時為減少司機朋友來回調整單價以及停車后需重設單價的麻煩,計價器應具有掉電保持功能,即當重新啟動后維持原有數(shù)值(包括總金額、等待時間、行駛里程、單價)不變,直至強制按下清零鍵,計價器顯示起步價(剛起步時對應總金額)、運行單價,為下一次計價做準備。</p><p><b> 基本原理</b&g
26、t;</p><p> 計價器系統(tǒng)主要由五部分組成:分別為基于霍爾傳感器A44E的里程檢測單元、STC89C52單片機、外擴串行EEPROM-AT24C02、獨立鍵盤和LED顯示。</p><p> 霍爾傳感器主要用于檢測汽車行使的里程數(shù),出租車車輪每旋轉一周,霍爾傳感器A44E便產(chǎn)生一相應的脈沖輸出,并把該脈沖交由單片機進行處理,單片機則根據(jù)程序設定,通過計算脈沖個數(shù)換算出已行駛里程
27、(里程=脈沖個數(shù)*出租車車輪周長),然后再根據(jù)從EEPROM-AT24C02中讀取的單價等相關數(shù)據(jù)進行總的消費金額的計算:當里程小于3公里時,總金額=起步價+等待時間*等待單價;當里程大于3公里時,總金額=起步價+(里程-3)*運行單價+等待時間*等待單價;計算好的金額、等待時間、里程和單價等數(shù)據(jù)信息都可實時地顯示在數(shù)碼管上。其中,等待時間可根據(jù)霍爾傳感器A44E是否有脈沖輸出加以判斷,如可設定等待時基為5s,即假如A44E在5s后仍無
28、脈沖輸出便認為進入等待時間,并由單片機STC89C52內(nèi)部計時器對其進行計時。</p><p> 獨立鍵盤可以調整單價等相關數(shù)據(jù),當按下某按鍵,會給單片機相應端口一低電平信號,單片機會通過循環(huán)掃描檢測到此信號,并根據(jù)預先設置好的程序做出相應的處理;調整好的數(shù)據(jù)存儲到EEPROM中,掉電后可以使該數(shù)據(jù)不丟失,下次得電后直接從EEPROM-AT24C02中讀到單片機,并通過數(shù)碼管實時顯示。系統(tǒng)結構圖如圖1-1所示。
29、</p><p><b> 圖1-1系統(tǒng)結構圖</b></p><p><b> 第2章 硬件設計</b></p><p> 2.1 單片機最小系統(tǒng)單元</p><p> 主控機系統(tǒng)采用STC公司生產(chǎn)的 STC89C52單片機,它含有512 字節(jié)數(shù)據(jù)存儲器RAM,內(nèi)置8K 的電可擦除FLAS
30、H ROM,可重復編程,大小滿足主控機軟件系統(tǒng)設計,所以不必再擴展程序存儲器。芯片外圍電路最高可接入40MHZ的晶振(AT單片機數(shù)值一般為24MHZ)。復位電路和晶振電路,以及P0口接入的10K的上拉電阻便構成了STC89C52 單片機工作所需的最簡外圍電路。單片機最小系統(tǒng)電路圖如圖2-1所示。</p><p> 圖2-1 單片機最小系統(tǒng)</p><p> STC89C52單片機的復位
31、端接74LS14,它是一個史密特觸發(fā)輸入的芯片,高電平有效,具有穩(wěn)定波形的作用。RST端若由低電平上升到高電平并持續(xù)2個周期,系統(tǒng)將實現(xiàn)一次復位操作;在該復位電路中,按一下復位開關,利用電容沖放電的所產(chǎn)生的延時,就會在RST端產(chǎn)生一段時間的高電平,進而進行復位操作。外接12M的晶振和兩個30pF 電容組成系統(tǒng)的內(nèi)部時鐘電路,其中電容主要起到濾波、微調以及利用其充放電過程幫助單片機晶振啟振的作用 [1] 。</p><
32、p> 對于單片機的P0口,可以作為地址/數(shù)據(jù)總線使用,也可以作為一般的I/O口使用。但當其作為I/O使用時,由于輸出屬于開漏電路,無上拉電阻故也無法進行高低電平的操作,此時必須接上拉電阻,一般阻值選為10K。但P0口不能同時作為地址/數(shù)據(jù)總線和I/O使用。本設計利用P0口的I/O功能 [2] 。</p><p> 2.2 霍爾傳感器單元</p><p> A44E 屬于開關型的
33、霍爾器件,其工作電壓范圍比較寬(4.5~18V),其輸出的信號符合TTL電平標準,可以直接接到單片機的I/O 端口上,而且其最高檢測頻率可達到1MHZ[3] 。</p><p> A44E 集成霍耳開關由穩(wěn)壓器A、霍耳電勢發(fā)生器(即硅霍耳片)B、差分放大器C、施密特觸發(fā)器D和OC門輸出E五個基本部分組成。</p><p> 在輸入端輸入電壓Vcc,經(jīng)穩(wěn)壓器穩(wěn)壓后加在霍爾電勢發(fā)生器的兩端
34、,根據(jù)霍爾效應原理,當霍爾片處在磁場中時,在垂直于磁場的方向通以電流,則與這二者相垂直的方向上將會產(chǎn)生霍爾電勢差VH輸出,該VH信號經(jīng)放大器放大后送至施密特觸發(fā)器整形,使其成為方波輸送到OC門輸出。當施加的磁場達到工作點時,觸發(fā)器輸出高電平,三極管導通, OC門輸出端輸出低電壓,這種狀態(tài)為開;當觸發(fā)器輸出低電平時,三極管截止,OC門輸出高電壓,這種狀態(tài)為關 [4] 。這樣兩次電壓變換,使霍爾開關完成了一次開關動作。A44E霍爾傳感器原理
35、如圖2-2所示。</p><p> 圖2-2 A44E霍爾傳感器原理</p><p> 里程計算主要通過霍爾傳感器A44E檢測完成,出租車車輪每旋轉一周,霍爾傳感器A44E便產(chǎn)生一相應的脈沖輸出,并把該脈沖交由單片機進行處理,單片機則根據(jù)程序設定,通過計算脈沖個數(shù)換算出已行駛里程:里程=脈沖個數(shù)*出租車車輪周長。其原理如圖2-3所示。</p><p>
36、 圖2-3傳感器測距示意圖</p><p> 本系統(tǒng)選擇將A44E的脈沖輸出端接到P3.2口,即做為定時器/計數(shù)器1的輸入端,車輪每轉一圈(設車輪的周長是2米),霍爾開關便輸出一低電平信號,然后利用單片機定時器1對該脈沖計數(shù),當計數(shù)達到500次時,則達到1公里,單片機將自動刷新里程、總金額等信息。</p><p> 2.3 掉電存儲單元</p><p> A
37、T24C02的作用是在電源斷開的時候,存儲當前設定的總金額,等待時間,運行里程以及單價等信息。AT24C02 是Ateml公司的2KB的電可擦除存儲芯片,采用兩線串行的總線和單片機通訊,電壓最低可以到2.5V,額定電流為1mA,靜態(tài)電流10uA(5.5V),芯片內(nèi)的資料可以在斷電的情況下保存40年以上,而且采用8 腳的DIP 封裝,使用方便。AT24C02芯片引腳配置如圖2-4所示。</p><p> 圖2-4
38、 AT24C02引腳配置圖</p><p> 圖中R4、R5 是上拉電阻,其作用是減少AT24C02 的靜態(tài)功耗。由于AT24C02的數(shù)據(jù)線和地址線是復用的,采用串口的方式傳送數(shù)據(jù),只用兩根線SCL(時鐘脈沖)和SDA(數(shù)據(jù)/地址)與單片機P3.6和P3.7口連接,進行傳送數(shù)據(jù)時遵守I2C總線協(xié)議。</p><p> 每當設定一次單價,系統(tǒng)就調用存儲程序,將單價信息保存在芯片內(nèi);當系統(tǒng)
39、重新上電的時候,自動調用讀存儲器程序,將存儲器內(nèi)的單價等信息,讀到緩存單元中,供主程序使用。</p><p> 事實上AT24C02為典型的支持I2C總線的器件,對其進行編程時需遵守I2C總線的時序要求,以及I2C委員會對各種I2C芯片的地址分配規(guī)則。現(xiàn)把I2C總線與AT24C02的通訊時序、通訊規(guī)則簡要介紹如下:</p><p> 1. I2C總線節(jié)點的尋址字節(jié)</p>
40、<p> 主機產(chǎn)生起始條件后,發(fā)送的第一個字節(jié)為尋址字節(jié)。該字節(jié)的頭七位為從機地址,對于AT24C02來說高四位為1010,它是I2C總線器件的固有地址,緊接著是A1、A2、A3通過接地或者高電平?jīng)Q定外圍器件的地址數(shù)據(jù),第八位是讀寫控制為,當為0是表示主節(jié)點向從節(jié)點發(fā)送數(shù)據(jù),當為1時表示要接收數(shù)據(jù)。</p><p> 2. I2C總線數(shù)據(jù)傳輸?shù)母袷?lt;/p><p> (1
41、) 主控器的寫數(shù)據(jù)格式:</p><p> 首先由主機發(fā)送起始信號—當SCL為高電平時,SDA由高到低有跳變;然后發(fā)一個尋址字節(jié),當收到應答信號后發(fā)送數(shù)據(jù),其中應答信號為當SCL為高時SDA傳送0,并持續(xù)4.7us以上;當主機產(chǎn)生停止信號時,數(shù)據(jù)傳送結束,停止信號是當SCL為高電平時SDA有一個由低到高的跳變。</p><p> (2)主控器的讀數(shù)據(jù)格式:</p><
42、;p> 與寫數(shù)據(jù)的不同之處在于數(shù)據(jù)發(fā)送結束和停止位之間加一個非應答位,表示數(shù)據(jù)發(fā)送結束,格式為當SCL為高時SDA傳送1,并持續(xù)4.7us以上。 </p><p> 3. 要特別注意的是SDA和SCL都是雙向傳輸線,平時均處于高電平備用狀態(tài),只有當需要關閉時才使其鉗制在低電平,且僅在SCL為高電平時數(shù)據(jù)才能傳送,而當SCL為低電平時才允許數(shù)據(jù)發(fā)生變化。</p><p> 2.4
43、 鍵盤調整單元</p><p> 當單價等信息需要進行修改時,就要用到鍵盤。由于調節(jié)信息不多,故采用5個獨立鍵盤即可,分別實現(xiàn)清零、切換、增大、減小和功能等作用。電路原理如圖2-5所示。</p><p> 圖2-5 鍵盤調整單元接線圖</p><p> 圖中,鍵盤從上至下依次為:</p><p> S0:接P1.0口,對上一次的計費進
44、行清零,為下次載客做準備;</p><p> S1:接P1.1口,通過對功能鍵S3按下次數(shù)的計數(shù),實現(xiàn)單價數(shù)據(jù)的增大;</p><p> S2:接P1.2口,通過對功能鍵S3按下次數(shù)的計數(shù),實現(xiàn)單價數(shù)據(jù)的減?。?lt;/p><p> S3:接P1.3口,按1次,進入調整白天單價;按2次,進入調整夜晚單價;按3次,進入調整等待單價;按4次,進入調整起步價;按5次,返
45、回。</p><p> S4: 實現(xiàn)白天單價和夜晚單價的切換。</p><p> 需要注意的時,當按鍵按下和釋放的瞬間都有抖動現(xiàn)象,一般來說,抖動的時間長短與鍵盤的機械特性有關,大約為5-10ms [5] 。所以在實際編程時一定要注意鍵盤的去抖動。鍵盤去抖動有專用的延時電路,也有專門的延時芯片,也可以用軟件去抖,考慮到電路的難易程度,從簡化硬件的角度,本次設計采用軟件去抖動,用一個短延
46、時程序,進行鍵盤去抖操作。</p><p><b> 2.5 顯示單元</b></p><p> 顯示單元由兩個4位8段共陽數(shù)碼管組成,電路連接時,公共端接高電平,因此我們需要點亮哪個發(fā)光二極管只需給哪個二極管陰極送低電平,并采用動態(tài)掃描進行顯示[6]。前三個數(shù)碼管分別接P2.0、P2.1和P2.2,用于顯示總金額;第四個接P2.3 ,顯示等待時間;第五個和第六個
47、數(shù)碼管分別接P2.4和P2.5,用于顯示里程,由于需精確到小數(shù)位,故最多只能顯示9.9公里,但經(jīng)過添加溢出指示,可計到20公里,在現(xiàn)實中已基本夠用;后面兩個數(shù)碼管分別接P2.6和P2.7,用于顯示單價。由于溢出指示是采用發(fā)光二極管是否點亮表示,故必須選好參數(shù)以確保發(fā)光二極管正常工作。根據(jù)元件手冊(也可用萬用表測量)查得,發(fā)光二極管點亮時壓降為1.7V,點亮電流為3-20mA,取導通電流為5mA,所以限流電阻可選擇為(5-1.7)/5=6
48、60,故可選擇限流電阻值510Ω。</p><p> 由于數(shù)碼管內(nèi)部二極管點亮時需要5mA以上的電流,而單片機的輸出電流還不到1mA,所以數(shù)碼管與單片機連接時需加驅動電路,可以使用上拉電阻的方法,也可以使用專門的驅動芯片,考慮到復用單片機I/O接口,節(jié)省單片機I/O資源,此次設計采用74HC573鎖存器,其輸出電流較大,電路接口簡單且可直接驅動數(shù)碼管顯示。74HC573的引腳分布圖2-6如下。</p>
49、;<p> 圖2-6 74HC573的引腳分布</p><p> :為三態(tài)允許輸入端(低電平有效),也可稱作輸出允許端;</p><p> 1D-8D為數(shù)據(jù)輸入端;</p><p> 1Q-8Q為數(shù)據(jù)輸出端;</p><p><b> LE為鎖存允許端。</b></p><p&
50、gt; 74HC573所對應真值表2-1如表。</p><p> 表2-1 74HC573真值表</p><p> 其中 :H—高電平;L—低電平;X—任意電平;Z—高阻態(tài),既不是高電平也不是低電平,其電平狀態(tài)由與它相連接的其它電氣狀態(tài)決定;Q0—上次的電平狀態(tài)。</p><p> 由真值表可以看出,當為高電平時,無論LE與D端為何電平狀態(tài),其輸出均為高阻態(tài)
51、,此時芯片處于不可控狀態(tài)。做設計時必須使其處于可控狀態(tài),即應該接低電平。當為低電平時,若LE為H,則D與Q同時為H或者L,數(shù)據(jù)實現(xiàn)直通傳送;而當LE為L時,無論D為何狀態(tài)Q都保持上一次的數(shù)據(jù)狀態(tài),數(shù)據(jù)被鎖存住,利用此特性即可實現(xiàn)對數(shù)碼管的控制。</p><p> 本次設計中:段選信號LE接P1.5,對應圖中標號P1.5;位選信號LE接P1.6,對應圖中標號P1.6??刂骑@示時先給P1.5高電平,使通道打開,接著
52、送字碼,然后把P1.5電平拉低,使字碼保持?。恢蟠蜷_P1.6(送高電平),緊接著送位碼,控制要顯示的位,然后把P1.6拉低,數(shù)據(jù)被保持。最后延時5ms;依次循環(huán)掃描;利用數(shù)碼管點亮后的余暉和人眼視覺暫留效應即可實現(xiàn)動態(tài)顯示。數(shù)碼管動態(tài)顯示電路如圖2-7所示。</p><p> 圖2-7 數(shù)碼管動態(tài)顯示電路</p><p><b> 第3章 軟件設計</b><
53、;/p><p><b> 3.1 系統(tǒng)主程序</b></p><p> 在主程序模塊中,需要完成對各參量和接口的初始化、出租車起步價和單價的初始化以及中斷、計算、循環(huán)等工作。另外,在主程序模塊中還需要設置啟動/清除標志寄存器、里程寄存器和價格寄存器,并對它們進行初始化。然后,主程序將根據(jù)各標志寄存器的內(nèi)容,分別完成啟動、清除、計程和計價等不同的操作。</p>
54、;<p> 當出租車運行后,就啟動計價器,根據(jù)里程寄存器中的內(nèi)容計算和判斷行駛里程是否已超過起步價公里數(shù)。若已超過,則根據(jù)里程值、每公里的單價值和起步價來計算出當前的總金額,并將結果存于總金額寄存器中;中途等待時,無脈沖輸入,不產(chǎn)生中斷,當時間超過等待設定值時,開始進行計時,并把等待金額加到總金額里,然后將總金額、里程、等待時間和單價送數(shù)碼管顯示出來。程序流程如圖3-1所示。</p><p>
55、圖3-1 主程序流程圖</p><p> 3.2 里程計數(shù)中斷程序</p><p> 每當霍爾傳感器輸出一個低電平信號,單片機定時器0(工作在計數(shù)模式)就對其計數(shù)一次,相應的變量設為inter就自加1,當里程計數(shù)器inter對里程脈沖計滿500次時,對其自身進行清零操作,為下一次計數(shù)做準備,同時進入里程計數(shù)中斷服務程序中,里程變量加1,總金額根據(jù)此時所設單價做出相應的變化。里程中斷子程
56、序如圖3-2所示。</p><p> 圖3-2 里程中斷服務子程序</p><p> 3.3 中途等待中斷程序</p><p> 在中途等待中斷程序中,定時器1每50ms計一次數(shù),每計夠100次(5sec),便將當前里程值送入某個緩存變量,與前一個5秒的值進行比較,如果兩者相同,則表明霍爾傳感器沒有輸出信號,認為出租車停了下來,進入等待計時,計時中間變量dd自
57、加1,計夠12次為一分鐘,dd自清零,同時根據(jù)所設的等待單價刷新總金額。計數(shù)初值可有以下公式獲得:</p><p> X=(65536-t)*11.0592*10^6/12;</p><p> TH=X/256; </p><p><b> TL=X%256;</b></p><p> 其中:X表示計數(shù)初
58、值,TH、TL分別為16位計數(shù)器高8位和低8位應裝入的初值。</p><p> 用定時器作為基準,可使測試的等待時間更為精確(可以精確到uS級);且每隔5秒比較一次,能有效減小誤判率,避免把汽車低速行駛誤認為靜止等待處理。中途等待子程序流程圖如圖3-3所示。</p><p> 圖3-3 中途等待中斷子程序流程圖</p><p><b> 3.4 計算
59、程序</b></p><p> 計算程序根據(jù)里程數(shù)分別進入不同的計算公式。如果里程大于3公里,則執(zhí)行公式:總金額=起步價+(里程-3)*單價+等待時間*等待單價;否則,執(zhí)行公式:總金額=起步價+等待時間*等待單價。程序流程圖如圖3-4所示。</p><p> 圖3-4 計算程序流程圖</p><p><b> 3.5 顯示程序</b
60、></p><p> 由于8位數(shù)碼管所有段選皆有8位的P0口進行控制,因此,在每一瞬間,8位LED會顯示同一個數(shù)字。要想每位顯示不同的字符,就必須采用動態(tài)掃描的方法輪流點亮各位LED,即在每一時刻只使某一位顯示字符。在此瞬間,段選控制I/O口輸出相應字符段選碼(字符碼),而位選則控制I/O口在該顯示的位送入選通電平,以保證該位顯示顯示相應字符。如此循環(huán)操作,使每位分時顯示該位應該顯示的字符 [7] 。&l
61、t;/p><p> 在本次設計中顯示程序利用延時程序,每隔5ms刷新一次,相應的數(shù)碼管點亮,顯示一位數(shù)據(jù),利用主函數(shù)內(nèi)的循環(huán),實現(xiàn)動態(tài)掃描顯示,同時根據(jù)數(shù)碼管余輝和人眼暫留現(xiàn)象,給人看上去每個數(shù)碼管總是在亮,以實現(xiàn)動態(tài)顯示。</p><p><b> 3.6 鍵盤程序</b></p><p> 鍵盤采用查詢的方式,放在主程序中,當有按鍵按下的
62、時候,在相應I/O口產(chǎn)生一次低電平,當單片機查詢出該低電平后便轉入進行處理,處理結束返回。鍵盤程序流程圖如圖3-5。 </p><p><b> 圖3-5 鍵盤程序</b></p><p> 按鍵檢測流程圖3-6所示。</p><p> 圖3-6 按鍵檢測子程序流程圖</p><p> 第4章 調試改進過程及運行
63、結果分析</p><p> 4.1 動態(tài)掃描的調試和分析</p><p> 動態(tài)掃描是單片機編程中最基本的知識,雖對其原理有比較清晰的掌握,也曾用匯編語言寫過程序,但此次用C語言編寫還是出現(xiàn)了錯誤。</p><p> 第一就是把段碼和位碼順序送反,結果是只有在延時時間較長時才能顯示正常,當然這樣的代價是沒有靜態(tài)的效果;第二就是用動態(tài)掃描時給八個數(shù)碼管送了10個
64、數(shù),顯然這樣做結果必定混亂;最后就是開始時用switch、case語句實現(xiàn)動態(tài)掃描,當程序較小時可以正常工作,但當后期程序較大時,出現(xiàn)了時序混亂的問題。最后解決的方法是用了鎖存器,顯示結果正常為固定的預設的八個數(shù)字。</p><p> 4.2 AT24C02的編程與調試</p><p> 對AT24C02編程對我來說是一個比較新知識點,遇到了不少問題, 這里僅把經(jīng)驗教訓簡要介紹一下。首
65、先是一定要對I2C總線時序有較深刻了解后再嘗試編程,第二就是要注意向 AT24C02寫一個字和讀一個字的區(qū)別,當從 AT24C02讀數(shù)據(jù)時一定要注意,當讀完時從機 AT24C02一定要發(fā)送一個非應答信號表示數(shù)據(jù)讀完。</p><p> 調試的方法是在指定地址寫一個數(shù)字再看能是否讀出,當顯示程序編寫好后,可以在Ptoteus中用數(shù)碼管顯示看是否與分析一致,也可以把讀出的數(shù)據(jù)賦給某個變量,再通過在keil中執(zhí)行vi
66、ew/watch&call stack window 調出相應變量觀察。</p><p> 4.3 按鍵查詢功能的實現(xiàn)</p><p> 按鍵查詢比較容易實現(xiàn),只要注意1. 按鍵結束后注意退出按鍵處理;2.不要陷入死循環(huán),即避免顯示一個數(shù)據(jù)后退不出來;3.在做實際鍵盤時要注意按下去抖和釋放去抖。按鍵去抖可通過以下語句實現(xiàn):</p><p> if(ke
67、y==0) </p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(key==0)</p><p><b> {</b></p><p> w
68、hile(!key);</p><p><b> delay(5);</b></p><p> while(!key);</p><p><b> {</b></p><p><b> 按鍵處理程序</b></p><p><b>
69、}</b></p><p><b> }</b></p><p><b> }</b></p><p> 4.4 計算程序的分析與設計</p><p> 由于里程和單價都精確的小數(shù)點后一位,而顯示時仍按整數(shù)顯示,只不過人為的加入 &0x7f(共陽極時加入&0x7f
70、,共陰極時加入 ||0x)控制是否顯示小數(shù)點兒,故實際計算時要做適當改動。</p><p><b> 改動如下:</b></p><p> 1. 當里程值大于30(實際對應大于3公里)且無進位時,溢出指示燈不亮,總金額=起步價+(里程十位數(shù)字-2)*運行單價+等待單價*等待時間;</p><p> 2. 當里程值小于30(實際對應小于3公
71、里),肯定無進位,溢出指示燈不亮,總金額=起步價+等待單價*等待時間;</p><p> 3. 有進位,溢出指示燈點亮,表示里程一定大于三公里,只需執(zhí)行總金額=起步價+7*運行單價+(里程十位數(shù)字+1)*運行單價+等待單價*等待時間</p><p> 即:總金額=起步價+(里程十位數(shù)字+8)*運行單價+等待單價*等待時間;</p><p> 4.5 結果分析與
72、性能改進</p><p> 經(jīng)過反復調試驗證,基于STC89C52單片機控制設計的出租車計價器滿足了所有預設性能指標,具有較好的抗干擾性,價格也較為合理,具有很好的工業(yè)開發(fā)和市場前景。</p><p> 可以改進的地方可能有很多;就我現(xiàn)在所思考的可從以下兩個方面加以考慮:</p><p> 1. 嘗試著把兩個鎖存器74HC573去掉,當然不能影響整個計價器的功
73、能,這樣會使硬件電路更簡潔,成本也會更低,符合實際中的最大利潤空間定理。</p><p> 2. 設計PCB板時把鍵盤和顯示器放在芯片和其它電路的反面,這樣封裝成實際產(chǎn)品時可把人機接口留在外面,更人性化,也符合人們的習慣。</p><p> 4.6 計價器系統(tǒng)的仿真</p><p> 當各個子模塊都實現(xiàn)后,聯(lián)調則主要是看當把他們?nèi)诤显谝黄饡r是否會有時序上的沖突
74、,以及可能存在的分析不周全的地方。本次設計聯(lián)調時出現(xiàn)的問題主要有:第一是顯示時存在時序上的沖突,詳見4.1第三點;第二就是中斷設置時出現(xiàn)混亂,即同時用定時器0,定時器1,和外部中斷1時,后兩者都不再工作(通過編一個方波程序,發(fā)現(xiàn)定時器1即P3.5無跳變),解決方法時讓定時器1工作在計數(shù)方式代替工作在定時方式,如此不但可以完成相應功能,解決了問題,更重要的是省去一個中斷,簡化了程序設計。</p><p> 調試完
75、成后在Proteus 7.5 上仿真結果如圖4-1,4-2,4-3,4-4所示。</p><p> 圖4-1里程無溢出時仿真結果(小于三公里)</p><p> 圖4-2里程無溢出時仿真結果(大于三公里)</p><p> 圖4-3里程溢出時仿真結果(大于十公里)</p><p> 圖4-4 單價調整(起步價)</p>
76、<p><b> 結 論</b></p><p> 經(jīng)過近幾個月的設計,在多位老師和同學的幫助下,全面實現(xiàn)了預先設定的計價器應具有的功能,且滿足了所有設計指標。</p><p> 1. 能準確計算出出租車運行里程;</p><p> 2. 實現(xiàn)了單價可調,里程精確到0.1公里,并可以對等待時間進行計時;</p>
77、<p> 3.利用I2C總線通過EEPROM-AT24C02對存儲空間進行了擴展,使其具備掉電存儲功能。</p><p> 4. 有完整的軟件仿真結果和硬件電路,并用Protel設計出了系統(tǒng)原理圖,制作了PCB板。</p><p> 通過對基于Proteus 7.5的仿真和實際電路的測試結果分析,表明用此方法設計的計價器。實現(xiàn)了單價可調,掉電保持,計程精度達到0.1公里,此
78、外還增加了等待計時功能,白天夜晚單價自動切換,并且能實時顯示總金額,等待時間,運行里程,運行單價等詳細信息;且能很方便的在不改變硬件電路的情況下通過改變軟件實現(xiàn)計價精度的提高,進行功能上的擴展,如可把現(xiàn)有的計價器轉變?yōu)橛嬎倨鳎晟频墓δ苁沟没赟TC89C52單片機的出租車計價器的通用性和實用性有著無可比擬的優(yōu)勢,具有很高的現(xiàn)實意義和很好的市場前景。</p><p> 當然設計存在不少缺陷,做如下改進。<
79、/p><p> 1. 應嘗試著在不影響整個計價器的功能的前提下把兩個鎖存器74HC573去掉,這樣會使硬件電路更簡潔,成本也會更低。</p><p> 2. PCB板中如果把鍵盤和顯示器放在芯片和其它電路的反面,這樣封裝成實際產(chǎn)品時可把人機接口留在外面,更人性化,也符合人們的習慣。</p><p><b> 謝 辭</b></p>
80、;<p> 在此次設計中,陳文清老師作為我的指導老師,至始至終都給予我了不少幫助,從下任務書開始,就幫我制定規(guī)劃,提醒我應注意的問題;借給我資料,幫我聯(lián)系硬件;和我一起調程序,并提出了很多的修改意見以及完善方案;此外還認真批閱了我的論文,指出其中很多瑕疵和不清晰的地方;更重要的是在我遇到困難時對我的鼓勵,讓我不懈怠、不退縮、也讓我更有信心;可以說我的每一點進展都與陳老師的付出是分不開的。</p><p
81、> 當然還在此,我向身邊關心我的老師、同學致以誠摯的謝意!最后感謝母校對我這幾年的辛勤培養(yǎng)。有其他老師和同學,都幫了我不少忙,在此不再贅述。謹祝老師們工作順利,萬事如意,桃李滿天下;同學們學業(yè)有成,前程似錦! 參考文獻</p><p> 李朝青. 單片機原理及接口技術(第三版). 北京: 北京航空航天大學出版社, 2008</p>
82、<p> 郭天祥. 51單片機C語言教程. 北京:電子工業(yè)出版社, 2008</p><p> 單成祥, 牛彥文. 傳感器設計基礎. 北京: 國防工業(yè)出版社, 2007</p><p> 竇振中. 單片機外圍部件實用手冊輸出通道器件分冊. 北京:北京航空航天大學出版社.2003.</p><p> 楊素行.模擬電子技術基礎簡明教程.(第三版).北京
83、:高等教育出版社, 2005</p><p> 閻石.數(shù)字電子技術.(第五版).北京:高等教育出版社, 2006</p><p> 張一斌, 余建坤.單片機原理課程設計 .長沙:中南大學出版社, 2008</p><p> 萬隆, 巴奉麗. 單片機原理及應用技術.北京:清華大學出版社, 2008</p><p> 馬淑華, 王鳳文,
84、張美金. 單片機原理與接口技術(第二版). 北京:北京郵電大學出版社, 2007</p><p> 陳威. 基于單片機的電子密碼鎖的設計:[畢業(yè)論文] .浙江:浙江科技學院, 2009</p><p> 高炎萃, 武一. 基于單片機的電機保護裝置設計. 四川理工學院學報, 2009,第23卷第1期</p><p> 譚浩強. C程序設計(第三版). 北京: 清
85、華大學出版社, 2005</p><p> 劉宏,余勤科. Protel電路設計使用指南. 西安: 西安電子科技大學出版社, 2000</p><p> 趙偉軍. Protel99E教程. 北京: 人民郵電出版社, 2004</p><p> 龍脈工作室. Protel99S入門與典型實例. 北京: 人民郵電出版社, 2008</p><p
86、> 譚浩強著. C程序設計[M]. 北京: 清華大學出版社, 2005</p><p> 張友德, 趙志英,涂時亮著. 單片微型機原理應用與實驗[M]. 上海: 復旦大學出版社, 2006.10</p><p> 吳戈李, 玉峰編著. 案例學單片機C語言開發(fā)[M]. 北京: 人民郵電出版社, 2008.10</p><p> 孫余凱. 傳感器應用電路
87、300例[M]. 北京: 電子工業(yè)出版社,2008.</p><p> 田立. 51單片機C語言程序設計快速入門[M]. 北京: 人民郵電出版社, 2007</p><p> Chirs J. Georgopoulos. Interface Fundamentals In Microprocessor-Controlled System[M]. D.Reidel Publishing
88、 Company, 1985</p><p> 附 錄A 系統(tǒng)原理圖</p><p> 附 錄B 仿真圖PCB板</p><p> 附 錄C 系統(tǒng)源程序</p><p> #include<reg52.h></p><p> #include <intrins.h></p&
89、gt;<p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};</p><p> //uchar code
90、 table2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};</p><p> //sbit exter=P3^3; </p><p> //sbit fangbo=P3^5;</p><p> sbit key0=P1^0; // 清零</p><p>
91、sbit key1=P1^1; // +</p><p> sbit key2=P1^2; // -</p><p> sbit key3=P1^3; // 功能鍵</p><p> sbit key4=P1^4;// 切換</p><p> sbit
92、led=P1^7; //里程溢出指示</p><p> //sbit dula=P3^0; </p><p> //sbit wela=P3^1 ;</p><p> sbit dula=P1^5; </p><p> sbit wela=P1^6 ;</p><p> sbit S
93、da=P3^7; // I2C引腳</p><p> sbit Scl=P3^6;</p><p> //sbit WP=P3^5; //硬件寫保護 </p><p> uint zongjine,dengdai;licheng;</p><p> uint key3num,qiehuantemp;<
94、/p><p> //uchar danjia1=11,danjia2=22,danjia3=33,qibu=44,danjiazc;</p><p> uchar danjia1,danjia2,danjia3,qibu,danjia; //分別為白天單價、夜晚單價、//等待單價、 白天夜晚單價切換暫存、起步價</p><p> uint aa,bb,temp
95、,temp1,inter,exter; //中斷調用 </p><p> uint cc,dd,qufan;</p><p> void delay(uint x) </p><p><b> {</b></p><p><b> int i,j;</b></p>
96、<p> for(i=x;i>0;i--)</p><p> for(j=110;j>0;j--);</p><p><b> }</b></p><p> void delayNOP( ) // 保證I2C的時序要求 >=4.7us</p><p><b> {<
97、;/b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p>&
98、lt;p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _
99、nop_();</b></p><p><b> _nop_();</b></p><p><b> }</b></p><p> void I2C _init()</p><p><b> {</b></p><p><b&g
100、t; Sda=1; </b></p><p><b> Scl=1;</b></p><p> delayNOP( ) ;</p><p><b> }</b></p><p> void start()</p><p><b> {<
101、/b></p><p><b> Scl=1;</b></p><p> delayNOP( ) ;</p><p><b> Sda=1;</b></p><p> delayNOP( ) ;</p><p><b> Sda=0;</b&g
102、t;</p><p> delayNOP( ) ;</p><p><b> Scl=0;</b></p><p> delayNOP( ) ;</p><p><b> }</b></p><p> void stop()</p><p>
103、;<b> { </b></p><p><b> Sda=0;</b></p><p> delayNOP( ) ;</p><p><b> Scl=1;</b></p><p> delayNOP( ) ;</p><p><b&
104、gt; Sda=1;</b></p><p> delayNOP( ) ;</p><p><b> }</b></p><p> void Ack()</p><p><b> { </b></p><p><b> Sda=0;<
105、;/b></p><p> delayNOP( );</p><p><b> Scl=1;</b></p><p> delayNOP( );</p><p><b> Scl=0;</b></p><p> delayNOP( );</p>
106、<p><b> }</b></p><p> void NoAck()</p><p><b> {</b></p><p><b> Sda=1;</b></p><p> delayNOP( ); </p><p><b
107、> Scl=1;</b></p><p> delayNOP( );</p><p><b> Scl=0;</b></p><p> delayNOP( );</p><p><b> }</b></p><p> void Send(ucha
108、r Data)</p><p><b> {</b></p><p> uchar BitCounter=8;</p><p> uchar temp;</p><p><b> do</b></p><p><b> {</b></p&
109、gt;<p> temp=Data;</p><p><b> Scl=0;</b></p><p> delayNOP( );</p><p> if((temp&0x80)==0x80)</p><p><b> Sda=1;</b></p><
110、;p><b> else </b></p><p><b> Sda=0;</b></p><p><b> Scl=1;</b></p><p> temp=Data<<1;</p><p> Data=temp;</p><p
111、> BitCounter--;</p><p><b> }</b></p><p> while(BitCounter);</p><p><b> Scl=0;</b></p><p><b> } </b></p><p>
112、uchar Read() //讀一個字節(jié)的數(shù)據(jù),并返回該字節(jié)值</p><p><b> {</b></p><p> uchar temp=0;</p><p> uchar temp1=0;</p><p> uchar BitCounter=8;</p><p> Sda=1;
113、 // 置 Sda為輸入方式</p><p><b> do{</b></p><p><b> Scl=0;</b></p><p> delayNOP( );</p><p><b> Scl=1;</b></p><p> dela
114、yNOP( );</p><p> if(Sda) //如果Sda=1;</p><p> temp=temp|0x01; //temp的最低位置1</p><p><b> else</b></p><p> temp=temp&0xfe; //否則temp的最低位清0<
115、/p><p> if(BitCounter-1)</p><p> {temp1=temp<<1;</p><p> temp=temp1;</p><p><b> }</b></p><p> BitCounter--;</p><p> }whil
116、e(BitCounter);</p><p><b> Scl=0;</b></p><p> return(temp);</p><p><b> }</b></p><p> void WrToROM(uchar Addresss,uchar Data)</p><p
117、><b> {</b></p><p><b> start();</b></p><p> Send(0xa0);</p><p><b> Ack();</b></p><p> Send(Addresss);</p><p><
118、;b> Ack(); </b></p><p> Send(Data);</p><p><b> Ack();</b></p><p><b> stop();</b></p><p> delay(20);</p><p><b>
119、 }</b></p><p> uchar RdFromROM(uchar Addresss)</p><p><b> {</b></p><p> uchar Data;</p><p><b> start();</b></p><p> Se
120、nd(0xa0);</p><p><b> Ack();</b></p><p> Send(Addresss);</p><p><b> Ack();</b></p><p><b> start();</b></p><p> Send
121、(0xa1);</p><p><b> Ack();</b></p><p> Data=Read();</p><p><b> NoAck();</b></p><p><b> stop();</b></p><p> return(D
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于at89c52單片機的出租車計價器設計
- 課程設計--基于at89c52單片機出租車計價器設計
- 基于單片機的出租車計價器畢業(yè)設計
- 基于單片機的出租車計價器畢業(yè)設計
- 基于單片機的出租車計價器畢業(yè)設計
- 基于at89c51單片機的出租車計價器系統(tǒng)設計
- 畢業(yè)設計---基于at89s51單片機出租車計價器系統(tǒng)設計
- 畢業(yè)設計---基于單片機的出租車計價器系統(tǒng)
- 畢業(yè)設計----多功能單片機出租車計價器
- 基于單片機的出租車計價器的設計【畢業(yè)設計】
- 基于單片機出租車多功能計價器設計畢業(yè)設計
- 畢業(yè)設計---基于單片機的出租車計價器的設計
- 基于單片機的出租車計價器設計畢業(yè)設計論文
- 基于單片機的出租車計價器設計畢業(yè)設計論文
- 基于單片機的出租車計價器設計
- 基于at89c51單片機出租車計價器的研究
- 基于at89s51單片機的出租車計價器設計
- 基于51單片機的出租車計價器畢業(yè)設計論文
- 畢業(yè)設計(論文)基于單片機的出租車計價器的設計
- 基于51單片機的出租車計價器設計
評論
0/150
提交評論