版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《單片機(jī)應(yīng)用與仿真訓(xùn)練》設(shè)計(jì)報(bào)告</p><p> 題目:出租車計(jì)價(jià)器設(shè)計(jì)</p><p><b> 摘要</b></p><p> 本設(shè)計(jì)用直流電機(jī)轉(zhuǎn)動模擬出租車車輪轉(zhuǎn)動,實(shí)現(xiàn)出租車多功能的計(jì)價(jià)器功能。設(shè)計(jì)采用AT89S52單片機(jī)為主控芯片,用霍爾傳感器檢測電機(jī)轉(zhuǎn)盤轉(zhuǎn)速,采用AT24C02芯片使系統(tǒng)在掉電時(shí)路程、單
2、價(jià)等重要信息的存儲保護(hù),采用兩個(gè)四位8段共陰數(shù)碼顯示管里程、總價(jià)格和等待時(shí)間等信息。本設(shè)計(jì)可以實(shí)現(xiàn)單雙程設(shè)置、系統(tǒng)暫停和清零、空車指示、信息顯示、顯示切換、掉電保護(hù)等功能。</p><p> 出租車計(jì)價(jià)是根據(jù)車所行駛的路程以及乘客乘車的方式綜合決定的。出租車行駛總路程可以通過車輪的周長乘車輪旋轉(zhuǎn)圈數(shù)得到。即可計(jì)算得到車輪旋轉(zhuǎn)幾周出租車能行駛一公里的路程。使用霍爾傳感器方便地計(jì)量車輪旋轉(zhuǎn)的圈數(shù)。輸出的脈沖信號被接
3、入到AT89S52單片機(jī)系統(tǒng)中,通過計(jì)算接收到的脈沖個(gè)數(shù),計(jì)算出當(dāng)前所行駛的路程,并且可以計(jì)算實(shí)時(shí)的速度,在速度低于5公里每小時(shí)是進(jìn)入等待計(jì)費(fèi)。與此同時(shí),根據(jù)不同的收費(fèi)標(biāo)準(zhǔn),通過選擇相應(yīng)的起步價(jià)、單價(jià)等收費(fèi)標(biāo)準(zhǔn)進(jìn)行計(jì)算。通過鍵盤能夠?qū)崿F(xiàn)往返設(shè)置,啟動、暫停、停止計(jì)價(jià)器以及切換顯示當(dāng)前的行駛里程和需支付的車費(fèi)。</p><p> 本設(shè)計(jì)硬件電路總體可以分為五個(gè)單元:單片機(jī)最小系統(tǒng)單元,指示燈電路單元,按鍵電路單元
4、,路程時(shí)間與金額顯示單元,轉(zhuǎn)速信號接收單元。軟件系統(tǒng)可以大致分為五個(gè)大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時(shí)模塊,數(shù)據(jù)計(jì)算模塊,數(shù)碼管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)速信號接收與等待記時(shí)采用中斷方式。這些軟硬件系統(tǒng)構(gòu)成了最終的設(shè)計(jì)。</p><p> 關(guān)鍵字:多功能計(jì)價(jià)器;AT89S52;AT24C02;霍爾傳感器;顯示切換</p><p><b>
5、; 目錄</b></p><p><b> 1 概述1</b></p><p> 1.1 功能要求1</p><p> 1.2 設(shè)計(jì)參數(shù)1</p><p> 1.3 系統(tǒng)原理1</p><p> 2 系統(tǒng)總體方案及硬件設(shè)計(jì)3</p><p>
6、; 2.1 系統(tǒng)總體方案3</p><p> 2.2 單片機(jī)最小系統(tǒng)單元3</p><p> 2.3 轉(zhuǎn)動信號采集單元5</p><p> 2.4 顯示單元6</p><p> 2.5 指示燈單元7</p><p> 2.6 按鍵輸入電路單元7</p><p> 2.7
7、 IO分配表8</p><p><b> 3 軟件設(shè)計(jì)9</b></p><p> 3.1 總體流程9</p><p> 3.2 計(jì)算模塊9</p><p> 3.3 鍵盤掃描9</p><p> 3.4 顯示程序9</p><p> 4 Prote
8、us軟件仿真10</p><p> 5 課程設(shè)計(jì)體會11</p><p><b> 參考文獻(xiàn):12</b></p><p> 附1 源程序代碼13</p><p> 附2 系統(tǒng)原理圖25</p><p><b> 1 概述</b></p>&
9、lt;p><b> 1.1 功能要求</b></p><p><b> 基本要求:</b></p><p> ?。?)能顯示里程,單位為公里,最后一位為小數(shù)位。</p><p> (2)能顯示金額數(shù),單位為元,最后一位為小數(shù)位。</p><p> ?。?)可設(shè)定單程價(jià)格和往返價(jià)格,單程價(jià)
10、格為2元/公里,往返價(jià)格為1.5元/公里。</p><p> ?。?)車速<5公里/小時(shí)的時(shí)間累積為總等待時(shí)間,每5分鐘等待時(shí)間相當(dāng)于里程數(shù)增加1公里。</p><p> ?。?)起步公里數(shù)為3公里,價(jià)格為5元,若實(shí)際距離大于3公里,按規(guī)則3計(jì)算價(jià)格。</p><p> ?。?)按暫停鍵,計(jì)價(jià)器可暫停計(jì)價(jià),按查詢鍵,可顯示總等待時(shí)間。</p>&
11、lt;p> 發(fā)揮部分:空車指示、語音提示、信息存儲等。</p><p><b> 1.2 設(shè)計(jì)參數(shù)</b></p><p> 由于要求沒有給出車輪的相關(guān)參數(shù),所以這里進(jìn)行一些基本參數(shù)的查詢。據(jù)調(diào)查統(tǒng)計(jì),現(xiàn)行出租車輪胎直徑大致有四種,直徑分別為520mm、540mm、560mm和580mm.</p><p> 本作品針對560mm的
12、出租車進(jìn)行設(shè)計(jì)。它的周長為:1.7584 m,57圈行駛100m。</p><p><b> 1.3 系統(tǒng)原理</b></p><p> 出租車計(jì)價(jià)器是乘客與司機(jī)雙方的交易準(zhǔn)則,它是出租車行業(yè)發(fā)展的重要標(biāo)志。它關(guān)系著交易雙方的利益,具有良好性能的計(jì)價(jià)器無論是對廣大出租車司機(jī)朋友還是乘客來說都是很必要的。因此,汽車計(jì)價(jià)器的研究也是十分有應(yīng)用價(jià)值和現(xiàn)實(shí)意義的。<
13、/p><p> 出租車計(jì)價(jià)是根據(jù)車所行駛的路程以及乘客乘車的方式綜合決定的。出租車行駛總路程可以通過車輪的周長乘車輪旋轉(zhuǎn)圈數(shù)得到。即可計(jì)算得到車輪旋轉(zhuǎn)幾周出租車能行駛一公里的路程。使用霍爾傳感器方便地計(jì)量車輪旋轉(zhuǎn)的圈數(shù)。輸出的脈沖信號被接入到AT89S52單片機(jī)系統(tǒng)中,通過計(jì)算接收到的脈沖個(gè)數(shù),計(jì)算出當(dāng)前所行駛的路程,并且可以計(jì)算實(shí)時(shí)的速度,在速度低于5公里每小時(shí)是進(jìn)入等待計(jì)費(fèi)。于此同時(shí),根據(jù)不同的收費(fèi)標(biāo)準(zhǔn),通過選
14、擇相應(yīng)的起步價(jià)、單價(jià)等收費(fèi)標(biāo)準(zhǔn)進(jìn)行計(jì)算。通過鍵盤能夠?qū)崿F(xiàn)往返設(shè)置,啟動、暫停、停止計(jì)價(jià)器以及切換顯示當(dāng)前的行駛里程和需支付的車費(fèi)。</p><p> 本設(shè)計(jì)硬件電路分為五個(gè)單元:單片機(jī)最小系統(tǒng)單元,指示燈電路單元,按鍵電路單元,路程時(shí)間與金額顯示單元,轉(zhuǎn)速信號接收單元。軟件系統(tǒng)分為五個(gè)大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時(shí)模塊,數(shù)據(jù)計(jì)算模塊,數(shù)碼管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)
15、速信號接收與等待記時(shí)采用中斷方式。這些軟硬件系統(tǒng)構(gòu)成了最終的設(shè)計(jì)。</p><p> 2 系統(tǒng)總體方案及硬件設(shè)計(jì)</p><p> 2.1 系統(tǒng)總體方案</p><p> 本設(shè)計(jì)可以分為五個(gè)單元,分別為:單片機(jī)最小系統(tǒng)單元、轉(zhuǎn)速信號接收單元、路程時(shí)間與金額顯示單元、指示燈電路單元、按鍵輸入電路單元。系統(tǒng)框圖如圖1所示:</p><p>
16、<b> 圖1 系統(tǒng)框圖</b></p><p> 2.2 單片機(jī)最小系統(tǒng)單元</p><p> 主控機(jī)系統(tǒng)采用了Atmel 公司生產(chǎn)的 AT89S52單片機(jī),它含有256 字節(jié)數(shù)據(jù)存儲器,內(nèi)置8K 的電可擦除FLASH ROM,可重復(fù)編程,大小滿足主控機(jī)軟件系統(tǒng)設(shè)計(jì)。</p><p> AT89S52主要功能列舉如下:</p&g
17、t;<p> 1、擁有靈巧的8位CPU和在系統(tǒng)可編程Flash</p><p> 2、晶片內(nèi)部具時(shí)鐘振蕩器(傳統(tǒng)最高工作頻率可至 12MHz)</p><p> 3、內(nèi)部程序存儲器(ROM)為 8KB</p><p> 4、內(nèi)部數(shù)據(jù)存儲器(RAM)為 256字節(jié)</p><p> 5、32 個(gè)可編程I/O 口線<
18、/p><p> 6、8 個(gè)中斷向量源</p><p> 7、三個(gè) 16 位定時(shí)器/計(jì)數(shù)器</p><p> 8、三級加密程序存儲器</p><p> 全雙工UART串行通道。</p><p> AT89S51芯片的40個(gè)引腳功能分別為:</p><p> VCC 電源電壓。</p
19、><p><b> GND 接地。</b></p><p> RST 復(fù)位輸入。當(dāng)RST變?yōu)楦唠娖讲⒈3?個(gè)機(jī)器周期時(shí),將使單片機(jī)復(fù)位。WDT溢出將使該引腳輸出高電平,設(shè)置SFR AUXR的DISRTO位(地址8EH)可打開或關(guān)閉該功能。DISKRTO位缺省為RESET輸出高電平打開狀態(tài)。</p><p> ALE/PROG: 當(dāng)訪問外
20、部存儲器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時(shí),將跳過一個(gè)ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時(shí),ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部
21、執(zhí)行狀態(tài)ALE禁止,置位無效。</p><p> /PSEN: 外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時(shí),這兩次有效的/PSEN信號將不出現(xiàn)。</p><p> /EA/VPP: 當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為
22、RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p> XTAL1 反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。</p><p> XTAL2 來自反向振蕩放大器的輸出。</p><p> P0口:一組8位漏極開路型雙向I/O口。也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時(shí),
23、每位能驅(qū)動8個(gè)TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時(shí),這組口線分時(shí)轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash編程時(shí),P0口接收指令字節(jié),而在程序校驗(yàn)時(shí),輸出指令字節(jié),校驗(yàn)時(shí),要求外接上拉電阻。</p><p> P1口:一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1
24、”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口。作輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號拉低時(shí)會輸出一個(gè)電流。Flash編程和程序校驗(yàn)期間,P1接收低8位地址。</p><p> P2口:一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口。P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口。作輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電
25、阻,某個(gè)引腳被外部信號拉低時(shí)會輸出一個(gè)電流。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器時(shí),P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器時(shí),P2口線上的內(nèi)容在整個(gè)訪問期間不改變。Flash編程和程序校驗(yàn)期間,P2亦接收低8位地址。</p><p> P3口:一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口。P3的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個(gè)TTL邏輯門電路。對P3口寫“1”時(shí),它們被內(nèi)部的上拉電阻
26、把拉到高電并可作輸入端口。作輸入端口使用時(shí),被外部拉低的P3口將用上拉電阻輸出電流。P3口除了作為一般的I/O口線外,還作特殊功能口。P3口的第二功能引腳分配如下:</p><p> P3.0:RXD,串行通信輸入。</p><p> P3.1:TXD,串行通信輸出。</p><p> P3.2:INT0,外部中斷0輸入。</p><p&g
27、t; P3.3:INT1,外部中斷1輸入。</p><p> P3.4:T0,計(jì)時(shí)計(jì)數(shù)器0輸入。</p><p> P3.5:T1,計(jì)時(shí)計(jì)數(shù)器1輸入。</p><p> P3.6:WR:外部數(shù)據(jù)存儲器的寫入信號。</p><p> P3.7:RD,外部數(shù)據(jù)存儲器的讀取信號。</p><p> 單片機(jī)最小系統(tǒng)
28、原理圖如圖2所示。</p><p> 2.3 轉(zhuǎn)動信號采集單元</p><p> 轉(zhuǎn)動信號采集是利用霍爾傳感器來實(shí)現(xiàn)的,轉(zhuǎn)輪每轉(zhuǎn)動一周,霍爾傳感器發(fā)出一個(gè)脈沖,然后發(fā)給單片機(jī)的外部中斷0端口P3.2,通過中斷來接受傳感器的信號。此模塊的模型如圖3所示。</p><p> 圖2 單片機(jī)最小系統(tǒng)原理圖</p><p> 圖3 轉(zhuǎn)動信號采集
29、單元模型</p><p><b> 2.4 顯示單元</b></p><p> 采用兩個(gè)四位8段共陰數(shù)碼顯示,一組顯示金額,另一組顯示路程與等待時(shí)間配合按鍵來切換。數(shù)據(jù)位選用單片機(jī)P0口,片選端分別接在P2口的高四位和低四位。它們的連線如圖4所示。</p><p> 圖4 顯示單元原理圖</p><p><b
30、> 2.5 指示燈單元</b></p><p> 本設(shè)計(jì)按照功能要求設(shè)置了五個(gè)LED燈。原理接線圖如圖5所示。</p><p> 各個(gè)LED燈的功能分別為:</p><p> led0:空車指示;</p><p> led1:指示單程還是雙程,當(dāng)選擇雙程計(jì)費(fèi)時(shí)亮;</p><p> led
31、2:指示顯示的是路程還是等待時(shí)間,顯示等待時(shí)間時(shí)亮;</p><p> led3:指示系統(tǒng)暫停與否,當(dāng)選擇暫停時(shí)亮;</p><p> led4:指示堵車與否,堵車指示時(shí)燈亮。</p><p> 圖5 指示燈單元原理圖 圖6 按鍵輸入電路單元原理圖</p><p> 2.6 按鍵輸入電路單元</p>
32、<p> 本設(shè)計(jì)按照功能要求設(shè)置了五個(gè)按鍵。其功能分別為:</p><p> key0:系統(tǒng)清零,用來將整個(gè)計(jì)費(fèi)系統(tǒng)的顯示清零;</p><p> key1:單程雙程,用來設(shè)置是單程還是往返計(jì)費(fèi);</p><p> key2:顯示切換,用來切換路程與等待時(shí)間的顯示;</p><p> key3:系統(tǒng)暫停,用來將整個(gè)計(jì)費(fèi)
33、系統(tǒng)暫停;</p><p> key4:掉電數(shù)據(jù)恢復(fù)。</p><p><b> 2.7 IO分配表</b></p><p> 根據(jù)以上分析,總體IO分配如表1所示。</p><p><b> 表1 IO分配表</b></p><p><b> 3 軟件
34、設(shè)計(jì)</b></p><p><b> 3.1 總體流程</b></p><p> 軟件系統(tǒng)可以大致分為五個(gè)大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時(shí)模塊,數(shù)據(jù)計(jì)算模塊,數(shù)碼管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)速信號接收與等待記時(shí)采用中斷方式。</p><p><b> 3.2 計(jì)算模塊&l
35、t;/b></p><p> 計(jì)算程序根據(jù)里程數(shù)分別進(jìn)入不同的計(jì)算公式。如果里程大于3公里,則執(zhí)行公式:總金額=起步價(jià)+(里程-3)*單價(jià)+等待時(shí)間*等待單價(jià);否則,執(zhí)行公式:總金額=起步價(jià)+等待時(shí)間*等待單價(jià)。</p><p> 對于里程數(shù)采用外部中斷零來記錄,車輪沒轉(zhuǎn)一周,霍爾傳感器發(fā)一個(gè)脈沖然后進(jìn)入中斷子程序,對相應(yīng)的變量進(jìn)行更新。</p><p>
36、 對于速度的判斷及等待時(shí)間的記錄采用定時(shí)器零中斷,設(shè)定10ms一個(gè)中斷,然后判斷車速,小于5公里/小時(shí)時(shí),則開始記錄等待時(shí)間。</p><p><b> 3.3 鍵盤掃描</b></p><p> 鍵盤掃描才用查詢方式,當(dāng)有按鍵按下時(shí)就對相應(yīng)的標(biāo)志進(jìn)行取反,或調(diào)用其他子函數(shù),在消抖過程中,這里將數(shù)碼管顯示程序潛入以保證顯示的穩(wěn)定。</p><
37、p><b> 3.4 顯示程序</b></p><p> 顯示程序利用主函數(shù)內(nèi)的循環(huán),實(shí)現(xiàn)動態(tài)掃描顯示,同時(shí)根據(jù)數(shù)碼管余輝和人眼暫留現(xiàn)象,即可實(shí)現(xiàn)顯示。本設(shè)計(jì)采用兩個(gè)四個(gè)一組的八位數(shù)碼管來顯示,一組顯示金額,另一組顯示路程與等待時(shí)間配合按鍵來切換。數(shù)據(jù)端都用單片機(jī)P1口,片選端分別接在P2口的高四位和低四位。</p><p> 4 Proteus軟件仿真&
38、lt;/p><p> 將整個(gè)系統(tǒng)原理圖在Proteus連接好后,下載如編寫好的程序仿真如下:</p><p> 如圖顯示的狀態(tài)設(shè)置為:單程,車速大于5km/h,當(dāng)路程等于40.4km時(shí)的顯示情況。</p><p><b> 5 課程設(shè)計(jì)體會</b></p><p> 本次單片機(jī)課程設(shè)計(jì),我們選的題目是出租車計(jì)價(jià)器的設(shè)
39、計(jì)。通過仿真、焊接、調(diào)試等不斷的努力,我們的出租車計(jì)價(jià)器實(shí)現(xiàn)了基本要求的全部功能和發(fā)揮部分的部分功能。比如能顯示里程、金額數(shù)、總等待時(shí)間,可設(shè)定單程價(jià)格和往返價(jià)格,按暫停鍵,計(jì)價(jià)器可暫停計(jì)價(jià),按查詢鍵,可顯示總等待時(shí)間,空車指示、信息存儲等。</p><p> 經(jīng)過這些天有關(guān)于出租車計(jì)價(jià)器的課程設(shè)計(jì),使我對MCS-51系列單片機(jī)的應(yīng)用有了更深的了解。從前的學(xué)習(xí)過程過于浮淺,只是流于表面的理解,而現(xiàn)在要做課程設(shè)計(jì)
40、,就不得不要求我們對所用到的知識有更深層次的理解。因?yàn)檎n程設(shè)計(jì)的內(nèi)容比及書本中的理論知識而言,更接近于現(xiàn)實(shí)生活,而理論到實(shí)踐的轉(zhuǎn)化往往是一個(gè)艱難的過程,它猶如一只攔路虎,橫更在我們的面前。但是我們毫不畏懼,因?yàn)槲覀兿嘈盼覀兡苄小?lt;/p><p> 事情并不總是一帆風(fēng)順的,我們總會遇到困難和險(xiǎn)阻。在此次課程設(shè)計(jì)的過程中,我們碰到了許多的問題。比如,對于數(shù)碼管動態(tài)掃描顯示和鍵盤的延時(shí)防抖的綜合編程不能較好地解決;對
41、于代碼的前后順序及調(diào)用掌握得還不夠好;對于一些相關(guān)的應(yīng)用軟件( KEIL、PROTEUS、Altium designer 09 )沒能熟練掌握。當(dāng)然,問題并不可怕,只要我們懷著一顆不服輸?shù)男模峦鼻?,那么勝利將不會離我們太遠(yuǎn)。通過上網(wǎng)查找資料、與同學(xué)老師交流、小組成員間的討論、不斷實(shí)踐與探索,我們總能找到解決問題的方法,最后得到良好的效果。</p><p> 通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要
42、的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實(shí)際動手能力和獨(dú)立思考的能力。同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固。</p><p> 這期間,我們最大的收獲就是自己的動手能力和獨(dú)立解決問題的能力得到了很大的提高,也充分體會到了自己設(shè)計(jì)東西的樂趣、學(xué)會查閱資料和對別人的東西融會變通的重要性
43、,也明白了很多知識光靠趴在書本上學(xué)是學(xué)不到其中的精髓的,必須親自去試著實(shí)踐,親自去經(jīng)歷才能對它們真正的掌握,凡事都要自己去動下手,去實(shí)踐一下,遇到困難,永遠(yuǎn)不要沮喪氣餒。在動手的過程中,不僅能增強(qiáng)實(shí)踐能力,而且在理論上可以有更深的認(rèn)識;這次設(shè)計(jì)給了我們極大的鼓舞和信心,相信在以后的學(xué)習(xí)中可以通過不斷的摸索和實(shí)踐來提高其他方面的知識。</p><p> 總之,本次課程設(shè)計(jì)讓我們更加深刻的掌握了MCS-51系列單片
44、機(jī)的工作原理和編程語言,更加熟練的掌握了KEIL、PROTEUS、Altium designer 09等專業(yè)軟件的使用,熟悉了產(chǎn)品開發(fā)的大致流程,深刻的體會到了團(tuán)隊(duì)協(xié)作精神的重要性,培養(yǎng)了我們發(fā)現(xiàn)問題、獨(dú)立思考問題、多種途徑解決問題的能力,鍛煉并提高了了我們的動手實(shí)踐能力和理論與實(shí)踐相結(jié)合的能力。</p><p> 我們以后一定會更加努力地進(jìn)行學(xué)習(xí)和實(shí)踐,做到學(xué)以致用,把知識學(xué)活,做一個(gè)動手能力強(qiáng)的大學(xué)生。&l
45、t;/p><p><b> 參考文獻(xiàn):</b></p><p> [1]譚浩強(qiáng)著. C程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2005.</p><p> [2]張友德、趙志英、涂時(shí)亮著.單片微型機(jī)原理、應(yīng)用與實(shí)驗(yàn)[M]. 上海:復(fù)旦大學(xué)出版社, 2006.</p><p> [3]吳戈、李玉峰編著. 案例學(xué)單
46、片機(jī)C語言開發(fā)[M].北京:人民郵電出版社,2008.</p><p> [4]孫余凱. 傳感器應(yīng)用電路300例[M]. 北京:電子工業(yè)出版社,2008.</p><p> [5]田立. 51單片機(jī)C語言程序設(shè)計(jì)快速入門[M]. 北京:人民郵電出版社, 2007</p><p> [6]郭天祥著. 新概念51單片機(jī)C語言教程 入門、提高、開發(fā)、拓展全攻略
47、[M]. 北京:電子工業(yè)出版社, 2009.</p><p> [7]余發(fā)山,王福忠. 單片機(jī)原理及應(yīng)用技術(shù)[M]. 徐州:中國礦業(yè)大學(xué)出版社,2008.</p><p><b> 附1 源程序代碼</b></p><p> #include<reg52.h></p><p> #include&l
48、t;intrins.h></p><p> #include<AT24C02.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> uchar code table_du[]={0x3f,0x06,0
49、x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; </p><p> uchar code table_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; </p><p> uchar tt,aa;</p><p> uchar quanshu;</p><p
50、> uchar second,minute; //等待時(shí)間</p><p> uint round; //路程,單位100m</p><p> uchar round_24c02[2];</p><p> uint distance; //走過距離,單位100m</p><p> uint price,cost
51、; //單價(jià),總價(jià)錢</p><p> uint wait; //等待時(shí)間 /秒</p><p> uchar qian,bai,shi,ge; //顯示數(shù)據(jù)各個(gè)位置數(shù)字的臨時(shí)變量</p><p> sbit key0=P3^1; //清零 (空車)/載客</p><p> sbit ke
52、y1=P3^0; //單程還是往返設(shè)置</p><p> sbit key2=P1^7; //切換顯示路程與等待時(shí)間</p><p> sbit key3=P1^6;//暫停</p><p> sbit key4=P1^5;//掉電數(shù)據(jù)恢復(fù)</p><p> sbit led0=P1^0;
53、//空車指示時(shí),燈亮。</p><p> sbit led1=P1^1;//雙程指示時(shí),燈亮。 </p><p> sbit led2=P1^2;//顯示等待時(shí)間時(shí),燈亮。</p><p> sbit led3=P1^3;//暫停指示時(shí),燈亮。 </p><p> sbit led4=P1^4; //堵車指
54、示時(shí),燈亮。</p><p> bit key0_flag;//(空車)/載客標(biāo)志位</p><p> bit key1_flag;//單程還是往返標(biāo)志位</p><p> bit key2_flag;//路程與等待時(shí)間標(biāo)志位</p><p> bit key3_flag;//暫停標(biāo)志位</p&g
55、t;<p> bit flag;//堵車(等待)標(biāo)志位</p><p> void delayms(unsigned int c)</p><p><b> {</b></p><p> unsigned char b;</p><p> for(;c>0;c--)</p&
56、gt;<p> for(b=110;b>0;b--);</p><p><b> }</b></p><p> void delay_dis(void)</p><p><b> {</b></p><p> unsigned char b,c;</p>
57、<p> for(c=7;c>0;c--)</p><p> for(b=110;b>0;b--);</p><p> } </p><p> //初始化函數(shù) (剛上電時(shí))</p><p> void init_data(void)</p><p><b>
58、 {</b></p><p> distance=0;</p><p><b> cost=0;</b></p><p><b> round=0;</b></p><p><b> second=0;</b></p><p><
59、;b> minute=0;</b></p><p> key0_flag=0;//空車</p><p> key1_flag=0; //單程</p><p> key2_flag=1; //路程</p><p> key3_flag=0; //正常,非暫停</p><p>
60、;<b> flag=1;</b></p><p><b> }</b></p><p> void jisuan(void)</p><p><b> {</b></p><p> wait=minute*60+second;</p><p&
61、gt; distance=round+wait/30;//車輪轉(zhuǎn)57圈為100m,等待時(shí)間30s為100m</p><p> if(key1_flag)</p><p> price=15; //往返價(jià)格 1.5元/公里 </p><p><b> else</b></p><p> price=20;
62、 //單程價(jià)格 2元/公里 </p><p> if(distance<=30) //小于3公里 </p><p> cost=50; </p><p><b> else</b></p><p> cost=price*(distance
63、-30)/10+50;</p><p><b> }</b></p><p> //顯示的輔助程序,分離一個(gè)數(shù)的各位數(shù)字</p><p> void fenli(uint temp) //數(shù)據(jù)的分離處理 </p><p><b> {</b></p><p> i
64、f(temp>9999) </p><p> temp=9999;</p><p> qian=temp/1000;</p><p> bai=temp/100%10;</p><p> shi=temp%100/10;</p><p> ge=temp%10; </p><p
65、><b> }</b></p><p> void write(void)</p><p><b> {</b></p><p> round_24c02[0]=round & 0x00ff;</p><p> round_24c02[1]=(round >> 8
66、) & 0x00ff ;</p><p> write_24c02(0x00,key0_flag);</p><p> write_24c02(0x01,key1_flag);</p><p> write_24c02(0x02,key2_flag);</p><p> write_24c02(0x03,key3_flag);
67、</p><p> write_24c02(0x04,second);</p><p> write_24c02(0x05,minute);</p><p> write_24c02(0x06,round_24c02[0]);</p><p> write_24c02(0x07,round_24c02[1]);</p>
68、<p><b> }</b></p><p> void read(void)</p><p><b> {</b></p><p> key0_flag=read_24c02(0x00);</p><p> key1_flag=read_24c02(0x01);</p&g
69、t;<p> key2_flag=read_24c02(0x02);</p><p> key3_flag=read_24c02(0x03);</p><p> second=read_24c02(0x04);</p><p> minute=read_24c02(0x05);</p><p> round_24c02
70、[0]=read_24c02(0x06);</p><p> round_24c02[1]=read_24c02(0x07);</p><p> round= round_24c02[1] ;</p><p> round=(round<<8)| round_24c02[0];</p><p><b> }&l
71、t;/b></p><p><b> //數(shù)碼管顯示程序</b></p><p> void display(void)</p><p><b> {</b></p><p> uint temp;</p><p> //-----顯示路程或者等待時(shí)間----
72、</p><p> if(key2_flag) </p><p><b> {</b></p><p> fenli(distance);</p><p> P2=table_we[7]; //位選,個(gè)位</p><p> P0=table_du[ge]; //段選</p
73、><p> delay_dis();</p><p> P2=table_we[6]; //位選,十位</p><p> P0=table_du[shi]|0x80; //如果是路程,點(diǎn)亮小數(shù)點(diǎn)兒</p><p> delay_dis();</p><p> P2=table_we[5];</p&
74、gt;<p> P0=table_du[bai];</p><p> delay_dis();</p><p> P2=table_we[4];</p><p> P0=table_du[qian];</p><p> delay_dis();</p><p><b> }</
75、b></p><p><b> else </b></p><p><b> { </b></p><p> temp=minute*100+second;</p><p> fenli(temp);</p><p> P2=table_we[7];
76、 //位選,個(gè)位</p><p> P0=table_du[ge]; //段選</p><p> delay_dis();</p><p> P2=table_we[6]; //位選,十位</p><p> P0=table_du[shi]; //如果是路程,點(diǎn)亮小數(shù)點(diǎn)兒</p><p>
77、delay_dis();</p><p> P2=table_we[5];</p><p> P0=table_du[bai]|0x80;</p><p> delay_dis();</p><p> P2=table_we[4];</p><p> P0=table_du[qian];</p>
78、<p><b> }</b></p><p> //-----顯示價(jià)格----</p><p> fenli(cost);</p><p> P2=table_we[3];</p><p> P0=table_du[ge];</p><p> delay_dis();<
79、;/p><p> P2=table_we[2];</p><p> P0=table_du[shi] |0x80;</p><p> delay_dis();</p><p> P2=table_we[1];</p><p> P0=table_du[bai];</p><p> del
80、ay_dis();</p><p> P2=table_we[0];</p><p> P0=table_du[qian];</p><p> //-----指示燈顯示----</p><p> led0=key0_flag; //空車時(shí)key0_flag為1,燈亮</p><p> led1=!key1_f
81、lag; //單程時(shí)key1_flag為1,燈亮</p><p> led2=key2_flag; //</p><p> led3=!key3_flag; // </p><p> led4=flag; //堵車時(shí)flag為1,燈亮</p><p><b> }</b></p><
82、;p><b> //鍵盤的掃描</b></p><p> void keyscan(void)</p><p><b> { </b></p><p> if(key0==0) // 清零 </p><p><b&
83、gt; { </b></p><p> delayms(10); //按鍵消抖</p><p> if(key0==0)</p><p><b> {</b></p><p> key0_flag=!key0_flag;</p><p> if(!key0_flag)&l
84、t;/p><p> init_data();</p><p> while(!key0);//等待按鍵松開</p><p><b> }</b></p><p><b> }</b></p><p> if(key1==0) // 單程還是往返
85、 </p><p><b> { </b></p><p> delayms(10);</p><p> if(key1==0)</p><p><b> {</b></p><p> key1_flag=!key1_flag;</p
86、><p> while(!key1);</p><p><b> }</b></p><p><b> }</b></p><p> if(key2==0) //切換路程與等待時(shí)間 </p><p><
87、b> { </b></p><p> delayms(10);</p><p> if(key2==0) </p><p><b> {</b></p><p> key2_flag=!key2_flag;</p><p> while(!key2);</p
88、><p><b> }</b></p><p><b> }</b></p><p> if(key3==0) // 暫停 </p><p><b> { </b></p><p> d
89、elayms(10);</p><p> if(key3==0)</p><p><b> {</b></p><p> key3_flag=!key3_flag;</p><p> if(key3_flag) </p><p><b> {</b></p&
90、gt;<p> EX0=0; //關(guān)閉外部中斷和定時(shí)器</p><p><b> TR0=0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>&l
91、t;/p><p><b> EX0=1;</b></p><p><b> TR0=1;</b></p><p><b> }</b></p><p> while(!key3);</p><p><b> }</b><
92、/p><p><b> }</b></p><p> if(key4==0) //掉電數(shù)據(jù)恢復(fù) </p><p><b> { </b></p><p> delayms(10);</p><p> if(
93、key4==0) </p><p><b> {</b></p><p><b> read();</b></p><p> while(!key4);</p><p><b> }</b></p><p><b> }</
94、b></p><p><b> }</b></p><p> //主程序 </p><p> void main(void)</p><p><b> {</b></p><p> init_data(); //初始
95、化數(shù)據(jù)</p><p> TMOD=0x01;</p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;</p><p> ET0=1; // 開定時(shí)器中斷</p><p> IT0=0; //外部中斷0邊沿觸發(fā)方式 <
96、/p><p> EA=1;//開總中斷</p><p> EX0=1; //開外部中斷</p><p> TR0=1; //開定時(shí)器</p><p><b> while(1)</b></p><p><b> {</b></p><p&
97、gt; keyscan();</p><p><b> jisuan();</b></p><p><b> write();</b></p><p> display();</p><p><b> } </b></p><p><b
98、> }</b></p><p> // 中斷記錄脈沖數(shù)</p><p> void zd(void) interrupt 0 //中斷0</p><p><b> {</b></p><p><b> aa++;</b></p><p>&l
99、t;b> if(flag)</b></p><p><b> {</b></p><p> quanshu++;</p><p> if(quanshu>=57)//車輪轉(zhuǎn)57圈為100m</p><p><b> {</b></p><p&
100、gt;<b> round++;</b></p><p> quanshu=0;</p><p><b> }</b></p><p><b> } </b></p><p><b> }</b></p><p>&
101、lt;b> //定時(shí)器 </b></p><p> void timer0(void) interrupt 1 //定時(shí)0</p><p><b> {</b></p><p> TH0=(65536-50000)/256; //50ms</p><p> TL0=(65536-500
102、00)%256;</p><p><b> tt++;</b></p><p> if(tt>=20) //1s采樣,計(jì)算速度</p><p><b> {</b></p><p><b> tt=0;</b></p><p>
103、 if(aa<=5) flag=0; //堵車(等待)</p><p> else flag=1; </p><p><b> aa=0;</b></p><p> if(!flag) //等待時(shí)間計(jì)時(shí)</p><p><b> { </b&g
104、t;</p><p><b> second++;</b></p><p> if(second==60)</p><p><b> { </b></p><p><b> minute++;</b></p><p><b> sec
105、ond=0;</b></p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> #in
106、clude<AT24C02.h></p><p> #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}</p><p> #define SlaveAddrW 0xAE //0xae ,a0</p><p> #define SlaveAddrR 0xAF //0xa
107、f ,a1</p><p><b> //總線引腳定義</b></p><p> sbit SDA = P3^6; /* 數(shù)據(jù)線 */</p><p> sbit SCL = P3^7; /* 時(shí)鐘線 */</p><p><b> //總線啟動條件</b></p><
108、;p> void IIC_Start(void)</p><p><b> {</b></p><p><b> SDA = 1;</b></p><p><b> SCL = 1;</b></p><p><b> somenop;</b>
109、;</p><p><b> SDA = 0;</b></p><p><b> somenop;</b></p><p><b> SCL = 0;</b></p><p><b> }</b></p><p><
110、b> //總線停止條件</b></p><p> void IIC_Stop(void)</p><p><b> {</b></p><p><b> SDA = 0;</b></p><p><b> SCL = 1;</b></p>
111、<p><b> somenop;</b></p><p><b> SDA = 1;</b></p><p><b> }</b></p><p><b> //應(yīng)答位控制</b></p><p> void IIC_Ack(bi
112、t ackbit)</p><p><b> {</b></p><p> if(ackbit) </p><p><b> {</b></p><p><b> SDA = 0;</b></p><p><b> }</b&
113、gt;</p><p><b> else </b></p><p><b> {</b></p><p><b> SDA = 1;</b></p><p><b> }</b></p><p><b> so
114、menop;</b></p><p><b> SCL = 1;</b></p><p><b> somenop;</b></p><p><b> SCL = 0;</b></p><p><b> SDA = 1; </b><
115、;/p><p><b> somenop;</b></p><p><b> }</b></p><p><b> //等待應(yīng)答</b></p><p> bit IIC_WaitAck(void)</p><p><b> {</
116、b></p><p><b> SDA = 1;</b></p><p><b> somenop;</b></p><p><b> SCL = 1;</b></p><p><b> somenop;</b></p><
117、;p> if(SDA) </p><p><b> { </b></p><p><b> SCL = 0;</b></p><p> IIC_Stop();</p><p><b> return 0;</b></p><p>
118、;<b> }</b></p><p><b> else </b></p><p><b> { </b></p><p><b> SCL = 0;</b></p><p><b> return 1;</b><
119、/p><p><b> }</b></p><p><b> }</b></p><p> //通過I2C總線發(fā)送數(shù)據(jù)</p><p> void IIC_SendByte(unsigned char byt)</p><p><b> {</b>
120、</p><p> unsigned char i;</p><p> for(i=0;i<8;i++)</p><p><b> { </b></p><p> if(byt&0x80) </p><p><b> {</b></p>
121、;<p><b> SDA = 1;</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p><b> SDA = 0;</b
122、></p><p><b> }</b></p><p><b> somenop;</b></p><p><b> SCL = 1;</b></p><p> byt <<= 1;</p><p><b> so
123、menop;</b></p><p><b> SCL = 0;</b></p><p><b> }</b></p><p><b> }</b></p><p> //從I2C總線上接收數(shù)據(jù)</p><p> unsigned
124、char IIC_RecByte(void)</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> {
125、 </b></p><p><b> SCL = 1;</b></p><p><b> somenop;</b></p><p><b> da <<= 1;</b></p><p><b> if(SDA) </b>&
126、lt;/p><p> da |= 0x01;</p><p><b> SCL = 0;</b></p><p><b> somenop;</b></p><p><b> }</b></p><p> return da;</p>
127、<p><b> }</b></p><p> unsigned char read_24c02(unsigned char add)</p><p><b> {</b></p><p> unsigned char temp;</p><p> IIC_Start();&l
128、t;/p><p> IIC_SendByte(0xa0);</p><p> IIC_WaitAck();</p><p> IIC_SendByte(add);</p><p> IIC_WaitAck();</p><p> IIC_SendByte(0xa1);</p><p>
129、IIC_WaitAck();</p><p> temp=IIC_RecByte();</p><p> IIC_WaitAck();</p><p> IIC_Stop();</p><p> return temp;</p><p><b> }</b></p><
130、;p> void write_24c02(unsigned char add,unsigned char dat)</p><p><b> {</b></p><p> IIC_Start();</p><p> IIC_SendByte(0xa0);</p><p> IIC_WaitAck();&l
131、t;/p><p> IIC_SendByte(add);</p><p> IIC_WaitAck();</p><p> IIC_SendByte(dat);</p><p> IIC_WaitAck();</p><p> IIC_Stop();</p><p><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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)--出租車計(jì)價(jià)器
- 單片機(jī)課程設(shè)計(jì)---出租車計(jì)價(jià)器
- 單片機(jī)課程設(shè)計(jì)--出租車計(jì)價(jià)器
- 單片機(jī)課程設(shè)計(jì)出租車計(jì)價(jià)器
- 單片機(jī)課程設(shè)計(jì)----出租車計(jì)價(jià)器
- 單片機(jī)課程設(shè)計(jì)-出租車計(jì)價(jià)器
- 單片機(jī)課程設(shè)計(jì)--出租車計(jì)價(jià)器
- 單片機(jī)課程設(shè)計(jì)---出租車計(jì)價(jià)器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--出租車計(jì)價(jià)器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)論文---出租車計(jì)價(jià)器
- 課程設(shè)計(jì)---基于51單片機(jī)的出租車計(jì)價(jià)器
- 畢業(yè)設(shè)計(jì)(論文)-單片機(jī)課程設(shè)計(jì)出租車計(jì)價(jià)器
- 課程設(shè)計(jì)--基于單片機(jī)的出租車計(jì)價(jià)器的設(shè)計(jì)
- 基于單片機(jī)的出租車計(jì)價(jià)器的設(shè)計(jì)(課程設(shè)計(jì))
- 基于單片機(jī)的出租車計(jì)價(jià)器設(shè)計(jì)
- 出租車計(jì)價(jià)器課程設(shè)計(jì)
- 出租車計(jì)價(jià)器課程設(shè)計(jì)
- 出租車計(jì)價(jià)器課程設(shè)計(jì)
- 出租車計(jì)價(jià)器課程設(shè)計(jì)
- 課程設(shè)計(jì)--出租車計(jì)價(jià)器設(shè)計(jì)
評論
0/150
提交評論