版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 出租車計價器</b></p><p> 摘 要:出租車計價器是乘客和司機的交易準則,它是出租車行業(yè)發(fā)展的重要標志,是出租車中最重要的工具。它關(guān)系著交易雙方的利益。具有良好性能的計價器無論是對廣大出租車司機朋友還是乘客來說都是很必要的。因此,汽車計價器的研究也是十分有一個應(yīng)用價值的。該系統(tǒng)由AT89S51單片機控制,滿足計程、計時、計費、存儲等多種計量功能為一
2、體的出租車計價器的實用要求。相比于普通的模擬電路控制,采用單片機進行的設(shè)計相對來說功能強大,用較少的硬件和適當?shù)能浖嗷ヅ浜峡梢院苋菀椎膶崿F(xiàn)設(shè)計要求,且靈活性強,可以通過軟件編程來完成更多的附加功能。針對計費模式的切換,通過軟件編程就可以輕易而舉的實現(xiàn)。避免了機械開關(guān)帶來的不穩(wěn)定因素。</p><p> 關(guān)鍵詞:出租車計價器 單片機 控制</p><p><b> 目 錄&l
3、t;/b></p><p> 第一章 前 言1</p><p> 第二章 設(shè)計要求2</p><p> 2.1 基本功能2</p><p> 2.3 擴展功能2</p><p> 第三章 系統(tǒng)的組成及工作原理3</p><p> 3.1 系統(tǒng)的硬件構(gòu)成及功能
4、3</p><p> 3.2 AT89S51單片機及其引腳說明4</p><p> 第四章 硬件電路方案設(shè)計7</p><p> 4.1方案比較與確定7</p><p> 4.2 里程計算、計價單元的設(shè)計7</p><p> 4.3 顯示單元電路設(shè)計9</p><p&g
5、t; 4.4 鍵盤顯示模塊設(shè)計10</p><p> 第5章 系統(tǒng)的軟件設(shè)計12</p><p> 5.1 系統(tǒng)主程序設(shè)計12</p><p> 5.2 定時中斷服務(wù)程序14</p><p> 5.3 顯示服務(wù)程序14</p><p> 5.4 鍵盤服務(wù)程序15</p>
6、<p> 第6章 系統(tǒng)調(diào)試與測試結(jié)果分析17</p><p> 6.1 使用的儀器儀表和工具17</p><p> 6.2 調(diào)試的方法17</p><p> 第7章 結(jié)論18</p><p><b> 參考文獻19</b></p><p><b>
7、 附錄20</b></p><p> 附錄1 總體設(shè)計電路圖20</p><p> 附錄2 元件清單20</p><p> 附錄3 全部源程序21</p><p><b> 第一章 前 言</b></p><p> 隨著我國國民經(jīng)濟的告訴發(fā)展,出租車已成為城市公共
8、交通的重要組成部分。出租車計價器這一專用計算器具必須經(jīng)當?shù)丶急O(jiān)局所屬的管理部門堅定認可,且出租車安裝計價器整車鑒定合格后才能運營。針對電子式出租車計價器,建設(shè)部于1997年12月1日開始貫徹新的行業(yè)標準“CJ5024-1997”,要求“本標準實施之日起,電子式出租車計價器的設(shè)計,制造,和檢驗必須符合本標準的規(guī)定”。根據(jù)新標準選擇性能價格比高的計價器,并與有關(guān)出租車管理部門一起確定選用哪個品牌則是計量部門的職責。如何選用計價器,主要應(yīng)考慮
9、兩個方面:第一是性能和質(zhì)量是否符合新標準CJ5024-1997,性能還包括本地區(qū)行政管理部門隨時間,區(qū)域和車型在運價上的調(diào)整,如里程費,等候費,空貼費,夜間補償費等作變更時,改變計價器運行程序的繁簡程度。同時要考慮計價器自身防作弊的性能。第二要關(guān)注該品牌計價器是否具備升級換代或者是擴展功能。雖然現(xiàn)在個別大城市有全部更新出租車計價器一步到位的能力,但絕大部分城市還不具備這種條件,須按步驟先安裝計價器,再裝語音提示器,然后才考慮票據(jù)打印或者
10、IC卡管理及收費等問題,這樣在選用計價器時就要想到它在未來發(fā)展中的配套能</p><p> 本次課程設(shè)計利用單片機技術(shù)來實現(xiàn)一臺多功能出租車計價器,具有性能可靠、電路簡單、成本低等特點。</p><p><b> 第二章 設(shè)計要求</b></p><p><b> 2.1 基本功能</b></p>&
11、lt;p><b> 1.基本要求:</b></p><p> (1)白天計程計價方法: (30)</p><p> 1)起步價:乘客上車,顯示起步價(例如7元),行車距離在3公里以內(nèi)。</p><p> 2)里程計價:(計價單位為元,并進行四舍五入)</p><p> a.行車里程 < 3公里時,計
12、價為7元;</p><p> b.3公里≤行車里程≤6公里時,計價為:7元+(里程-3)*1.2元/公里</p><p> c.行車里程 > 6公里時,加收回空計費每公里計價加收50%;</p><p> 計價為:7元+3公里*1.2元/公里+(里程-6)*1.2*(1+50%)元/公里</p><p> (2)計價器顯示功能:
13、顯示總價、總里程、車速,顯示北京時間,時間可以進行設(shè)置。(20)</p><p> ?。?)顯示:可以顯示里程、金額、等待時間、速度。</p><p> ?。?)計費功能:起步公里數(shù)為2公里,價格為6元;若實際運行大于2公里,按單程價格為1.6元/公里,往返則價格為1.6元/公里。</p><p> (3)按鍵功能:單程/往返分別由“單程” 按鍵和“往返” 按鍵設(shè)
14、定;按“暫?!?鍵,計價器可暫停計價;按“清除” 鍵,計價器能將記錄數(shù)據(jù)(里程、等待時間與金額等)自動清0;按“查詢”鍵,能自動顯示總等待時間;按“返回”鍵,仍然顯示里程和金額。</p><p> 2.2 性能:公里數(shù)檢測誤差不超過±10%。</p><p><b> 2.3 擴展功能</b></p><p> 停車計費功能:用
15、單片機控制電機轉(zhuǎn)動,并用光電傳感器檢測轉(zhuǎn)盤轉(zhuǎn)動模擬車速,車速與轉(zhuǎn)盤轉(zhuǎn)速成正比。車速<5公里/小時的時間累積為總等待時間,每5分鐘等待時間相當于里程數(shù)增加1公里。</p><p> 第三章 系統(tǒng)的組成及工作原理</p><p> 本系統(tǒng)的硬件設(shè)計主要包括單片機AT89S51、數(shù)據(jù)顯示部件、模擬行駛路程單元、及計價單元的設(shè)計。在硬件設(shè)計過程中,充分利用各部件的功能,實現(xiàn)多功能的出租車計價
16、器設(shè)計。</p><p> 3.1 系統(tǒng)的硬件構(gòu)成及功能</p><p> 計價器的單片機控制方案圖如圖1 單片機控制方案圖所示。</p><p> 利用單片機豐富的IO端口,及其控制的靈活性,實現(xiàn)基本的里程計價功能和價格選擇、時間顯示控制等功能。不但能實現(xiàn)所要求的功能而且能在很大的程度上擴展功能,而且還可以方便的對系統(tǒng)進行升級。具體電路參見附錄中“多功能出
17、租車計價器總體電路圖”如圖3.1 單片機控制方案圖。</p><p> 圖3.1 單片機控制方案圖</p><p> 3.2 AT89S51單片機及其引腳說明</p><p> AT89S51是美國ATMEL公司生產(chǎn)的低功耗,高性能CMOS 8位單片機,片內(nèi)含4KB的可系統(tǒng)編程的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn)
18、,兼容標準8051指令系統(tǒng)及引腳。它集Flash程序存儲器既可在線編程(ISP)也可用傳統(tǒng)方法進行編程及通用 8位微處理器于單片芯片中,具有高性價比。</p><p> AT89S51是一個有40個引腳的芯片,引腳配置如圖3.2 AT89S51引腳配置所示。</p><p> 圖3.2 AT89S51引腳配置</p><p> AT89S51芯片的40個引腳功
19、能為:</p><p> VCC 電源電壓。</p><p><b> GND 接地。</b></p><p> RST 復(fù)位輸入。</p><p> 當RST變?yōu)楦唠娖讲⒈3?個機器周期時,將使單片機復(fù)位。WDT溢出將使該引腳輸出高電平,設(shè)置SFR AUXR的DISRTO位(地址8EH)可打開或關(guān)閉該功能
20、。DISKRTO位缺省為RESET輸出高電平打開狀態(tài)。</p><p> XTAL1 反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。</p><p> XTAL2 來自反向振蕩放大器的輸出。</p><p> P0口 一組8位漏極開路型雙向I/O口。也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能驅(qū)動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端
21、用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。</p><p> P1口 一個帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入
22、口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。Flash編程和程序校驗期間,P1接收低8位地址。P1口部分端口引腳及功能如表3-1 P1口特殊功能所示。</p><p> 表3-1 P1口特殊功能</p><p> P2口 一個帶內(nèi)部上拉電阻的8位雙向I/O口。P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部
23、的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器時,P2口線上的內(nèi)容在整個訪問期間不改變。Flash編程和程序校驗期間,P2亦接收低8位地址。</p><p> P3口 一個帶內(nèi)部上拉電阻的8位雙向I/O口。P3的輸出緩
24、沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫“1”時,它們被內(nèi)部的上拉電阻把拉到高電并可作輸入端口。作輸入端口使用時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,如表3-2 P3口特殊功能所示。P3口還接收一些用于Flash閃速存儲器編程和程序校驗期間的控制信號。</p><p> 表3-2 P3口特殊功能</p>
25、;<p> PSEN/ 程序儲存允許輸出是外部程序存儲器的讀先通信號,當AT89S51由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN/有效,即輸出兩個脈沖。當訪問外部數(shù)據(jù)存儲器,沒有兩次有效的PSEN/信號。</p><p> EA/VPP 外部訪問允許。欲使CPU僅訪問外部程序存儲器,EA端必須保持低電平,需注意的是:如果加密位LB1被編程,復(fù)位時內(nèi)部會鎖存EA端狀態(tài)。Fla
26、sh存儲器編程時,該引腳加上+12V的編程電壓VPP。</p><p> 第四章 硬件電路方案設(shè)計</p><p> 4.1方案比較與確定</p><p> 出租車計價系統(tǒng)在模擬車輪轉(zhuǎn)動方面上可以采用兩種方案:一種是用555芯片產(chǎn)生固定頻率的脈沖模擬。這種方案產(chǎn)生脈沖頻率很高,但是調(diào)節(jié)比較麻煩。第二種是采用槽型光耦的通與斷來模擬轉(zhuǎn)動,使用電機轉(zhuǎn)盤對光耦的切
27、割來產(chǎn)生脈沖。這種方案產(chǎn)生脈沖頻率不高,但是轉(zhuǎn)速可以輕松調(diào)節(jié)。經(jīng)過仔細考慮和權(quán)衡,由于兩種方案均有其優(yōu)點,決定同時使用兩種方案,兩個模擬源可以根據(jù)需要任意使用。</p><p> 在顯示問題上,可以使用7279芯片控制顯示,也可以通過動態(tài)掃描實現(xiàn)顯示功能。考慮到動態(tài)掃描使用的硬件較少,本著簡捷易行的原則,采用了動態(tài)掃描的方案。</p><p> 4.2 里程計算、計價單元的設(shè)計<
28、;/p><p> 里程計算是通過安裝在車輪上的霍爾傳感器A44E檢測到的信號,在該系統(tǒng)中用兩種脈沖發(fā)生器進行模擬,送到單片機,經(jīng)處理計算,送給顯示單元的。其原理如圖4.1 所示。</p><p> 圖4.1 模擬測距示意圖</p><p> 555電路來產(chǎn)生一個脈沖來模擬霍爾傳感器輸出的里程脈沖,選擇P1.0口作為信號的輸入端,內(nèi)部采用外部中斷0,555脈沖產(chǎn)生
29、電路輸出一個脈沖信號直接加到IO口P1.0上(產(chǎn)生的頻率F=1/T=1.414/[(R1+2R2)C1]),由單片機的內(nèi)部算法對脈沖計數(shù),通過計算將脈沖增加體現(xiàn)在金額和里程上。具體電路如圖4.2所示。</p><p> 圖4.2 555脈沖產(chǎn)生電路圖</p><p> 光偶電路是以光為媒介傳輸電信號的一種光一電轉(zhuǎn)換器件,是另一種模擬將出租車行駛時車輪所轉(zhuǎn)的圈數(shù)轉(zhuǎn)換成脈沖信號送入數(shù)據(jù)處
30、理電路。H92B4是光偶電路的基本元件,它由發(fā)光源和受光器兩部分組成,發(fā)光源為發(fā)光二極管,受光器為光敏三極管。當發(fā)光源與受光器之間存在光線阻擋時,輸出端由高電平變?yōu)榈碗娖?,恢?fù)光通路又變?yōu)楦唠娖?,就這樣形成一個個的高低電平脈沖。選擇P3.4.口作為信號的輸入端,內(nèi)部采用外部中斷0,光偶電路輸出一個脈沖信號直接加到外部中斷0上,引起單片機的中斷,對脈沖計數(shù),通過計算將脈沖增加體現(xiàn)在金額和里程上。具體電路如圖4.3所示。</p>
31、<p> 圖4.3 H92B4光偶電路</p><p> 4.3 顯示單元電路設(shè)計</p><p> 由于設(shè)計要求有里程、金額、等待時間、速度顯示輸出,所以采用8位LED數(shù)碼管的分屏顯示。</p><p> 顯示電路由8數(shù)據(jù)鎖存器74HC573、譯碼器74LS138、8位LED數(shù)碼管組成。電路如圖6所示,74HC573用于連接51單片機和LE
32、D數(shù)碼管,51單片機的P0.0~P0.7分別順序?qū)?yīng)數(shù)碼管的A~G和dp,當位P0.0為1時,對應(yīng)A段點亮,以次類推。而51單片機的P2.0~P2.2接74LS138的ABC輸入口,其8個輸出口分別接到8個數(shù)碼管,這樣就可以進行3-8譯碼控制8個數(shù)碼管的顯示。</p><p> 顯示模塊電路圖見圖4.4</p><p> 各個數(shù)碼管顯示內(nèi)容示意圖見圖4.5</p><
33、;p> 圖4.4顯示單元電路</p><p> 圖4.5 數(shù)碼管顯示內(nèi)容示意圖(上下復(fù)用)</p><p> 4.4 鍵盤顯示模塊設(shè)計</p><p> 鍵盤采用4*4矩陣按鍵,接在AT89S51的P3口,當有鍵按下時,相對應(yīng)的接口被置0。矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上
34、,設(shè)置一個按鍵。如圖4.6所示,行線接P3.0~P3.3,列線接P3.4~P3.7。</p><p> 圖4.6 矩陣鍵盤電路</p><p> 按鍵S1:單程按鍵。按下該鍵,里程隨脈沖數(shù)成正比累加,在里程大于3公里后,金額數(shù)按單程價格為2元/公里進行累加。</p><p> 按鍵S2:往返按鍵。按下該鍵,里程隨脈沖數(shù)成正比累加,在里程大于3公里后,金額數(shù)按單
35、程價格為1.5元/公里進行累加。</p><p> 按鍵S3:暫停按鍵。到達目的地后,按“暫?!?鍵,計價器可暫停計價。</p><p> 按鍵S4:清除按鍵。按“清除” 鍵,計價器能將記錄數(shù)據(jù)(里程、等待時間與價格等)自動清0。</p><p> 按鍵S5:查詢按鍵。按“查詢”鍵,能自動顯示總等待時間。</p><p> 按鍵S6:
36、返回按鍵。按下該鍵,回到顯示里程數(shù)、金額狀態(tài)。</p><p> 第5章 系統(tǒng)的軟件設(shè)計</p><p> 本系統(tǒng)的軟件設(shè)計主要可分為主程序模塊、定時計數(shù)中斷程序、里程計數(shù)中斷服務(wù)程序、中途等待中斷服務(wù)程序、顯示子程序服務(wù)程序、鍵盤服務(wù)程序六大模塊。下面對各部分模塊作介紹。</p><p> 5.1 系統(tǒng)主程序設(shè)計</p><p>
37、 在主程序模塊中,需要完成對各接口芯片的初始化、出租車起價和單價的初始化、中斷向量的設(shè)計以及開中斷、循環(huán)等待等工作。另外,在主程序模塊中還需要設(shè)置啟動/清除標志寄存器、里程寄存器和價格寄存器,并對它們進行初始化。然后,主程序?qū)⒏鶕?jù)各標志寄存器的內(nèi)容,分別完成啟動、清除、計程和計價等不同的操作。主程序流程圖如圖5.1 所示。當按下S1時,就啟動計價,將根據(jù)里程寄存器中的內(nèi)容計算和判斷出行駛里程是否已超過起價公里數(shù)。若已超過,則根據(jù)里程值
38、、每公里的單價數(shù)和起價數(shù)來計算出當前的累計價格,并將結(jié)果存于價格寄存器中,然后將時間和當前累計價格送顯示電路顯示出來。當?shù)竭_目的地的時候,由于霍爾開關(guān)沒有送來脈沖信號,就停止計價,顯示當前所應(yīng)該付的金額和對應(yīng)的單價,到下次啟動計價時,系統(tǒng)自動對顯示清零,并重新進行初始化過程。</p><p> 圖5.1 程序流程圖</p><p> 5.2 定時中斷服務(wù)程序</p>&
39、lt;p> 在定時中斷服務(wù)程序中,每1/40s 產(chǎn)生一次中斷,當產(chǎn)生40 次中斷的時候,也就到了一秒,送數(shù)據(jù)到相應(yīng)的顯示緩沖單元,并調(diào)用顯示子程序?qū)崟r顯示。其程序流程如圖5.2 所示。</p><p> 圖5.2 定時中斷服務(wù)程序</p><p> 5.3 顯示服務(wù)程序</p><p> 數(shù)碼管在一般情況下顯示里程數(shù),價格兩項數(shù)據(jù),當按下鍵5時則跳
40、轉(zhuǎn)顯示等待時間和車速兩項數(shù)據(jù)。當按下鍵6時則返回顯示里程數(shù),價格兩項數(shù)據(jù)。程序流程圖如圖5.3:</p><p> 圖5.3 顯示服務(wù)程序</p><p> 5.4 鍵盤服務(wù)程序</p><p> 鍵盤采用查詢的方式,放在主程序中,當沒有按鍵按下的時候,單片機循環(huán)主程序,一旦有按鍵按下,便轉(zhuǎn)向相應(yīng)的子程序處理,處理結(jié)束再返回。</p><
41、p> 參見圖9,六個按鍵分別對應(yīng)六個簡單的子程序。</p><p> 如果按鍵S1被按下,則調(diào)用第一個子程序:begin_signal標志置1,將s_or_d標志置0;表示單程開始。</p><p> 如果按鍵S2被按下,則調(diào)用第一個子程序:begin_signal標志置1,將s_or_d標志置1; 表示往返開始。</p><p> 如果按鍵S3被按下
42、,則調(diào)用第一個子程序:begin_signal標志置0; 表示暫停。</p><p> 如果按鍵S4被按下,則調(diào)用第一個子程序:pulse_counter標志置0,將t置0; 表示將顯示數(shù)據(jù)清空。</p><p> 如果按鍵S5被按下,則調(diào)用第一個子程序:dispflag標志置1; 表示進入查詢界面。</p><p> 如果按鍵S6被按下,則調(diào)用第一個子程序:
43、dispflag標志置0; 表示退出查詢界面。</p><p> 第6章 系統(tǒng)調(diào)試與測試結(jié)果分析</p><p> 根據(jù)系統(tǒng)設(shè)計方案,本系統(tǒng)的調(diào)試共分為三大部分:硬件調(diào)試,軟件調(diào)試和軟硬件聯(lián)調(diào)。測試包括里程計價測試、掉電存儲測試測試。</p><p> 6.1 使用的儀器儀表和工具 </p><p> 數(shù)字萬用表
44、DT9203</p><p> 單片機仿真器 STC_ISP</p><p> 雙蹤穩(wěn)壓穩(wěn)流電源 DH1718E-5</p><p> 數(shù)字示波器 TDS1002</p><p><b> 電烙鐵</b></p><p><b> 單片機
45、實驗板</b></p><p> 6.2 調(diào)試的方法</p><p> 根據(jù)系統(tǒng)設(shè)計方案,本系統(tǒng)的調(diào)試共分為三大部分:硬件調(diào)試,軟件調(diào)試和軟硬件聯(lián)調(diào)。由于在系統(tǒng)設(shè)計中采用模塊設(shè)計法,所以方便對各電路模塊功能進行逐級測試。</p><p> 確定方案后的焊接過程很順利,3天后就完成了大部分電路的焊接工作,進行簡單的程序測試后發(fā)現(xiàn)一個問題:由于要用到
46、555芯片產(chǎn)生脈沖,預(yù)先設(shè)計的電路中沒有提供5V電源給555供電。我們想到外接一個5V的直流電源,發(fā)現(xiàn)這樣會使整個系統(tǒng)顯示累贅而難以操作。后來我們想到與單片機最小系統(tǒng)的Vcc和555芯片共用5V電源。于是將555的電源和地接到了最小系統(tǒng)的Vcc和地。這樣,只要單片機一上電,555便可以正常工作,操作起來非常方便和快捷。</p><p> 在軟件設(shè)計過程中遇到一個嚴重的問題就是系統(tǒng)的時序設(shè)計。我們發(fā)現(xiàn)程序的鍵盤掃
47、描程序和中斷程序發(fā)生沖突。導(dǎo)致按鍵功能和顯示功能不能同時出現(xiàn)。后來經(jīng)過排查發(fā)現(xiàn),中斷子程序設(shè)計的不合理,導(dǎo)致發(fā)生了中斷嵌套。將中斷子程序的部分內(nèi)容調(diào)整到主程序中調(diào)用子程序則這解決了這一問題。</p><p><b> 第7章 結(jié)論</b></p><p> 經(jīng)過這些天有關(guān)于出租車計價器的課程設(shè)計,使我對單片機的應(yīng)用有了更深的了解。在課程設(shè)計的過程中,還是碰到了許
48、多的問題。比如,對于數(shù)碼管動態(tài)掃描顯示和鍵盤的延時防抖的綜合編程不能較好地解決;對于代碼的前后順序及調(diào)用掌握得還不夠好;對于一些相關(guān)的應(yīng)用軟件沒能熟練掌握。通過這幾天晚上的苦想和反復(fù)調(diào)試,以及參考網(wǎng)上的程序,最終還是把問題解決了。</p><p> 通過這次課程設(shè)計,我最大的收獲就是自己的動手能力和獨立解決問題的能力得到了很大的提高,也充分體會到了自己設(shè)計東西的樂趣、學(xué)會查閱資料和對別人的東西融會變通的重要性,
49、也明白了很多知識光靠趴在書本上學(xué)是學(xué)不到其中的精髓的,必須親自去試著實踐,親自去經(jīng)歷才能對它們真正的掌握,凡事都要自己去動下手,去實踐一下,遇到困難,永遠不要沮喪氣餒。在動手的過程中,不僅能增強實踐能力,而且在理論上可以有更深的認識;這次設(shè)計給了我極大的鼓舞和信心,相信在以后的學(xué)習(xí)中可以通過不斷的摸索和實踐來提高其他方面的知識。通過本次課程設(shè)計,又使我學(xué)到了許多書本上無法學(xué)到的知識,也使也深該體會到單片機技術(shù)應(yīng)用領(lǐng)域的廣泛,不僅使我對學(xué)
50、過的單片機知識有了很多的鞏固,同時也對單片機這一門課程產(chǎn)生了更大的興趣。</p><p> 在本次課程設(shè)計過程中,我學(xué)會了在網(wǎng)絡(luò)上查找有關(guān)本設(shè)計的各硬件的資源,其中包括:AT89S51單片機及其引腳說明、555引腳圖及其引腳功能等,為本次課程設(shè)計提供了一定的資料。也為以后的進一步學(xué)習(xí)打下了堅實的基礎(chǔ)。</p><p><b> 參考文獻</b></p>
51、<p> 張友德 趙志英 涂時亮 編 單片微型機原理、應(yīng)用與實驗 上海:復(fù)旦大學(xué)出版社2005.12 全書</p><p> [2] 徐光翔 單片機原理接口及應(yīng)用 南京大學(xué)出版社 [3] 張淑清等. 單片微型計算機接口技術(shù)及其應(yīng)用 北京:國防工業(yè)出版社, [4] 王曉君等. MCS-51及兼容單片機原理與選型 北京:電子工業(yè)出版社</p
52、><p> [5]張鑫、華臻、陳書謙.《單片機原理及應(yīng)用》[M].電子工業(yè)出版社,2005.P110~136.</p><p> [6]丁元杰、吳大偉.《單片微機實題集與實驗指導(dǎo)書》[M].機械工業(yè)出版社, 2004.P124~125.</p><p><b> 附錄</b></p><p> 附錄1 總體設(shè)計電路圖
53、</p><p><b> 附錄2 元件清單 </b></p><p><b> 附錄3 全部源程序</b></p><p> 該出租車計價器的系統(tǒng)軟件設(shè)計源程序如下:</p><p> #include<reg52.h> </p><p> #def
54、ine uint unsigned int </p><p> #define uchar unsigned char</p><p> #define rate 15//脈沖數(shù)與里程數(shù)的比例 </p><p> sbit P20=P2^0; </p><p> sbit P21=P2^1; </p>&l
55、t;p> sbit P22=P2^2; //接 74 LS 138 控制 數(shù)碼管 </p><p> sbit pulse_in=P1^0;</p><p> bit pulse=1;</p><p> bit dispflag;</p><p> uchar num,temp;</p><p&
56、gt; bit begin_signal;// 開始標志 </p><p> bit s_or_d;//單程 還是往返 標志 </p><p> uint times; // 定時次數(shù) </p><p> uint pulse_counter;</p><p> uint record;</p>&l
57、t;p> uint s_temple;</p><p> uint s,m; //里程數(shù) s 和 金額 m </p><p> uint t; //等待時間 </p><p> char baiwei,shiwei,gewei,xiaoshu; </p><p> char keynum;
58、 //鍵盤 的鍵值 </p><p> uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,</p><p> 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40}; //0~f and '-'的字型碼(共陰) //聲明 區(qū) </p&g
59、t;<p> void delay(uint x); </p><p> void init();</p><p> void divide(uint counter);</p><p> void select(bit a,bit b,bit c);</p><p> void debouncer(void);&
60、lt;/p><p> uchar keyscan(void);</p><p> void delay(uint x)//延時 x ms .</p><p><b> {</b></p><p><b> uint i,j;</b></p><p> for(i
61、=0;i<x;i++)</p><p> for(j=0;j<=150;j++)</p><p><b> ;</b></p><p><b> }</b></p><p> void init() // 定時器初始化 </p><p>
62、<b> {</b></p><p> TMOD=0x01;</p><p> TH0=(65536-25000)/256;// timer=1/40s</p><p> TL0=(65536-25000)%256;</p><p><b> EA=1;</b></p>
63、<p><b> ET0=1;</b></p><p><b> TR0=1;</b></p><p><b> }</b></p><p> void divide(uint counter)</p><p><b> {</b>&
64、lt;/p><p> if(dispflag==0)</p><p><b> {</b></p><p><b> P0=0x00;</b></p><p> counter=counter*10/rate;</p><p> xiaoshu=counter%10;
65、</p><p> gewei=(counter/10)%10;</p><p> shiwei=(counter/100)%10;</p><p> baiwei=(counter/1000)%10;</p><p> if(counter<=30)m=80;</p><p><b> e
66、lse</b></p><p> if(s_or_d==0)m=80+2*(counter-30)+t/300;</p><p> else m=80+1.5*(counter-30)+t/300;</p><p> select(1,1,0);//顯示里程數(shù)目 </p><p> P0=table[xiao
67、shu];</p><p> delay(2); </p><p> select(0,1,0);</p><p> P0=table[gewei]|0x80;</p><p><b> delay(2);</b></p><p> select(1,0,0);</p>
68、<p> P0=table[shiwei];</p><p><b> delay(2);</b></p><p> select(0,0,0);</p><p> P0=table[baiwei];</p><p><b> delay(2);</b></p>&
69、lt;p> xiaoshu=m%10;</p><p> gewei=(m/10)%10;</p><p> shiwei=(m/100)%10;</p><p> baiwei=(m/1000)%10;</p><p> select(1,1,1); //顯示 金額數(shù)目 </p><p> P0
70、=table[xiaoshu];</p><p> delay(2); </p><p> select(0,1,1);</p><p> P0=table[gewei]|0x80;</p><p><b> delay(2);</b></p><p> select(1,0,1);&
71、lt;/p><p> P0=table[shiwei];</p><p><b> delay(2);</b></p><p> select(0,0,1);</p><p> P0=table[baiwei];</p><p><b> delay(2);</b>&l
72、t;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> P0=0x00;</b></p><p> xiaoshu=t%10;<
73、;/p><p> gewei=(t/10)%10;</p><p> shiwei=(t/100)%10;</p><p> baiwei=(t/1000)%10;</p><p> select(1,1,0);//顯示 等待時間 </p><p> P0=table[xiaoshu];</p&
74、gt;<p> delay(2); </p><p> select(0,1,0);</p><p> P0=table[gewei];</p><p><b> delay(2);</b></p><p> select(1,0,0);</p><p> P0=tab
75、le[shiwei];</p><p><b> delay(2);</b></p><p> select(0,0,0);</p><p> P0=table[baiwei];</p><p><b> delay(2);</b></p><p><b>
76、 }</b></p><p><b> }</b></p><p> void timer0() interrupt 1</p><p><b> {</b></p><p> TH0=(65536-25000)/256;</p><p> TL0=(
77、65536-25000)%256;</p><p> if(begin_signal==1)</p><p><b> {</b></p><p> if(pulse_in!=pulse)</p><p><b> {</b></p><p> delay(10);
78、</p><p> if(pulse_in!=pulse)</p><p> {pulse=~pulse;</p><p> pulse_counter++;</p><p><b> }</b></p><p><b> }</b></p><
79、;p> if (times==39)//1 s timer completed</p><p><b> {</b></p><p><b> times=0;</b></p><p> if((pulse_counter-record)<5)//如果 每秒 脈沖小于 5 , 則等待
80、時間 增加 </p><p><b> t++;</b></p><p> record=pulse_counter;</p><p><b> }</b></p><p><b> times++;</b></p><p>&l
81、t;b> }</b></p><p> //s_temple=pulse_counter/2;</p><p> //divide(s_temple);</p><p><b> }</b></p><p> void select(bit a,bit b,bit c)</p>
82、<p><b> {</b></p><p><b> P20=a;</b></p><p><b> P21=b;</b></p><p><b> P22=c;</b></p><p><b> }</b>
83、</p><p> void debouncer(void)// 防抖動 程序 </p><p><b> {</b></p><p><b> uint i;</b></p><p> for(i=0;i<4800;i++);</p><p>&l
84、t;b> }</b></p><p> uchar keyscan()</p><p><b> {</b></p><p><b> P3=0x7f;</b></p><p><b> temp=P3;</b></p><p&g
85、t; temp=temp&0x0f;</p><p> while(temp!=0x0f)</p><p><b> {</b></p><p> delay(10);</p><p><b> temp=P3;</b></p><p> temp=tem
86、p&0x0f;</p><p> while(temp!=0x0f)</p><p><b> {</b></p><p><b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b&g
87、t;</p><p> case 0x7e:num=1;</p><p><b> break;</b></p><p> case 0x7d:num=2;</p><p><b> break;</b></p><p> case 0x7b:num=3;</
88、p><p><b> break;</b></p><p> case 0x77:num=4;</p><p><b> break;</b></p><p><b> }</b></p><p> while(temp!=0x0f)</p&
89、gt;<p><b> {</b></p><p><b> temp=P3;</b></p><p> temp=temp&0x0f;</p><p><b> }</b></p><p><b> }</b></p
90、><p><b> }</b></p><p><b> P3=0xbf;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0x0f;</p><p> while(temp!=0x0f)&
91、lt;/p><p><b> {</b></p><p> delay(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0x0f;</p><p> while(temp!=0x0f)</p>&
92、lt;p><b> {</b></p><p><b> temp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xbe:num=5;</p><p>&l
93、t;b> break;</b></p><p> case 0xbd:num=6;</p><p><b> break;</b></p><p> case 0xbb:num=7;</p><p><b> break;</b></p><p>
94、 case 0xb7:num=8;</p><p><b> break;</b></p><p><b> }</b></p><p> while(temp!=0x0f)</p><p><b> {</b></p><p><b&g
95、t; temp=P3;</b></p><p> temp=temp&0x0f;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b&
96、gt; P3=0xdf;</b></p><p><b> temp=P3;</b></p><p> temp=temp&0x0f;</p><p> while(temp!=0x0f)</p><p><b> {</b></p><p>
97、 delay(10);</p><p><b> temp=P3;</b></p><p> temp=temp&0x0f;</p><p> while(temp!=0x0f)</p><p><b> {</b></p><p><b> te
98、mp=P3;</b></p><p> switch(temp)</p><p><b> {</b></p><p> case 0xde:num=9;</p><p><b> break;</b></p><p> case 0xdd:num=10
99、;</p><p><b> break;</b></p><p> case 0xdb:num=11;</p><p><b> break;</b></p><p> case 0xd7:num=12;</p><p><b> break;</
100、b></p><p><b> }</b></p><p> while(temp!=0x0f)</p><p><b> {</b></p><p><b> temp=P3;</b></p><p> temp=temp&0x
101、0f;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> P3=0xef;</b></p><p><b> temp=P
102、3;</b></p><p> temp=temp&0x0f;</p><p> while(temp!=0x0f)</p><p><b> {</b></p><p> delay(10);</p><p><b> temp=P3;</b>
103、</p><p> temp=temp&0x0f;</p><p> while(temp!=0x0f)</p><p><b> {</b></p><p><b> temp=P3;</b></p><p> switch(temp)</p>
104、<p><b> {</b></p><p> case 0xee:num=13;</p><p><b> break;</b></p><p> case 0xed:num=14;</p><p><b> break;</b></p>
105、<p> case 0xeb:num=15;</p><p><b> break;</b></p><p> case 0xe7:num=16;</p><p><b> break;</b></p><p><b> }</b></p>
106、<p> while(temp!=0x0f)</p><p><b> {</b></p><p><b> temp=P3;</b></p><p> temp=temp&0x0f;</p><p><b> }</b></p>&l
107、t;p><b> }</b></p><p><b> }</b></p><p> return num;</p><p><b> }</b></p><p> void singleway(void)// 單程 開始 函數(shù) </p>&l
108、t;p><b> {</b></p><p> begin_signal=1;</p><p><b> s_or_d=0;</b></p><p><b> }</b></p><p> void doubleway(void)//往返 開始 函數(shù) &l
109、t;/p><p><b> {</b></p><p> begin_signal=1;</p><p><b> s_or_d=1;</b></p><p><b> }</b></p><p> void pause(void)//暫停 函數(shù)
110、</p><p><b> {</b></p><p> begin_signal=0;</p><p><b> }</b></p><p> void clear(void)// 清除 函數(shù) </p><p><b> {</b>&l
111、t;/p><p> pulse_counter=0;</p><p><b> t=0;</b></p><p><b> }</b></p><p> void check(void)// 查詢 函數(shù) </p><p><b> {</b>
112、</p><p> dispflag=1;</p><p><b> }</b></p><p> void check2(void)// 查詢 函數(shù) </p><p><b> {</b></p><p> dispflag=0;</p>&l
113、t;p><b> }</b></p><p> void sentence(void)// 判定鍵盤值 </p><p><b> {</b></p><p> if(keynum!=0)</p><p><b> {</b></p><
114、;p> switch(keynum)</p><p><b> {</b></p><p> case 1:singleway();break;</p><p> case 2:doubleway();break;</p><p> case 3:pause();break;</p>
115、;<p> case 4:clear();break;</p><p> case 5:check();break;</p><p> case 6:check2();break;</p><p><b> }</b></p><p><b> }</b><
116、/p><p><b> }</b></p><p><b> main()</b></p><p><b> {</b></p><p><b> init();</b></p><p><b> while (1)
117、</b></p><p><b> {</b></p><p> divide(pulse_counter);</p><p> keynum=keyscan();</p><p> sentence();</p><p><b> }</b></
溫馨提示
- 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è)計報告
- 出租車計價器課程設(shè)計論文
- 硬件課程設(shè)計----出租車計價器
- eda課程設(shè)計--出租車計價器
- eda課程設(shè)計--出租車計價器
- 接口課程設(shè)計---出租車計價器
- 課程設(shè)計---出租車計價器的設(shè)計
- 課程設(shè)計--出租車計價器的設(shè)計
- 硬件課程設(shè)計--出租車計價器系統(tǒng)
- eda課程設(shè)計報告---出租車計價器
- eda課程設(shè)計報告--出租車計價器
- arm出租車計價器系統(tǒng)課程設(shè)計
評論
0/150
提交評論