2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(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>  題目:出租車計價器設(shè)計</p><p>  姓 名: </p><p>  學(xué) 號: </p><p>  專業(yè)班級: </p><p>  指導(dǎo)老師:

2、 </p><p>  所在學(xué)院: 電氣工程與自動化學(xué)院 </p><p>  2012年5月20日</p><p><b>  摘要</b></p><p>  本設(shè)計用直流電機(jī)轉(zhuǎn)動模擬出租車車輪轉(zhuǎn)動,實現(xiàn)出租車多功能的計價器功能。設(shè)計采用AT89S52單片機(jī)為主控芯片,用霍爾傳感器檢測電機(jī)

3、轉(zhuǎn)盤轉(zhuǎn)速,采用AT24C02芯片使系統(tǒng)在掉電時路程、單價等重要信息的存儲保護(hù),采用兩個四位8段共陰數(shù)碼顯示管里程、總價格和等待時間等信息。本設(shè)計可以實現(xiàn)單雙程設(shè)置、系統(tǒng)暫停和清零、空車指示、信息顯示、顯示切換、掉電保護(hù)等功能。</p><p>  出租車計價是根據(jù)車所行駛的路程以及乘客乘車的方式綜合決定的。出租車行駛總路程可以通過車輪的周長乘車輪旋轉(zhuǎn)圈數(shù)得到。即可計算得到車輪旋轉(zhuǎn)幾周出租車能行駛一公里的路程。使用

4、霍爾傳感器方便地計量車輪旋轉(zhuǎn)的圈數(shù)。輸出的脈沖信號被接入到AT89S52單片機(jī)系統(tǒng)中,通過計算接收到的脈沖個數(shù),計算出當(dāng)前所行駛的路程,并且可以計算實時的速度,在速度低于5公里每小時是進(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è)計硬件電路總體可以分為五個

5、單元:單片機(jī)最小系統(tǒng)單元,指示燈電路單元,按鍵電路單元,路程時間與金額顯示單元,轉(zhuǎn)速信號接收單元。軟件系統(tǒng)可以大致分為五個大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時模塊,數(shù)據(jù)計算模塊,數(shù)碼管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)速信號接收與等待記時采用中斷方式。這些軟硬件系統(tǒng)構(gòu)成了最終的設(shè)計。</p><p>  關(guān)鍵字:多功能計價器;AT89S52;AT24C02;霍爾傳感器;顯示切換&l

6、t;/p><p><b>  目錄</b></p><p><b>  1 概述1</b></p><p>  1.1 功能要求1</p><p>  1.2 設(shè)計參數(shù)1</p><p>  1.3 系統(tǒng)原理1</p><p>  2 系統(tǒng)總體方案

7、及硬件設(shè)計3</p><p>  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 按鍵輸入電路單元

8、7</p><p>  2.7 IO分配表8</p><p><b>  3 軟件設(shè)計9</b></p><p>  3.1 總體流程9</p><p>  3.2 計算模塊9</p><p>  3.3 鍵盤掃描9</p><p>  3.4 顯示程序9<

9、;/p><p>  4 Proteus軟件仿真10</p><p>  5 課程設(shè)計體會11</p><p><b>  參考文獻(xiàn):12</b></p><p>  附1 源程序代碼13</p><p>  附2 系統(tǒng)原理圖25</p><p><b>  

10、1 概述</b></p><p><b>  1.1 功能要求</b></p><p><b>  基本要求:</b></p><p> ?。?)能顯示里程,單位為公里,最后一位為小數(shù)位。</p><p> ?。?)能顯示金額數(shù),單位為元,最后一位為小數(shù)位。</p><

11、;p>  (3)可設(shè)定單程價格和往返價格,單程價格為2元/公里,往返價格為1.5元/公里。</p><p>  (4)車速<5公里/小時的時間累積為總等待時間,每5分鐘等待時間相當(dāng)于里程數(shù)增加1公里。</p><p> ?。?)起步公里數(shù)為3公里,價格為5元,若實際距離大于3公里,按規(guī)則3計算價格。</p><p> ?。?)按暫停鍵,計價器可暫停計價,

12、按查詢鍵,可顯示總等待時間。</p><p>  發(fā)揮部分:空車指示、語音提示、信息存儲等。</p><p><b>  1.2 設(shè)計參數(shù)</b></p><p>  由于要求沒有給出車輪的相關(guān)參數(shù),所以這里進(jìn)行一些基本參數(shù)的查詢。據(jù)調(diào)查統(tǒng)計,現(xiàn)行出租車輪胎直徑大致有四種,直徑分別為520mm、540mm、560mm和580mm.</p&

13、gt;<p>  本作品針對560mm的出租車進(jìn)行設(shè)計。它的周長為:1.7584 m,57圈行駛100m。</p><p><b>  1.3 系統(tǒng)原理</b></p><p>  出租車計價器是乘客與司機(jī)雙方的交易準(zhǔn)則,它是出租車行業(yè)發(fā)展的重要標(biāo)志。它關(guān)系著交易雙方的利益,具有良好性能的計價器無論是對廣大出租車司機(jī)朋友還是乘客來說都是很必要的。因此,汽

14、車計價器的研究也是十分有應(yīng)用價值和現(xiàn)實意義的。</p><p>  出租車計價是根據(jù)車所行駛的路程以及乘客乘車的方式綜合決定的。出租車行駛總路程可以通過車輪的周長乘車輪旋轉(zhuǎn)圈數(shù)得到。即可計算得到車輪旋轉(zhuǎn)幾周出租車能行駛一公里的路程。使用霍爾傳感器方便地計量車輪旋轉(zhuǎn)的圈數(shù)。輸出的脈沖信號被接入到AT89S52單片機(jī)系統(tǒng)中,通過計算接收到的脈沖個數(shù),計算出當(dāng)前所行駛的路程,并且可以計算實時的速度,在速度低于5公里每小

15、時是進(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)分為五個大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時模塊,數(shù)據(jù)計算模塊,數(shù)碼

16、管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)速信號接收與等待記時采用中斷方式。這些軟硬件系統(tǒng)構(gòu)成了最終的設(shè)計。</p><p>  2 系統(tǒng)總體方案及硬件設(shè)計</p><p>  2.1 系統(tǒng)總體方案</p><p>  本設(shè)計可以分為五個單元,分別為:單片機(jī)最小系統(tǒng)單元、轉(zhuǎn)速信號接收單元、路程時間與金額顯示單元、指示燈電路單元、按鍵輸入電路單元。系統(tǒng)框圖

17、如圖1所示:</p><p><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è)計。</p><p>

18、;  AT89S52主要功能列舉如下:</p><p>  1、擁有靈巧的8位CPU和在系統(tǒng)可編程Flash</p><p>  2、晶片內(nèi)部具時鐘振蕩器(傳統(tǒng)最高工作頻率可至 12MHz)</p><p>  3、內(nèi)部程序存儲器(ROM)為 8KB</p><p>  4、內(nèi)部數(shù)據(jù)存儲器(RAM)為 256字節(jié)</p><

19、;p>  5、32 個可編程I/O 口線</p><p>  6、8 個中斷向量源</p><p>  7、三個 16 位定時器/計數(shù)器</p><p>  8、三級加密程序存儲器</p><p>  全雙工UART串行通道。</p><p>  AT89S51芯片的40個引腳功能分別為:</p>

20、<p>  VCC 電源電壓。</p><p><b>  GND 接地。</b></p><p>  RST 復(fù)位輸入。當(dāng)RST變?yōu)楦唠娖讲⒈3?個機(jī)器周期時,將使單片機(jī)復(fù)位。WDT溢出將使該引腳輸出高電平,設(shè)置SFR AUXR的DISRTO位(地址8EH)可打開或關(guān)閉該功能。DISKRTO位缺省為RESET輸出高電平打開狀態(tài)。</p>

21、<p>  ALE/PROG: 當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是AL

22、E才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。</p><p>  /PSEN: 外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。</p><p>  /EA/VPP: 當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否

23、有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p>  XTAL1 反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。</p><p>  XTAL2 來自反向振蕩放大器的輸出。</p><p>  P0口:一組8位漏極開路型雙

24、向I/O口。也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能驅(qū)動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。</p><p>  P1口:一個帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)

25、動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。Flash編程和程序校驗期間,P1接收低8位地址。</p><p>  P2口:一個帶內(nèi)部上拉電阻的8位雙向I/O口。P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電

26、平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。在訪問外部程序存儲器或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的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TT

27、L邏輯門電路。對P3口寫“1”時,它們被內(nèi)部的上拉電阻把拉到高電并可作輸入端口。作輸入端口使用時,被外部拉低的P3口將用上拉電阻輸出電流。P3口除了作為一般的I/O口線外,還作特殊功能口。P3口的第二功能引腳分配如下:</p><p>  P3.0:RXD,串行通信輸入。</p><p>  P3.1:TXD,串行通信輸出。</p><p>  P3.2:INT0,

28、外部中斷0輸入。</p><p>  P3.3:INT1,外部中斷1輸入。</p><p>  P3.4:T0,計時計數(shù)器0輸入。</p><p>  P3.5:T1,計時計數(shù)器1輸入。</p><p>  P3.6:WR:外部數(shù)據(jù)存儲器的寫入信號。</p><p>  P3.7:RD,外部數(shù)據(jù)存儲器的讀取信號。<

29、;/p><p>  單片機(jī)最小系統(tǒng)原理圖如圖2所示。</p><p>  2.3 轉(zhuǎn)動信號采集單元</p><p>  轉(zhuǎn)動信號采集是利用霍爾傳感器來實現(xiàn)的,轉(zhuǎn)輪每轉(zhuǎn)動一周,霍爾傳感器發(fā)出一個脈沖,然后發(fā)給單片機(jī)的外部中斷0端口P3.2,通過中斷來接受傳感器的信號。此模塊的模型如圖3所示。</p><p>  圖2 單片機(jī)最小系統(tǒng)原理圖</

30、p><p>  圖3 轉(zhuǎn)動信號采集單元模型</p><p><b>  2.4 顯示單元</b></p><p>  采用兩個四位8段共陰數(shù)碼顯示,一組顯示金額,另一組顯示路程與等待時間配合按鍵來切換。數(shù)據(jù)位選用單片機(jī)P0口,片選端分別接在P2口的高四位和低四位。它們的連線如圖4所示。</p><p>  圖4 顯示單元原理

31、圖</p><p><b>  2.5 指示燈單元</b></p><p>  本設(shè)計按照功能要求設(shè)置了五個LED燈。原理接線圖如圖5所示。</p><p>  各個LED燈的功能分別為:</p><p>  led0:空車指示;</p><p>  led1:指示單程還是雙程,當(dāng)選擇雙程計費時亮

32、;</p><p>  led2:指示顯示的是路程還是等待時間,顯示等待時間時亮;</p><p>  led3:指示系統(tǒng)暫停與否,當(dāng)選擇暫停時亮;</p><p>  led4:指示堵車與否,堵車指示時燈亮。</p><p>  圖5 指示燈單元原理圖 圖6 按鍵輸入電路單元原理圖</p><p&

33、gt;  2.6 按鍵輸入電路單元</p><p>  本設(shè)計按照功能要求設(shè)置了五個按鍵。其功能分別為:</p><p>  key0:系統(tǒng)清零,用來將整個計費系統(tǒng)的顯示清零;</p><p>  key1:單程雙程,用來設(shè)置是單程還是往返計費;</p><p>  key2:顯示切換,用來切換路程與等待時間的顯示;</p>&

34、lt;p>  key3:系統(tǒng)暫停,用來將整個計費系統(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>

35、;<p><b>  3 軟件設(shè)計</b></p><p><b>  3.1 總體流程</b></p><p>  軟件系統(tǒng)可以大致分為五個大的模塊為:總初始化模塊,按鍵掃描模塊,中斷與定時模塊,數(shù)據(jù)計算模塊,數(shù)碼管顯示模塊。其中,鍵盤掃描和數(shù)碼管顯示采用查詢方式,轉(zhuǎn)速信號接收與等待記時采用中斷方式。</p><

36、;p><b>  3.2 計算模塊</b></p><p>  計算程序根據(jù)里程數(shù)分別進(jìn)入不同的計算公式。如果里程大于3公里,則執(zhí)行公式:總金額=起步價+(里程-3)*單價+等待時間*等待單價;否則,執(zhí)行公式:總金額=起步價+等待時間*等待單價。</p><p>  對于里程數(shù)采用外部中斷零來記錄,車輪沒轉(zhuǎn)一周,霍爾傳感器發(fā)一個脈沖然后進(jìn)入中斷子程序,對相應(yīng)的變

37、量進(jìn)行更新。</p><p>  對于速度的判斷及等待時間的記錄采用定時器零中斷,設(shè)定10ms一個中斷,然后判斷車速,小于5公里/小時時,則開始記錄等待時間。</p><p><b>  3.3 鍵盤掃描</b></p><p>  鍵盤掃描才用查詢方式,當(dāng)有按鍵按下時就對相應(yīng)的標(biāo)志進(jìn)行取反,或調(diào)用其他子函數(shù),在消抖過程中,這里將數(shù)碼管顯示程序

38、潛入以保證顯示的穩(wěn)定。</p><p><b>  3.4 顯示程序</b></p><p>  顯示程序利用主函數(shù)內(nèi)的循環(huán),實現(xiàn)動態(tài)掃描顯示,同時根據(jù)數(shù)碼管余輝和人眼暫留現(xiàn)象,即可實現(xiàn)顯示。本設(shè)計采用兩個四個一組的八位數(shù)碼管來顯示,一組顯示金額,另一組顯示路程與等待時間配合按鍵來切換。數(shù)據(jù)端都用單片機(jī)P1口,片選端分別接在P2口的高四位和低四位。</p>

39、<p>  4 Proteus軟件仿真</p><p>  將整個系統(tǒng)原理圖在Proteus連接好后,下載如編寫好的程序仿真如下:</p><p>  如圖顯示的狀態(tài)設(shè)置為:單程,車速大于5km/h,當(dāng)路程等于40.4km時的顯示情況。</p><p><b>  5 課程設(shè)計體會</b></p><p>

40、  本次單片機(jī)課程設(shè)計,我們選的題目是出租車計價器的設(shè)計。通過仿真、焊接、調(diào)試等不斷的努力,我們的出租車計價器實現(xiàn)了基本要求的全部功能和發(fā)揮部分的部分功能。比如能顯示里程、金額數(shù)、總等待時間,可設(shè)定單程價格和往返價格,按暫停鍵,計價器可暫停計價,按查詢鍵,可顯示總等待時間,空車指示、信息存儲等。</p><p>  經(jīng)過這些天有關(guān)于出租車計價器的課程設(shè)計,使我對MCS-51系列單片機(jī)的應(yīng)用有了更深的了解。從前的學(xué)

41、習(xí)過程過于浮淺,只是流于表面的理解,而現(xiàn)在要做課程設(shè)計,就不得不要求我們對所用到的知識有更深層次的理解。因為課程設(shè)計的內(nèi)容比及書本中的理論知識而言,更接近于現(xiàn)實生活,而理論到實踐的轉(zhuǎn)化往往是一個艱難的過程,它猶如一只攔路虎,橫更在我們的面前。但是我們毫不畏懼,因為我們相信我們能行。</p><p>  事情并不總是一帆風(fēng)順的,我們總會遇到困難和險阻。在此次課程設(shè)計的過程中,我們碰到了許多的問題。比如,對于數(shù)碼管動

42、態(tài)掃描顯示和鍵盤的延時防抖的綜合編程不能較好地解決;對于代碼的前后順序及調(diào)用掌握得還不夠好;對于一些相關(guān)的應(yīng)用軟件( KEIL、PROTEUS、Altium designer 09 )沒能熟練掌握。當(dāng)然,問題并不可怕,只要我們懷著一顆不服輸?shù)男?,勇往直前,那么勝利將不會離我們太遠(yuǎn)。通過上網(wǎng)查找資料、與同學(xué)老師交流、小組成員間的討論、不斷實踐與探索,我們總能找到解決問題的方法,最后得到良好的效果。</p><p>

43、  通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實際動手能力和獨立思考的能力。同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固。</p><p>  這期間,我們最大的收獲就是自己的動手能力和獨立解決問題的能力得到了很大的提高,也充分體會到了自己設(shè)計

44、東西的樂趣、學(xué)會查閱資料和對別人的東西融會變通的重要性,也明白了很多知識光靠趴在書本上學(xué)是學(xué)不到其中的精髓的,必須親自去試著實踐,親自去經(jīng)歷才能對它們真正的掌握,凡事都要自己去動下手,去實踐一下,遇到困難,永遠(yuǎn)不要沮喪氣餒。在動手的過程中,不僅能增強(qiáng)實踐能力,而且在理論上可以有更深的認(rèn)識;這次設(shè)計給了我們極大的鼓舞和信心,相信在以后的學(xué)習(xí)中可以通過不斷的摸索和實踐來提高其他方面的知識。</p><p>  總之,

45、本次課程設(shè)計讓我們更加深刻的掌握了MCS-51系列單片機(jī)的工作原理和編程語言,更加熟練的掌握了KEIL、PROTEUS、Altium designer 09等專業(yè)軟件的使用,熟悉了產(chǎn)品開發(fā)的大致流程,深刻的體會到了團(tuán)隊協(xié)作精神的重要性,培養(yǎng)了我們發(fā)現(xiàn)問題、獨立思考問題、多種途徑解決問題的能力,鍛煉并提高了了我們的動手實踐能力和理論與實踐相結(jié)合的能力。</p><p>  我們以后一定會更加努力地進(jìn)行學(xué)習(xí)和實踐,做

46、到學(xué)以致用,把知識學(xué)活,做一個動手能力強(qiáng)的大學(xué)生。</p><p><b>  參考文獻(xiàn):</b></p><p>  [1]譚浩強(qiáng)著. C程序設(shè)計[M]. 北京:清華大學(xué)出版社,2005.</p><p>  [2]張友德、趙志英、涂時亮著.單片微型機(jī)原理、應(yīng)用與實驗[M]. 上海:復(fù)旦大學(xué)出版社, 2006.</p>&l

47、t;p>  [3]吳戈、李玉峰編著. 案例學(xué)單片機(jī)C語言開發(fā)[M].北京:人民郵電出版社,2008.</p><p>  [4]孫余凱. 傳感器應(yīng)用電路300例[M]. 北京:電子工業(yè)出版社,2008.</p><p>  [5]田立. 51單片機(jī)C語言程序設(shè)計快速入門[M]. 北京:人民郵電出版社, 2007</p><p>  [6]郭天祥著. 新

48、概念51單片機(jī)C語言教程 入門、提高、開發(fā)、拓展全攻略[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

49、><p>  #include<intrins.h></p><p>  #include<AT24C02.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  uchar c

50、ode table_du[]={0x3f,0x06,0x5b,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>  ucha

51、r quanshu;</p><p>  uchar second,minute; //等待時間</p><p>  uint round; //路程,單位100m</p><p>  uchar round_24c02[2];</p><p>  uint distance; //走過距離,單位100m</p>

52、<p>  uint price,cost; //單價,總價錢</p><p>  uint wait; //等待時間 /秒</p><p>  uchar qian,bai,shi,ge; //顯示數(shù)據(jù)各個位置數(shù)字的臨時變量</p><p>  sbit key0=P3^1; //清零 (空車)/載客<

53、;/p><p>  sbit key1=P3^0; //單程還是往返設(shè)置</p><p>  sbit key2=P1^7; //切換顯示路程與等待時間</p><p>  sbit key3=P1^6;//暫停</p><p>  sbit key4=P1^5;//掉電數(shù)據(jù)恢復(fù)</p>

54、<p>  sbit led0=P1^0;//空車指示時,燈亮。</p><p>  sbit led1=P1^1;//雙程指示時,燈亮。 </p><p>  sbit led2=P1^2;//顯示等待時間時,燈亮。</p><p>  sbit led3=P1^3;//暫停指示時,燈亮。 </p><p&g

55、t;  sbit led4=P1^4; //堵車指示時,燈亮。</p><p>  bit key0_flag;//(空車)/載客標(biāo)志位</p><p>  bit key1_flag;//單程還是往返標(biāo)志位</p><p>  bit key2_flag;//路程與等待時間標(biāo)志位</p><p>  bit k

56、ey3_flag;//暫停標(biāo)志位</p><p>  bit flag;//堵車(等待)標(biāo)志位</p><p>  void delayms(unsigned int c)</p><p><b>  {</b></p><p>  unsigned char b;</p><p&g

57、t;  for(;c>0;c--)</p><p>  for(b=110;b>0;b--);</p><p><b>  }</b></p><p>  void delay_dis(void)</p><p><b>  {</b></p><p>  uns

58、igned char b,c;</p><p>  for(c=7;c>0;c--)</p><p>  for(b=110;b>0;b--);</p><p>  } </p><p>  //初始化函數(shù) (剛上電時)</p><p>  void init_data(void)<

59、/p><p><b>  {</b></p><p>  distance=0;</p><p><b>  cost=0;</b></p><p><b>  round=0;</b></p><p><b>  second=0;</b&

60、gt;</p><p><b>  minute=0;</b></p><p>  key0_flag=0;//空車</p><p>  key1_flag=0; //單程</p><p>  key2_flag=1; //路程</p><p>  key3_flag=0; /

61、/正常,非暫停</p><p><b>  flag=1;</b></p><p><b>  }</b></p><p>  void jisuan(void)</p><p><b>  {</b></p><p>  wait=minute*6

62、0+second;</p><p>  distance=round+wait/30;//車輪轉(zhuǎn)57圈為100m,等待時間30s為100m</p><p>  if(key1_flag)</p><p>  price=15; //往返價格 1.5元/公里 </p><p><b>  else</b></

63、p><p>  price=20; //單程價格 2元/公里 </p><p>  if(distance<=30) //小于3公里 </p><p>  cost=50; </p><p><b>  else</b></p><

64、p>  cost=price*(distance-30)/10+50;</p><p><b>  }</b></p><p>  //顯示的輔助程序,分離一個數(shù)的各位數(shù)字</p><p>  void fenli(uint temp) //數(shù)據(jù)的分離處理 </p><p><b>  {</b&

65、gt;</p><p>  if(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=te

66、mp%10; </p><p><b>  }</b></p><p>  void write(void)</p><p><b>  {</b></p><p>  round_24c02[0]=round & 0x00ff;</p><p>  round

67、_24c02[1]=(round >> 8) & 0x00ff ;</p><p>  write_24c02(0x00,key0_flag);</p><p>  write_24c02(0x01,key1_flag);</p><p>  write_24c02(0x02,key2_flag);</p><p>  w

68、rite_24c02(0x03,key3_flag);</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,r

69、ound_24c02[1]);</p><p><b>  }</b></p><p>  void read(void)</p><p><b>  {</b></p><p>  key0_flag=read_24c02(0x00);</p><p>  key1_fla

70、g=read_24c02(0x01);</p><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&

71、gt;<p>  round_24c02[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&g

72、t;<p><b>  }</b></p><p><b>  //數(shù)碼管顯示程序</b></p><p>  void display(void)</p><p><b>  {</b></p><p>  uint temp;</p><p

73、>  //-----顯示路程或者等待時間----</p><p>  if(key2_flag) </p><p><b>  {</b></p><p>  fenli(distance);</p><p>  P2=table_we[7]; //位選,個位</p><p>  P

74、0=table_du[ge]; //段選</p><p>  delay_dis();</p><p>  P2=table_we[6]; //位選,十位</p><p>  P0=table_du[shi]|0x80; //如果是路程,點亮小數(shù)點兒</p><p>  delay_dis();</p><p&

75、gt;  P2=table_we[5];</p><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>

76、<p><b>  }</b></p><p><b>  else </b></p><p><b>  { </b></p><p>  temp=minute*100+second;</p><p>  fenli(temp);</p>

77、<p>  P2=table_we[7]; //位選,個位</p><p>  P0=table_du[ge]; //段選</p><p>  delay_dis();</p><p>  P2=table_we[6]; //位選,十位</p><p>  P0=table_du[shi]; //如果是路程,點亮

78、小數(shù)點兒</p><p>  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

79、=table_du[qian];</p><p><b>  }</b></p><p>  //-----顯示價格----</p><p>  fenli(cost);</p><p>  P2=table_we[3];</p><p>  P0=table_du[ge];</p>

80、<p>  delay_dis();</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]

81、;</p><p>  delay_dis();</p><p>  P2=table_we[0];</p><p>  P0=table_du[qian];</p><p>  //-----指示燈顯示----</p><p>  led0=key0_flag; //空車時key0_flag為1,燈亮</p&g

82、t;<p>  led1=!key1_flag; //單程時key1_flag為1,燈亮</p><p>  led2=key2_flag; //</p><p>  led3=!key3_flag; // </p><p>  led4=flag; //堵車時flag為1,燈亮</p><p><b> 

83、 }</b></p><p><b>  //鍵盤的掃描</b></p><p>  void keyscan(void)</p><p><b>  { </b></p><p>  if(key0==0) // 清零

84、</p><p><b>  { </b></p><p>  delayms(10); //按鍵消抖</p><p>  if(key0==0)</p><p><b>  {</b></p><p>  key0_flag=!key0_flag;</p>

85、<p>  if(!key0_flag)</p><p>  init_data();</p><p>  while(!key0);//等待按鍵松開</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key

86、1==0) // 單程還是往返 </p><p><b>  { </b></p><p>  delayms(10);</p><p>  if(key1==0)</p><p><b>  {</b></p><p>  

87、key1_flag=!key1_flag;</p><p>  while(!key1);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key2==0) //切換路程與等待時間

88、 </p><p><b>  { </b></p><p>  delayms(10);</p><p>  if(key2==0) </p><p><b>  {</b></p><p>  key2_flag=!key2_flag;</p><

89、;p>  while(!key2);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key3==0) // 暫停 </p><p><b>  { </b&

90、gt;</p><p>  delayms(10);</p><p>  if(key3==0)</p><p><b>  {</b></p><p>  key3_flag=!key3_flag;</p><p>  if(key3_flag) </p><p>&l

91、t;b>  {</b></p><p>  EX0=0; //關(guān)閉外部中斷和定時器</p><p><b>  TR0=0;</b></p><p><b>  }</b></p><p><b>  else</b></p><p&

92、gt;<b>  {</b></p><p><b>  EX0=1;</b></p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p>  while(!key3);</p><p>

93、;<b>  }</b></p><p><b>  }</b></p><p>  if(key4==0) //掉電數(shù)據(jù)恢復(fù) </p><p><b>  { </b></p><p>  delayms(10)

94、;</p><p>  if(key4==0) </p><p><b>  {</b></p><p><b>  read();</b></p><p>  while(!key4);</p><p><b>  }</b></p>

95、<p><b>  }</b></p><p><b>  }</b></p><p>  //主程序 </p><p>  void main(void)</p><p><b>  {</b></p><

96、;p>  init_data(); //初始化數(shù)據(jù)</p><p>  TMOD=0x01;</p><p>  TH0=(65536-50000)/256;</p><p>  TL0=(65536-50000)%256;</p><p>  ET0=1; // 開定時器中斷</p><p>  I

97、T0=0; //外部中斷0邊沿觸發(fā)方式 </p><p>  EA=1;//開總中斷</p><p>  EX0=1; //開外部中斷</p><p>  TR0=1; //開定時器</p><p><b>  while(1)</b></p><p><b>  {&

98、lt;/b></p><p>  keyscan();</p><p><b>  jisuan();</b></p><p><b>  write();</b></p><p>  display();</p><p><b>  } </b>

99、;</p><p><b>  }</b></p><p>  // 中斷記錄脈沖數(shù)</p><p>  void zd(void) interrupt 0 //中斷0</p><p><b>  {</b></p><p><b>  aa++;</b

100、></p><p><b>  if(flag)</b></p><p><b>  {</b></p><p>  quanshu++;</p><p>  if(quanshu>=57)//車輪轉(zhuǎn)57圈為100m</p><p><b>  {&

101、lt;/b></p><p><b>  round++;</b></p><p>  quanshu=0;</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</

102、b></p><p><b>  //定時器 </b></p><p>  void timer0(void) interrupt 1 //定時0</p><p><b>  {</b></p><p>  TH0=(65536-50000)/256; //50ms</p>

103、<p>  TL0=(65536-50000)%256;</p><p><b>  tt++;</b></p><p>  if(tt>=20) //1s采樣,計算速度</p><p><b>  {</b></p><p><b>  tt=0;</

104、b></p><p>  if(aa<=5) flag=0; //堵車(等待)</p><p>  else flag=1; </p><p><b>  aa=0;</b></p><p>  if(!flag) //等待時間計時</p><

105、;p><b>  { </b></p><p><b>  second++;</b></p><p>  if(second==60)</p><p><b>  { </b></p><p><b>  minute++;</b></p&g

106、t;<p><b>  second=0;</b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

107、;</p><p>  #include<AT24C02.h></p><p>  #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}</p><p>  #define SlaveAddrW 0xAE //0xae ,a0</p><p>  #defin

108、e SlaveAddrR 0xAF //0xaf ,a1</p><p><b>  //總線引腳定義</b></p><p>  sbit SDA = P3^6; /* 數(shù)據(jù)線 */</p><p>  sbit SCL = P3^7; /* 時鐘線 */</p><p><b>  //總線啟動

109、條件</b></p><p>  void IIC_Start(void)</p><p><b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  SCL = 1;</b></p><p>&

110、lt;b>  somenop;</b></p><p><b>  SDA = 0;</b></p><p><b>  somenop;</b></p><p><b>  SCL = 0;</b></p><p><b>  }</b&g

111、t;</p><p><b>  //總線停止條件</b></p><p>  void IIC_Stop(void)</p><p><b>  {</b></p><p><b>  SDA = 0;</b></p><p><b>  S

112、CL = 1;</b></p><p><b>  somenop;</b></p><p><b>  SDA = 1;</b></p><p><b>  }</b></p><p><b>  //應(yīng)答位控制</b></p>

113、<p>  void IIC_Ack(bit ackbit)</p><p><b>  {</b></p><p>  if(ackbit) </p><p><b>  {</b></p><p><b>  SDA = 0;</b></p>&

114、lt;p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  }</b></p&

115、gt;<p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p><b>  SCL = 0;</b></p><p><b&

116、gt;  SDA = 1; </b></p><p><b>  somenop;</b></p><p><b>  }</b></p><p><b>  //等待應(yīng)答</b></p><p>  bit IIC_WaitAck(void)</p>

117、<p><b>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><p><b>  someno

118、p;</b></p><p>  if(SDA) </p><p><b>  { </b></p><p><b>  SCL = 0;</b></p><p>  IIC_Stop();</p><p><b>  return 0;<

119、;/b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  { </b></p><p><b>  SCL = 0;</b></p><p><b&g

120、t;  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //通過I2C總線發(fā)送數(shù)據(jù)</p><p>  void IIC_SendByte(unsigned char byt)</p><

121、p><b>  {</b></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

122、>  {</b></p><p><b>  SDA = 1;</b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p&g

123、t;<b>  SDA = 0;</b></p><p><b>  }</b></p><p><b>  somenop;</b></p><p><b>  SCL = 1;</b></p><p>  byt <<= 1;</p&

124、gt;<p><b>  somenop;</b></p><p><b>  SCL = 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //從I2C總線上接收數(shù)據(jù)</

125、p><p>  unsigned 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&

126、gt;<p><b>  { </b></p><p><b>  SCL = 1;</b></p><p><b>  somenop;</b></p><p><b>  da <<= 1;</b></p><p><

127、;b>  if(SDA) </b></p><p>  da |= 0x01;</p><p><b>  SCL = 0;</b></p><p><b>  somenop;</b></p><p><b>  }</b></p><p

128、>  return da;</p><p><b>  }</b></p><p>  unsigned char read_24c02(unsigned char add)</p><p><b>  {</b></p><p>  unsigned char temp;</p>

129、<p>  IIC_Start();</p><p>  IIC_SendByte(0xa0);</p><p>  IIC_WaitAck();</p><p>  IIC_SendByte(add);</p><p>  IIC_WaitAck();</p><p>  IIC_SendByte(0x

130、a1);</p><p>  IIC_WaitAck();</p><p>  temp=IIC_RecByte();</p><p>  IIC_WaitAck();</p><p>  IIC_Stop();</p><p>  return temp;</p><p><b> 

131、 }</b></p><p>  void write_24c02(unsigned char add,unsigned char dat)</p><p><b>  {</b></p><p>  IIC_Start();</p><p>  IIC_SendByte(0xa0);</p>

132、<p>  IIC_WaitAck();</p><p>  IIC_SendByte(add);</p><p>  IIC_WaitAck();</p><p>  IIC_SendByte(dat);</p><p>  IIC_WaitAck();</p><p>  IIC_Stop();</

溫馨提示

  • 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

提交評論