2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  基于51單片機設計的多功能</p><p><b>  出租車計價器</b></p><p><b>  目 錄</b></p><p>  第1章 引 言·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1</p

2、><p>  1. 1 出租車計價器概述~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1</p><p>  1. 2 本設計任務~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1</p>

3、<p>  1.2.1 設計任務~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1</p><p>  1.2.2 設計要求~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1</

4、p><p>  1. 3 系統(tǒng)主要功能~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2</p><p>  第2章 出租車計價器硬件設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2</p><p>  2.1 系統(tǒng)的硬件

5、構成及功能~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2</p><p>  2. 2 AT89S51單片機及其引腳說明~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2</p><p>  2.3 AT24C02引腳圖及其引腳功能~~~~~~~~~~

6、~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~4</p><p>  2. 4 AT24C02 掉電存儲單元的設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5</p><p>  2.5 里程計算、計價單元的設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

7、~~~~~~~~~~~~~~~~6</p><p>  2.6 數(shù)據(jù)顯示單元設計·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~6</p><p>  第3章 系統(tǒng)軟件設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~8</p&g

8、t;<p>  3. 1 系統(tǒng)主程序設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~8</p><p>  3. 2 定時中斷程序設計·~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10</p>&

9、lt;p>  3. 3 里程計數(shù)中斷服務程序設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~10</p><p>  3.4 中途等待中斷服務程序設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~10</p><p>  3. 5 鍵盤服務程序設計~~~

10、~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~10</p><p>  3. 6 顯示子程序服務程序設計~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~10</p><p>  第4章系統(tǒng)調試與測試結果分析~~~~~~~~~~~~~~~~~~~

11、~~~~~~~~~~~~~~~~~~~~~~~~~11</p><p>  4. 1 使用的儀器儀表~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~11</p><p>  4.2 系統(tǒng)調試~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

12、~~~~~~~~~~~~~~~~~~~~~~~~11</p><p>  結 束 語~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~12</p><p>  1、計價表使用說明~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~12</p><p>  2、全部源程序~~~~~~~~

13、~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~12</p><p><b>  第1章 引 言</b></p><p>  本次課程設計利用單片機技術來實現(xiàn)一臺多功能出租車計價器,具有性能可靠、電路簡單、成本低等特點。</p><p>  1.1 出租車計價器概述</p><p>  計價器顯示

14、的營運金額是營運里程與價格的函數(shù)(等候時間一般折算成一定比例的里程來計算)。出租車計價器通過傳感器與行駛車輛連接。出租汽車的實際里程通過傳感器的脈沖信號在計價器里折算成一定的計價營運里程。目前市場上出租車計價器功能主要有具有數(shù)據(jù)的復位功能、白天/晚上轉換功能、數(shù)據(jù)輸出功能、計時計價功能等等,但能夠進行語音播報數(shù)據(jù)信息的出租車計價器還是比較少見的,針對這一點我們來設計一款多功能出租車計價器,在原有功能的基礎上增加單價輸出、單價調整、路程輸

15、出、顯示當前的系統(tǒng)時間、語音播報數(shù)據(jù)信息等功能。</p><p>  1.2 本設計任務</p><p>  1.2.1 設計任務</p><p>  設計一款基于AT89S51單片機的出租車計價器。</p><p>  1.2.2 設計要求</p><p><b>  1.基本要求</b>&l

16、t;/p><p>  (1)不同情況具有不同的收費標準。</p><p><b>  ??白天</b></p><p><b>  ??晚上</b></p><p>  ??途中等待(>10min 開始收費)</p><p>  能進行手動修改單價。</p>

17、<p>  具有數(shù)據(jù)的復位功能。</p><p>  IO 口分配的簡易要求。</p><p>  ??距離檢測使用霍爾開關A44E</p><p>  ??白天/晚上收費標準的轉換開關</p><p><b>  ??數(shù)據(jù)的清零開關</b></p><p>  ??單價的調整(最好使

18、用+和-按鍵)</p><p>  數(shù)據(jù)輸出(采用LCM103)。</p><p>  ??單價輸出 2 位</p><p>  ??路程輸出 2 位</p><p>  ??總金額輸出 3 位</p><p><b>  按鍵。</b></p><p><b

19、>  ??啟動計時開關</b></p><p>  ??數(shù)據(jù)復位(清零)</p><p><b>  ??白天/晚上轉換</b></p><p><b>  2.發(fā)揮部分</b></p><p>  能夠在掉電的情況下存儲單價等數(shù)據(jù)。</p><p>  能

20、夠顯示當前的系統(tǒng)時間。</p><p><b>  語音播報數(shù)據(jù)信息。</b></p><p>  1.3 系統(tǒng)主要功能</p><p>  本課程設計所設計的出租車計價器的主要功能有:數(shù)據(jù)的復位、白天/晚上轉換、數(shù)據(jù)輸出、計時計價、單價輸出及調整、路程輸出、語音播報數(shù)據(jù)信息、實現(xiàn)在系統(tǒng)掉電的時候保存單價和系統(tǒng)時間等信息等功能。輸出采用8 段

21、數(shù)碼顯示管。本電路設計的計價器不但能實現(xiàn)基本的計價,而且還能根據(jù)白天、黑夜、中途等待來調節(jié)單價,同時在不計價的時候還能作為時鐘為司機同志提供方便。</p><p>  第2章 計價器硬件設計</p><p>  本系統(tǒng)的硬件設計主要包括單片機AT89S51、數(shù)據(jù)顯示部件、A44E霍爾傳感器電路、AT24C02 掉電存儲單元的設計、里程計算及計價單元的設計。在硬件設計過程中,充分利用各部件

22、的功能,實現(xiàn)多功能的出租車計價器設計。</p><p>  2.1 系統(tǒng)的硬件構成及功能</p><p>  計價器的單片機控制方案圖如圖1 單片機控制方案圖所示。它由以下幾個部件組成:單片機AT89S51、總金額及單價顯示部件、鍵盤控制部件,AT24C02 掉電存儲控制、里程計算單元、串中顯示驅動電路等。</p><p>  利用單片機豐富的IO端口,及其控制的

23、靈活性,實現(xiàn)基本的里程計價功能和價格調節(jié)、時鐘顯示功能。不但能實現(xiàn)所要求的功能而且能在很大的程度上擴展功能,而且還可以方便的對系統(tǒng)進行升級。具體電路參見附錄中“多功能出租車計價器總體電路圖”如圖1 單片機控制方案圖。</p><p>  圖1 單片機控制方案圖</p><p>  2.2 AT89S51單片機及其引腳說明</p><p>  AT89S51是美國

24、ATMEL公司生產(chǎn)的低功耗,高性能CMOS 8位單片機,片內(nèi)含4KB的可系統(tǒng)編程的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術生產(chǎn),兼容標準8051指令系統(tǒng)及引腳。它集Flash程序存儲器既可在線編程(ISP)也可用傳統(tǒng)方法進行編程及通用 8位微處理器于單片芯片中,具有高性價比。</p><p>  AT89S51是一個有40個引腳的芯片,引腳配置如圖2 AT89S51引腳配置所示。

25、</p><p>  圖2 AT89S51引腳配置</p><p>  AT89S51芯片的40個引腳功能為:</p><p>  VCC 電源電壓。</p><p><b>  GND 接地。</b></p><p>  RST 復位輸入。</p><p>  當R

26、ST變?yōu)楦唠娖讲⒈3?個機器周期時,將使單片機復位。WDT溢出將使該引腳輸出高電平,設置SFR AUXR的DISRTO位(地址8EH)可打開或關閉該功能。DISKRTO位缺省為RESET輸出高電平打開狀態(tài)。</p><p>  XTAL1 反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。</p><p>  XTAL2 來自反向振蕩放大器的輸出。</p><p>

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

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

29、gt;  P2口 一個帶內(nèi)部上拉電阻的8位雙向I/O口。P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器時,P2口線上的內(nèi)容在整個訪問期間不改變。Flash編程

30、和程序校驗期間,P2亦接收低8位地址。</p><p>  P3口 一個帶內(nèi)部上拉電阻的8位雙向I/O口。P3的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫“1”時,它們被內(nèi)部的上拉電阻把拉到高電并可作輸入端口。作輸入端口使用時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,如表2 P3口特殊功能所示。P3口還接收一些用于

31、Flash閃速存儲器編程和程序校驗期間的控制信號。</p><p>  表2 P3口特殊功能</p><p>  PSEN/ 程序儲存允許輸出是外部程序存儲器的讀先通信號,當AT89S51由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN/有效,即輸出兩個脈沖。當訪問外部數(shù)據(jù)存儲器,沒有兩次有效的PSEN/信號。</p><p>  EA/VPP 外

32、部訪問允許。欲使CPU僅訪問外部程序存儲器,EA端必須保持低電平,需注意的是:如果加密位LB1被編程,復位時內(nèi)部會鎖存EA端狀態(tài)。Flash存儲器編程時,該引腳加上+12V的編程電壓VPP。</p><p>  2.3 AT24C02引腳圖及其引腳功能</p><p>  AT24C02芯片引腳配置如圖3 </p><p>  AT24C02引腳配置圖所示。&

33、lt;/p><p>  圖3 AT24C02引腳配置圖</p><p>  AT24C02芯片DIP封裝,共有8個引腳,其中:</p><p>  A2~A0 地址引腳;</p><p>  SDA、SCL I2C總線接口;</p><p>  WP 寫保護引腳,WP接VSS時,禁止寫入高位地址,WP接VDD時,允

34、許寫入任何地址;</p><p><b>  VCC 電源端</b></p><p><b>  GND 接地端</b></p><p>  2.4 AT24C02 掉電存儲單元的設計</p><p>  掉電存儲單元的作用是在電源斷開的時候,存儲當前設定的單價信息。AT24C02是ATMEL

35、公司的2KB 字節(jié)的電可擦除存儲芯片,采用兩線串行的總線和單片機通訊,電壓最低可以到2.5V,額定電流為1mA,靜態(tài)電流10Ua(5.5V),芯片內(nèi)的資料可以在斷電的情況下保存40 年以上,而且采用8 腳的DIP 封裝,使用方便。其電路如圖 4 掉電存儲電路原理圖所示。</p><p>  圖 4 掉電存儲電路原理圖</p><p>  圖中R8、R10 是上拉電阻,其作用是減少AT2

36、4C02 的靜態(tài)功耗,由于AT24C02 的數(shù)據(jù)線和地址線是復用的,采用串口的方式傳送數(shù)據(jù),所以只用兩根線SCL(移位脈沖)和SDA(數(shù)據(jù)/地址)與單片機傳送數(shù)據(jù)。</p><p>  每當設定一次單價,系統(tǒng)就自動調用存儲程序,將單價信息保存在芯片內(nèi);當系統(tǒng)重新上電的時候,自動調用讀存儲器程序,將存儲器內(nèi)的單價等信息,讀到緩存單元中,供主程序使用。</p><p>  2.5 里程計算、

37、計價單元的設計</p><p>  里程計算是通過安裝在車輪上的霍爾傳感器A44E檢測到的信號,送到單片機,經(jīng)處理計算,送給顯示單元的。其原理如圖 5 傳感器測距示意圖所示。</p><p>  圖 5 傳感器測距示意圖</p><p>  由于A44E 屬于開關型的霍爾器件,其工作電壓范圍比較寬(4.5~18V),其輸出的信號符合TTL 電平標準,可以直接接到

38、單片機的IO 端口上,而且其最高檢測頻率可達到1MHZ。</p><p>  A44E 集成霍耳開關由穩(wěn)壓器A、霍耳電勢發(fā)生器(即硅霍耳片)B、差分放大器C、施密特觸發(fā)器D 和OC 門輸出E 五個基本部分組成。</p><p>  在輸入端輸入電壓CC V ,經(jīng)穩(wěn)壓器穩(wěn)壓后加在霍耳電勢發(fā)生器的兩端,根據(jù)霍耳效應原理,當霍耳片處在磁場中時,在垂直于磁場的方向通以電流,則與這二者相垂直的方向上

39、將會產(chǎn)生霍耳電勢差H V 輸出,該H V 信號經(jīng)放大器放大后送至施密特觸發(fā)器整形,使其成為方波輸送到OC 門輸出。當施加的磁場達到?工作點?(即OP B )時,觸發(fā)器輸出高電壓(相對于地電位),使三極管導通,此時OC 門輸出端輸出低電壓,通常稱這種狀態(tài)為?開?。當施加的磁場達到?釋放點?(即rP B )時,觸發(fā)器輸出低電壓,三極管截止,使OC 門輸出高電壓,這種狀態(tài)為?關?。這樣兩次電壓變換,使霍耳開關完成了一次開關動作。</p&

40、gt;<p>  我們選擇了P3.2 口作為信號的輸入端,內(nèi)部采用外部中斷0(這樣可以減少程序設計的麻煩),車輪每轉一圈(我們設車輪的周長是1 米),霍爾開關就檢測并輸出信號,引起單片機的中斷,對脈計數(shù),當計數(shù)達到1000 次時,也就是1 公里,單片機就控制將金額自動的加增加,其計算公式:當前單價×公里數(shù)=金額。</p><p>  2.6 數(shù)據(jù)顯示單元設計</p><

41、;p>  由于設計要求有單價(2 位)、路程(2 位)、總金額(3 位)顯示輸出,加上我們另外擴展了時鐘顯示(包含時分秒的顯示),采用LCD 液晶段碼顯示,在距離屏幕1 米之外就無法看清數(shù)據(jù),不能滿足要求,而且在白天其對比度也不能夠滿足要求,因此我們采用6 位LED數(shù)碼管的分屏顯示,如圖 6 采用6 位LED數(shù)碼管的分屏顯示所示:</p><p>  時鐘顯示(圖中顯示為12 點0 分46 秒)</

42、p><p>  圖 6 采用6 位LED數(shù)碼管的分屏顯示</p><p>  數(shù)據(jù)的分屏的顯示是通過按鍵S1 來實現(xiàn)切換的,如圖 7 S1切換顯示屏所示。</p><p>  圖 7 S1切換顯示屏</p><p>  在出租車不走的時候,按下S1,可以實現(xiàn)數(shù)據(jù)的分屏顯示;車在行走的時候只有總金額和單價顯示屏在顯示,當?shù)竭_目的地的時候,客戶要

43、求查看總的里程</p><p>  的時候,就可以按下S1 切換到里程和單價顯示屏,供客戶查詢。顯示電路的電路原理圖如圖 8 顯示器原理圖所示。</p><p>  圖 8 顯示器原理圖</p><p>  從單片機串口輸出的信號先送到左邊的移位寄存器(74HC164),由于移位脈沖的作用,使數(shù)據(jù)向右移,達到顯示的目的。移位寄存器74HC164還兼作數(shù)碼管的驅動

44、,插頭1(header1)接電源,插頭2(header2)接數(shù)據(jù)和脈沖輸出端。電路中的三個整流管D1~D3 的作用是降低數(shù)碼管的工作電壓,增加其使用壽命。</p><p>  第3章 系統(tǒng)的軟件設計</p><p>  本系統(tǒng)的軟件設計主要可分為主程序模塊、定時計數(shù)中斷程序、里程計數(shù)中斷服務程序、中途等待中斷服務程序、顯示子程序服務程序、鍵盤服務程序六大模塊。下面對各部分模塊作介紹。&l

45、t;/p><p>  3.1 系統(tǒng)主程序設計</p><p>  在主程序模塊中,需要完成對各接口芯片的初始化、出租車起價和單價的初始化、中斷向量的設計以及開中斷、循環(huán)等待等工作。另外,在主程序模塊中還需要設置啟動/清除標志寄存器、里程寄存器和價格寄存器,并對它們進行初始化。然后,主程序將根據(jù)各標志寄存器的內(nèi)容,分別完成啟動、清除、計程和計價等不同的操作。主程序流程圖如圖9 所示。當按下S1

46、時,就啟動計價,將根據(jù)里程寄存器中的內(nèi)容計算和判斷出行駛里程是否已超過起價公里數(shù)。若已超過,則根據(jù)里程值、每公里的單價數(shù)和起價數(shù)來計算出當前的累計價格,并將結果存于價格寄存器中,然后將時間和當前累計價格送顯示電路顯示出來。當?shù)竭_目的地的時候,由于霍爾開關沒有送來脈沖信號,就停止計價,顯示當前所應該付的金額和對應的單價,到下次啟動計價時,系統(tǒng)自動對顯示清零,并重新進行初始化過程。</p><p>  3.2 定時

47、中斷服務程序</p><p>  在定時中斷服務程序中,每100ms 產(chǎn)生一次中斷,當產(chǎn)生10 次中斷的時候,也就到了一秒,送數(shù)據(jù)到相應的顯示緩沖單元,并調用顯示子程序實時顯示。其程序流程如圖10 所示。</p><p>  3.3 里程計數(shù)中斷服務程序</p><p>  每當霍爾傳感器輸出一個低電平信號就使單片機中斷一次,當里程計數(shù)器對里程脈沖計滿1000 次

48、時,使微機進入里程計數(shù)中斷服務程序中。在該程序中,需要完成當前行駛里程數(shù)和總額的累加操作,并將結果存入里程和總額寄存器中。3.4 中途等待中斷服務程序</p><p>  當在計數(shù)狀態(tài)下霍爾開關沒有輸出信號,片內(nèi)的T1 定時器便被啟動,每當計時到達10分鐘,就對當前金額加上中途等待的單價,以后每十分鐘都自動加上中途等待的單價。當中途等待結束的時候,也就自動切換到正常的計價。</p><p&g

49、t;  3.5 顯示子程序服務程序</p><p>  由于是分屏顯示數(shù)據(jù),所以就要用到4 個顯示子程序,分別是:時分秒顯示子程序(HMS_DIS)、金額單價顯示子程序(CP_DIS)、路程單價顯示子程序(DP_DIS)、單價調節(jié)子程序(PA_DIS)。</p><p>  3.6 鍵盤服務程序</p><p>  鍵盤采用查詢的方式,放在主程序中,當沒有按鍵按

50、下的時候,單片機循環(huán)主程序,一旦有按鍵按下,便轉向相應的子程序處理,處理結束再返回。如圖9 主程序流程圖,圖10 定時中斷服務程序。</p><p>  第4章 系統(tǒng)調試與測試結果分析</p><p>  根據(jù)系統(tǒng)設計方案,本系統(tǒng)的調試共分為三大部分:硬件調試,軟件調試和軟硬件聯(lián)調。測試包括里程計價測試、掉電存儲測試測試。</p><p>  4.1 使用的

51、儀器儀表 </p><p>  數(shù)字萬用表        DT9203</p><p>  單片機仿真器       WAVE6000</p><p>  燒寫器 GF2100</p><p>  雙蹤穩(wěn)壓穩(wěn)流電源     DH1718E-5</p><p>  數(shù)字示波器   

52、   TDS1002</p><p><b>  4.2 系統(tǒng)調試</b></p><p>  根據(jù)系統(tǒng)設計方案,本系統(tǒng)的調試共分為三大部分:硬件調試,軟件調試和軟硬件聯(lián)調。由于在系統(tǒng)設計中采用模塊設計法,所以方便對各電路模塊功能進行逐級測試。</p><p><b>  結 束 語</b></p>

53、<p>  通過本次課程設計,又使我學到了許多書本上無法學到的知識,也使也深該體會到單片機技術應用領域的廣泛,不僅使我對學過的單片機知識有了很多的鞏固,同時也對單片機這一門課程產(chǎn)生了更大的興趣。</p><p>  在本次課程設計過程中,我學會了在網(wǎng)絡上查找有關本設計的各硬件的資源,其中包括:AT89S51單片機及其引腳說明、AT24C02引腳圖及其引腳功能等,為本次課程設計提供了一定的資料。由于平

54、時很少進行課程設計,所以對于課程設計報告的格式也是近期才接觸到,經(jīng)過這兩次的設計,為我們以后畢業(yè)設計的制作也奠定了一定的基礎。</p><p><b>  1.計價表使用說明</b></p><p> ?。?)S1按鍵的功能</p><p>  在出租車不走的時候,按下S1,可以實現(xiàn)數(shù)據(jù)的分屏顯示;車在行走的時候只有總金額和單價顯示屏在顯示,當

55、到達目的地的時候,客戶要求查看總的里程的時候,就可以按下S1 切換到里程和單價顯示屏,供客戶查詢。</p><p> ?。?)S2按鍵的功能</p><p>  在按下S1按鍵之后,若接著按下S2鍵則進行單價調整(默認為調整白天單價),當接著按下S1時,則進行晚上單價調,再次按下S1可進行中途等待單價調整。當單價調整結束后,可以通過過按下S2按鍵進行時間調整,默認為調整時,接著按下S1可進

56、行調整分,分調整后再接下S1可進行秒調整。當時調整完成后,若接著按下S2則又可進行單價調整。</p><p> ?。?)S3按鍵的功能</p><p>  在顯示金額及單價時,若按下S3鍵則顯示路程和單價,再次按下S3,可返回顯示金額及單價。</p><p> ?。?)S4按鍵的功能</p><p>  在按下S1按鍵之后,若接著按下S4按鍵

57、,則進行設定默認晚上單價,并啟動計價器,若沒有按下S4則可設定默認單價(白天),并啟動計價器。當設定默認晚上單價結束后,再次接下S4按鍵,則可設定默認中途等待單價,并啟動計價器。當設定默認中途等待單價后,若還按一次S4,則返回系統(tǒng)時間的顯示。</p><p><b>  2.全部源程序</b></p><p>  //12864(帶字庫) (漢字及字母的顯示,漢字不

58、能錯位)</p><p>  #include <stdio.h></p><p>  #include <reg52.h></p><p>  #include <absacc.h></p><p>  #define lcd_bus P0 // 數(shù)據(jù)總線</p><

59、p>  sbit rs =P3^2; //數(shù)據(jù)&指令選擇,H:寫數(shù)據(jù),L:寫指令</p><p>  sbit rw =P3^3; //讀&寫選擇,H:read,L:write</p><p>  sbit e =P3^4; //讀寫使能</p><p>  sbit psb=P3^0; //psb=H,并口模式, psb=L,串口模

60、式</p><p>  sbit rst=P3^5; //LCD復位,低有效</p><p>  sbit bf =P0^7; //忙閑狀態(tài)標志位,H:內(nèi)部正執(zhí)行操作,L:空閑</p><p>  sbit P20=P2^0; //進入單價調節(jié)</p><p>  sbit P21=P2^1; //計價開始按鍵</p>

61、<p>  sbit P23=P2^3; //時間調節(jié)按鍵</p><p>  sbit P26=P2^6; //停車鎖定屏顯按鍵</p><p>  sbit P27=P2^7; //確認按鍵</p><p>  sbit P16=P1^6; //光電開關檢測</p><p>  sbit P14=P1^4; //

62、373片選</p><p>  void delayus(unsigned char us);//延時子程序us</p><p>  void delayms(unsigned int ms);//延時子程序ms</p><p>  void init_lcd(void);//初始化</p><p>  void chk_busy(void)

63、;//檢測忙閑</p><p>  void wr_data(unsigned char dat);//寫數(shù)據(jù)到LCD</p><p>  void wr_comm(unsigned char comm);//寫命令到LCD</p><p>  void wr_str(unsigned char *s);//向LCD寫字符串,長度64字符之內(nèi)(32個漢字)</

64、p><p>  void wendu();</p><p>  sbit DS18B20=P1^7; // ds18b20數(shù)據(jù)線</p><p>  void leddisplay(); // 數(shù)碼管顯示</p><p>  void shijian();</p><p>  bit ResetDS1820(void)

65、; //復位子程序</p><p>  void WRDS18B20(unsigned char); // 寫1個字節(jié)子程序</p><p>  unsigned char RDDS18B20(void); // 讀1個字節(jié)子程序</p><p>  unsigned int GetTempDS18B20(void); //讀取溫度子程序</p>

66、<p>  void delay1s(); //延時子程序 1s</p><p>  /*-----------------DS1302程序開始----------------- -----*/</p><p>  sbit SCLK1302=P1^3; // 時鐘</p><p>  sbit DATA1302=P1^2; // 數(shù)據(jù)</p>

67、;<p>  sbit RST1302=P1^1; // 復位</p><p>  sbit BIT0=ACC^0; // 累加器A 最低位</p><p>  sbit BIT7=ACC^7; // 累加器A 最高位</p><p>  void wr1302(unsigned char dat); //向1302寫1個字節(jié)</p&g

68、t;<p>  unsigned char rd1302(void); //從1302讀1個字節(jié)</p><p>  void v_wr1302(unsigned char add,unsigned char dat); //先寫地址,后寫1字節(jié)數(shù)據(jù)</p><p>  unsigned char v_rd1302(unsigned char add);

69、 //先寫地址,后讀1字節(jié)數(shù)據(jù)</p><p>  void v_set1302(unsigned char *p2); //設置初始時間</p><p>  void v_get1302(void); //讀取DS1302當前時間</p><p>  /*

70、 -----------------DS1302程序結束------------------- */</p><p>  unsigned char RcvData[8]; // 1302接收緩沖區(qū)</p><p>  unsigned char SendData[8]={0,0,0,0,0,0,0,0}; // 1302發(fā)送緩沖區(qū)</p><p>  uns

71、igned char time[7]; //當前時間,格式: 秒 分 時 日 月 星期 年</p><p>  unsigned char settime[7]={0x20,0x55,0x14,0x20,0x07,0x03,0x09};</p><p>  //時間初始值: 秒 分 時 日 月 星期 年</p><p>  unsigned c

72、har ledxs0[8]; // 時-分-秒 LED顯示</p><p>  unsigned char ledxs[3]; // 數(shù)碼管顯示緩沖區(qū)</p><p>  unsigned char ledxs2[8]; // 時-分-秒 LED顯示</p><p>  unsigned char xs[16]; //顯示緩沖區(qū)年 月 日 時 分 秒<

73、/p><p>  unsigned char aa[5]={0x30,0x30,0x30,0x30,0}; //距離數(shù)組</p><p>  unsigned char bb[5]={0x30,0x30,0x30,0x30,0}; //費用數(shù)組</p><p>  unsigned char cc[2]={0x31,0x35};//單價數(shù)組</p><

74、;p>  unsigned char dd[4]={0,0,0,0}; //語音芯片報價數(shù)組</p><p>  void zongkong();</p><p>  void tiaojie();</p><p>  void jijia();</p><p>  void baojia();</p><p>

75、  void danjia();</p><p>  unsigned int x=15;//單價</p><p><b>  main()</b></p><p><b>  {</b></p><p>  delayms(200);</p><p>  v_set1302

76、(settime); // 設置初始時間</p><p>  zongkong();</p><p><b>  }</b></p><p>  void zongkong()</p><p><b>  { P14=1;</b></p><p>  init_lcd();/

77、/LCD初始化,并清屏</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  shijian();</p><p><b>  wendu();</b></p><p>  if(P20==0)

78、</p><p><b>  {</b></p><p>  danjia();//進入單價調節(jié)函數(shù)</p><p><b>  }</b></p><p>  if(P21==0)</p><p><b>  {</b></p><

79、p>  init_lcd();//LCD初始化,并清屏</p><p>  jijia(); //進入計價頁面</p><p><b>  }</b></p><p>  if(P23==0)</p><p>  tiaojie(); //調節(jié)時間</p><p>  wr_comm

80、(0x80);</p><p>  wr_str("泰山學院出租車行");</p><p>  wr_comm(0x90);</p><p>  wr_str(" 歡 迎 您");</p><p>  wr_comm(0x88);</p><p>  wr_str(&q

81、uot; ");</p><p>  wr_data(ledxs2[0]);</p><p>  wr_data(ledxs2[1]);</p><p>  wr_data(ledxs2[2]);</p><p>  wr_data(ledxs2[3]);</p><p>  wr_data(ledxs

82、2[4]);</p><p>  wr_data(ledxs2[5]);</p><p>  wr_data(ledxs2[6]);</p><p>  wr_data(ledxs2[7]);</p><p>  wr_comm(0x98);</p><p>  wr_data(ledxs0[0]);</p>

83、;<p>  wr_data(ledxs0[1]);</p><p>  wr_data(ledxs0[2]);</p><p>  wr_data(ledxs0[3]);</p><p>  wr_data(ledxs0[4]);</p><p>  wr_data(ledxs0[5]);</p><p&g

84、t;  wr_data(ledxs0[6]);</p><p>  wr_data(ledxs0[7]);</p><p>  wr_comm(0x9d);</p><p>  wr_data(ledxs[0]);</p><p>  wr_data(ledxs[1]);</p><p>  wr_str("

85、.");</p><p>  wr_data(ledxs[2]);</p><p>  wr_str("度");</p><p><b>  }</b></p><p><b>  }</b></p><p>  void shijian()&l

86、t;/p><p><b>  {</b></p><p>  unsigned char i,j;</p><p>  v_get1302(); //取得當前時間</p><p><b>  j=2;</b></p><p>  for(i=7;i>0;i--)<

87、;/p><p><b>  {</b></p><p>  xs[j]=(time[i-1]>>4)+0x30;</p><p>  xs[j+1]=(time[i-1]&0x0f)+0x30; //BCD碼拆成2字節(jié)</p><p><b>  j=j+2;</b></p&

88、gt;<p><b>  }</b></p><p>  ledxs0[0]=xs[2];</p><p>  ledxs0[1]=xs[3]; // 年</p><p>  ledxs0[2]=0x2d; // -</p><p>  ledxs0[3]=xs[6];</p>

89、<p>  ledxs0[4]=xs[7]; // 月</p><p>  ledxs0[5]=0x2d; // -</p><p>  ledxs0[6]=xs[8];</p><p>  ledxs0[7]=xs[9]; // 日</p><p>  ledxs2[0]=xs[10];</p>&

90、lt;p>  ledxs2[1]=xs[11]; // 時</p><p>  ledxs2[2]=0x2d; // -</p><p>  ledxs2[3]=xs[12];</p><p>  ledxs2[4]=xs[13]; // 分</p><p>  ledxs2[5]=0x2d; // -&l

91、t;/p><p>  ledxs2[6]=xs[14];</p><p>  ledxs2[7]=xs[15]; // 秒</p><p><b>  }</b></p><p>  void wr1302(unsigned char dat) //向1302寫1個字節(jié)</p><p><

92、;b>  {</b></p><p>  unsigned char i;</p><p>  for(i=0;i<8;i++) //從最低位開始發(fā)送</p><p><b>  {</b></p><p><b>  ACC=dat;</b></p><

93、;p>  DATA1302=BIT0;//位傳送至數(shù)據(jù)總線</p><p><b>  ;</b></p><p>  SCLK1302=0; //清時鐘總線</p><p><b>  ;</b></p><p>  SCLK1302=1; //時鐘上升沿,發(fā)送數(shù)據(jù)有效</p>

94、<p>  dat=dat>>1; //數(shù)據(jù)右移</p><p><b>  ;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  unsigned char rd1302(void) //從13

95、02讀1個字節(jié)</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  for(i=0;i<8;i++) //從最低位開始接收</p><p><b>  {</b></p><p>  ACC=ACC>

96、>1;</p><p>  DATA1302=1; //讀數(shù)據(jù)之前,P1口輸出1</p><p>  SCLK1302=1;//時鐘置高電平</p><p><b>  ;</b></p><p>  SCLK1302=0;//時鐘下降沿,接收數(shù)據(jù)有效</p><p><b>  

97、;</b></p><p>  BIT7=DATA1302;//接收1位數(shù)據(jù)</p><p><b>  ;</b></p><p><b>  }</b></p><p>  return ACC;</p><p><b>  }</b>&

98、lt;/p><p>  void v_wr1302(unsigned char add,unsigned char dat)//先寫地址,后寫1字節(jié)數(shù)據(jù)</p><p>  { // 地址或命令 數(shù)據(jù)</p><p>  RST1302=0;//復位引腳低電平,所有數(shù)據(jù)傳送終止</p><p&g

99、t;<b>  ;</b></p><p>  SCLK1302=0;//清時鐘總線</p><p><b>  ;</b></p><p>  RST1302=1;//復位引腳高電平,控制邏輯有效</p><p><b>  ;</b></p><p>

100、;  wr1302(add); //寫地址或命令</p><p><b>  ;</b></p><p>  wr1302(dat); //寫1個數(shù)據(jù)</p><p><b>  ;</b></p><p>  SCLK1302=1;</p><p>  RST130

101、2=0;</p><p><b>  }</b></p><p>  unsigned char v_rd1302(unsigned char add) //先寫地址,后讀1字節(jié)數(shù)據(jù)</p><p>  { // 地址</p><p>  unsigned char

102、 i;</p><p>  RST1302=0;//復位引腳低電平,所有數(shù)據(jù)傳送終止</p><p><b>  ;</b></p><p>  SCLK1302=0;//清時鐘總線</p><p><b>  ;</b></p><p>  RST1302=1;//復位引腳

103、高電平,控制邏輯有效</p><p><b>  ;</b></p><p>  wr1302(add); //寫地址或命令</p><p><b>  ;</b></p><p>  i=rd1302(); //讀取數(shù)據(jù)</p><p>  SCLK1302=1;&

104、lt;/p><p>  RST1302=0;</p><p>  return i; //返回讀取的數(shù)據(jù)</p><p><b>  }</b></p><p>  /********************************************************************</p>

105、<p>  * 名稱: send_byte1302</p><p>  * 說明: 先寫地址,后寫數(shù)據(jù)(時鐘多字節(jié)方式)</p><p>  * 功能: 往DS1302寫入時鐘數(shù)據(jù)(多字節(jié)方式)</p><p>  * 調用: wr1302();v_wr1302();</p><p>  * 輸入: *p: 時鐘數(shù)據(jù)地址 格式為

106、: 秒 分 時 日 月 星期 年 控制</p><p>  * 8Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B 1B</p><p><b>  * 返回值: 無</b></p><p>  *******************************************************************

107、****/</p><p>  void send_byte1302(unsigned char *p)</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  v_wr1302(0x8e,0x00); // 控制命令,WP=0,寫操作</p>&l

108、t;p>  RST1302=0;//復位引腳低電平,所有數(shù)據(jù)傳送終止</p><p><b>  ;</b></p><p>  SCLK1302=0;//清時鐘總線</p><p><b>  ;</b></p><p>  RST1302=1;//復位引腳高電平,控制邏輯有效</p&

109、gt;<p><b>  ;</b></p><p>  wr1302(0xbe); //0xbe:時鐘多字節(jié)寫命令</p><p>  for(i=0;i<8;i++)//發(fā)送數(shù)據(jù)8字節(jié)</p><p><b>  {</b></p><p>  wr1302(*p);<

110、/p><p><b>  p++;</b></p><p><b>  }</b></p><p>  SCLK1302=1;</p><p>  RST1302=0;</p><p><b>  }</b></p><p>  /*

111、*******************************************************************</p><p>  * 名稱: rcv_byte1302</p><p>  * 說明: 先寫地址,后讀數(shù)據(jù)(時鐘多字節(jié)方式)</p><p>  * 功能: 讀取DS1302時鐘數(shù)據(jù)</p><p>  *

112、 調用: wr1302() , rd1302()</p><p>  * 輸入: *p1: 時鐘數(shù)據(jù)地址 格式為: 秒 分 時 日 月 星期 年</p><p>  * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B</p><p>  * 返回值: ucDa :讀取的數(shù)據(jù)</p><p>  **************

113、*********************************************************/</p><p>  unsigned char rcv_byte1302(unsigned char *p1)</p><p><b>  {</b></p><p>  unsigned char i;</p>

114、<p>  RST1302=0;//復位引腳低電平,所有數(shù)據(jù)傳送終止</p><p><b>  ;</b></p><p>  SCLK1302=0;//清時鐘總線</p><p><b>  ;</b></p><p>  RST1302=1;//復位引腳高電平,控制邏輯有效</

115、p><p><b>  ;</b></p><p>  wr1302(0xbf);// 0xbf:時鐘多字節(jié)讀命令</p><p>  for(i=0;i<8;i++)//接收數(shù)據(jù)8字節(jié)</p><p><b>  {</b></p><p>  *p1=rd1302();

116、</p><p><b>  p1++;</b></p><p><b>  }</b></p><p>  SCLK1302=1;</p><p>  RST1302=0;</p><p><b>  }</b></p><p>

117、;  /********************************************************************</p><p>  * 名稱: v_set1302</p><p><b>  * 說明:</b></p><p>  * 功能: 設置初始時間</p><p>  * 調用:

118、 v_wr1302()</p><p>  * 輸入: *p2: 初始時間地址。初始時間格式為: 秒 分 時 日 月 星期 年</p><p>  * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B</p><p><b>  * 返回值: 無</b></p><p>  **************

119、*********************************************************/</p><p>  void v_set1302(unsigned char *p2)</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  u

120、nsigned char addr=0x80;</p><p>  v_wr1302(0x8e,0x00); //控制命令,WP=0,允許寫</p><p>  for(i=0;i<7;i++)</p><p><b>  {</b></p><p>  v_wr1302(addr,*p2); /* 秒 分 時 日

121、 月 星期 年 */</p><p><b>  p2++;</b></p><p>  addr=addr+2;</p><p><b>  }</b></p><p>  v_wr1302(0x8e,0x80); // 控制命令,WP=1,寫保護</p><p><

122、b>  }</b></p><p>  /********************************************************************</p><p>  * 名稱: v_get1302</p><p><b>  * 說明:</b></p><p>  *

123、功能: 讀取DS1302當前時間</p><p>  * 調用: v_rd1302()</p><p>  * 輸入: time: 保存當前時間地址。當前時間格式為: 秒 分 時 日 月 星期 年</p><p>  * 7Byte (BCD碼) 1B 1B 1B 1B 1B 1B 1B</p><p><b>  * 返回值: 無

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論