出租車計價器模擬裝置的設(shè)計報告-電子課程設(shè)計_第1頁
已閱讀1頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  電子設(shè)計課程設(shè)計報告</p><p>  摘要:本文介紹了出租車計價器系統(tǒng)在實際生產(chǎn)生活中的重要性,介紹一種以單片機(jī)ATmega16 為核心的多功能出租車計價器模擬裝置的設(shè)計,闡述軟硬件設(shè)計過程中關(guān)鍵技術(shù)的處理。結(jié)果表明該計價器模擬裝置具有集計程、計時、計費、等多種計量功能,并且具速度檢測與顯示、系統(tǒng)設(shè)置與數(shù)據(jù)存儲等多種功能。</p><p>  本課題主要研究出租車

2、計價器模擬裝置的軟硬件設(shè)計。論文詳細(xì)闡述了該計價器模擬裝置的總體設(shè)計:控制器模塊、速度檢測模塊、里程檢測模塊、LED顯示模塊、鍵盤模塊等。實驗表明該系統(tǒng)具有可靠性好、精度高等優(yōu)點。</p><p>  關(guān)鍵詞:出租車計價器模擬裝置,ATmega16單片機(jī),LED掃描顯示,速度檢測,里程檢測。</p><p><b>  第一章 緒論4</b></p>

3、<p><b>  1.1 前言4</b></p><p>  1.2 設(shè)計的意義4</p><p>  1.3 系統(tǒng)設(shè)計的要求4</p><p>  第二章 系統(tǒng)設(shè)計5</p><p>  2.1方案論證與比較5</p><p>  2.1.1 方案一5</p>

4、<p>  2.1.1 方案二6</p><p>  2.2系統(tǒng)總體方案6</p><p>  2.3單元電路方案7</p><p>  2.3.1 系統(tǒng)電源輸入與轉(zhuǎn)換模塊7</p><p>  2.3.2 單片機(jī)控制核心模塊7</p><p>  2.3.3 LED數(shù)碼管動態(tài)掃描顯示模塊8&

5、lt;/p><p>  第三章 相關(guān)芯片介紹8</p><p>  3.1 ATmega16單片機(jī)8</p><p>  3.2 3-8線譯碼器74HC13810</p><p>  3.3 移位寄存器74HC16410</p><p>  第四章 軟件設(shè)計11</p><p>  第五

6、章 系統(tǒng)測試11</p><p><b>  結(jié)論/展望11</b></p><p><b>  致謝12</b></p><p><b>  參考文獻(xiàn)12</b></p><p><b>  附錄13</b></p><p&

7、gt;<b>  第一章 緒論</b></p><p><b>  1.1 前言</b></p><p>  出租汽車已經(jīng)成為我國城市公共交通的重要組成部分和現(xiàn)代化城市必備的基礎(chǔ)設(shè)施,成為人們工作、生活中不可缺少的交通工具。出租汽車服務(wù)行業(yè)和出租汽車計價器緊密相關(guān),因為出租汽車必須安裝出租汽車計價器才能投入營運。出租汽車計價器是一種能根據(jù)乘客乘坐

8、汽車行駛距離和等候時間的多少進(jìn)行計價,并直接顯示車費值的計量器具。計價器是出租汽車的經(jīng)營者和乘坐出租汽車的消費者之間用于公平貿(mào)易結(jié)算的工具,因而計價器計價準(zhǔn)確與否,直接關(guān)系到經(jīng)營者和消費者的經(jīng)濟(jì)利益。依據(jù)國家有關(guān)法律、法規(guī),出租汽車計價器是列入國家首批強(qiáng)制檢定的工作計量器具之一,也是近年來國家質(zhì)量技術(shù)監(jiān)督部門強(qiáng)化管理的六類重點計量器具之一。</p><p>  出租車行業(yè)在我國是八十年代初興起的一項新興行業(yè),隨著

9、我國國民經(jīng)濟(jì)的高速發(fā)展,出租汽車已成為城市公共交通的重要組成部分。多年來國內(nèi)普遍使用的計價器只具備單一的計量功能。目前全世界的計價器中有90%為臺灣所生產(chǎn)?,F(xiàn)今我國生產(chǎn)計價器的企業(yè)有上百家,主要是集中在北京,上海,沈陽和廣州等地。</p><p><b>  1.2 設(shè)計的意義</b></p><p>  在出租車是城市交通的重要組成部分,行業(yè)健康和發(fā)展也獲得越來越多

10、的關(guān)注。汽車計價器是乘客與司機(jī)雙方的交易準(zhǔn)則,它是出租車行業(yè)發(fā)展的重要標(biāo)志,是出租車中最重要的工具。它關(guān)系著交易雙方的利益。具有良好性能的計價器無論是對廣大出租車司機(jī)朋友還是乘客來說都是很必要的。因此,汽車計價器的研究也是十分有一個應(yīng)用價值的。</p><p>  1.3 系統(tǒng)設(shè)計的要求</p><p>  設(shè)計并制作一個出租車計價器的模擬裝置,示意圖如圖1-1所示。 </p>

11、<p>  如圖1-1 出租車計價器示意圖</p><p>  8位數(shù)碼管顯示器的前4位數(shù)碼管用于實時顯示行車?yán)锍虜?shù)(000.0),單位為公里;后4位數(shù)碼管用于實時顯示金額數(shù)(000.0),單位為元。 </p><p>  規(guī)定出租車單程價格為2元/公里,往返則價格為1.5元/公里。單程與往返分別由“單程” 按鍵和“往返” 按鍵設(shè)定。行車?yán)锍炭捎靡话存I模擬,規(guī)定每按一次鍵,行

12、車?yán)锍碳?.1公里。 </p><p>  起步公里數(shù)為3公里,價格為8元,若實際運行大于3公里,按“基本要求2”計算價格。 </p><p>  到達(dá)目的地后,按“暫?!?鍵,計價器可暫停計價;反復(fù)按“查詢”鍵,計價器能依次顯示總等待時間,里程數(shù)和金額數(shù);按“清除”鍵,能將記錄的數(shù)據(jù)(里程、等待時間與價格等)清0。 </p><p>  再增加8位數(shù)碼管顯示器,前

13、4位數(shù)碼管用于實時顯示車速(000.0),單位為公里/小時;后4位數(shù)碼管用于實時顯示累計等待時間(00:00),單位為分:秒。 </p><p>  設(shè)計并制作一個能模擬出租車車速的裝置。要求采用單片機(jī)控制電機(jī)使轉(zhuǎn)盤轉(zhuǎn)動,用光電傳感器檢測轉(zhuǎn)盤轉(zhuǎn)動,車速與轉(zhuǎn)數(shù)成正比。規(guī)定轉(zhuǎn)盤轉(zhuǎn)速為5轉(zhuǎn)/分對應(yīng)車速5公里/小時,轉(zhuǎn)盤轉(zhuǎn)速為50轉(zhuǎn)/分對應(yīng)車速50公里/小時,依此類推。轉(zhuǎn)速可以通過鍵盤預(yù)置。</p><

14、;p>  能按上述模擬裝置的轉(zhuǎn)數(shù)計算行車?yán)锍?,并依此作為計價依據(jù),計價誤差的絕對值小于10%。 </p><p>  增加等待時間計價功能。規(guī)定總等待時間為車速<5公里/小時的累積時間,總等待時間每增加5分鐘,相當(dāng)于里程數(shù)增加1公里進(jìn)行計價。</p><p>  增加起步價、起步價里程和每公里價格的預(yù)置功能。價格預(yù)置功能要求密碼確認(rèn),價格的默認(rèn)值與基本要求一致。 </p

15、><p><b>  第二章 系統(tǒng)設(shè)計</b></p><p>  2.1方案論證與比較</p><p><b>  2.1.1 方案一</b></p><p>  方案一的系統(tǒng)框圖如圖2-1所示。該方案擬采用單片機(jī)AT89C51為控制器,附加以數(shù)據(jù)存儲模塊,速度檢測模塊,LED顯示模塊,鍵盤模塊等。&

16、lt;/p><p>  圖2-1 方案一系統(tǒng)框圖</p><p>  AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī)。單片機(jī)的可擦除只讀存儲器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)

17、準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器。AT89C51單片機(jī)易學(xué)易懂,為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。但是AT89C51單片機(jī)是一種比較低端的單片機(jī),片上資源偏少。例如本設(shè)計中要求存儲數(shù)據(jù)功能,AT89C51單片機(jī)沒有內(nèi)部EEPROM,只能外加數(shù)據(jù)存儲芯片,導(dǎo)致硬件線路和軟件編程顯得復(fù)雜。另外,AT89C51單片機(jī)的軟件

18、開發(fā)平臺不夠人性化,軟件開發(fā)比較繁瑣。</p><p><b>  2.1.1 方案二</b></p><p>  方案二的系統(tǒng)框圖如圖2-2所示。該方案擬采用單片機(jī)ATMEGA16為控制器,附加以內(nèi)部數(shù)據(jù)存儲,速度檢測模塊,LED顯示模塊,鍵盤模塊等。</p><p>  圖2-2 方案二系統(tǒng)框圖</p><p>  

19、ATmega16有如下特點:16K字節(jié)的系統(tǒng)內(nèi)可編程Flash(具有同時讀寫的能力,即RWW),512 字節(jié)EEPROM,1K 字節(jié)SRAM,32 個通用I/O 口線,32 個通用工作寄存器,用于邊界掃描的JTAG 接口,支持片內(nèi)調(diào)試與編程,三個具有比較模式的靈活的定時器/ 計數(shù)器(T/C),片內(nèi)/外中斷,可編程串行USART,有起始條件檢測器的通用串行接口,8路10位具有可選差分輸入級可編程增益(TQFP 封裝) 的ADC ,具有片內(nèi)

20、振蕩器的可編程看門狗定時器,一個SPI 串行端口,以及六個可以通過軟件進(jìn)行選擇的省電模式。</p><p>  ATmega16單片機(jī)具有強(qiáng)大而豐富的片上資源和靈活方便的人性化軟件開發(fā)平臺,大大地簡化了硬件線路的設(shè)計和軟件的開發(fā)過程,減了軟硬件的開發(fā)時間,并完全符合本設(shè)計的要求。</p><p>  綜上,通過分析論證,本次設(shè)計采用方案二。</p><p><

21、b>  2.2系統(tǒng)總體方案</b></p><p>  方案二的系統(tǒng)框圖如圖2-3所示。系統(tǒng)仿真圖見附件。</p><p>  圖2-3 系統(tǒng)總體設(shè)計方案</p><p>  該方案由ATMEGA16單片機(jī)為核心控制器,用以檢測速度脈沖并計算轉(zhuǎn)化為實際速度輸出顯示;檢測模擬裝置的狀態(tài)(包括空車狀態(tài)、單程狀態(tài)、等待狀態(tài)、返程狀態(tài))并作出相應(yīng)的動作;檢

22、測模擬動作(包括里程加一模擬按鍵、速度模擬加減按鍵、數(shù)據(jù)清除按鍵);檢測參數(shù)修改于數(shù)據(jù)儲存(包括起步里程的修改、起步價的修改、單程單價的修改、返程單價的修改);檢測參數(shù)修改時應(yīng)通過的密碼確認(rèn);速度控制輸出;參數(shù)提取并送到LED數(shù)碼管掃描顯示;工作狀態(tài)指示輸出等等。</p><p><b>  2.3單元電路方案</b></p><p>  2.3.1 系統(tǒng)電源輸入與轉(zhuǎn)

23、換模塊</p><p>  穩(wěn)定的電源供應(yīng)是單片機(jī)嵌入式系統(tǒng)的穩(wěn)定工作的必要前提,所以電源的轉(zhuǎn)換設(shè)計必須有較高的可靠性和抗干擾能力。本設(shè)計所采用的電源輸入與轉(zhuǎn)換方案如圖2-4所示。該方案采用LM7805線性電源穩(wěn)壓芯片,加以前后兩級電容濾波以及5個平波小電容,所構(gòu)成的電源轉(zhuǎn)換方案具有輸出平穩(wěn),高壓隔離,平波抗干擾等優(yōu)點,具有較高的可靠性和抗干擾能力,保證了所設(shè)計系統(tǒng)的電源的穩(wěn)定供應(yīng)。</p><

24、;p>  圖2-4 電源輸入與轉(zhuǎn)換電原理圖</p><p>  2.3.2 單片機(jī)控制核心模塊</p><p>  本設(shè)計所采用的核心控制芯片為Atmel公司生產(chǎn)的8位高性能單片機(jī)ATmega16,單片機(jī)控制核心模塊電原理圖如圖2-5所示。其中包括單片機(jī)工作必不可少的晶振電路、復(fù)位電路。由于ATmega16單片機(jī)四個IO端口均是標(biāo)志雙向IO,具有輸入內(nèi)部可設(shè)置上拉電阻,故系統(tǒng)的按鍵不

25、必外界上拉電阻,大大簡化了硬件線路的設(shè)計。</p><p>  圖2-4 電源輸入與轉(zhuǎn)換電原理圖</p><p>  速度檢測原理是:直接將速度傳感器反饋的脈沖信號輸入到ATmega16單片機(jī)的外部中斷(INT1)輸入端。速度檢測原理是:當(dāng)速度傳感器返回一個脈沖信號時,單片機(jī)讀出其內(nèi)部定時器從上一個脈沖信號到該返回脈沖信號所經(jīng)過的定時時間,兩個速度反饋脈沖直接的路程除以該時間間隔即為瞬時速

26、度。</p><p>  速度控制輸出原理:是利用單片機(jī)內(nèi)部8位的定時器2的脈寬調(diào)制功能產(chǎn)生占空比可變的PWM信號去控制速度。</p><p>  2.3.3 LED數(shù)碼管動態(tài)掃描顯示模塊</p><p>  LED數(shù)碼管的動態(tài)掃描顯示是本出租車計價器模擬裝置的核心功能之一,LED數(shù)碼管掃描顯示是否穩(wěn)定直接關(guān)系系統(tǒng)的工作效果。LED數(shù)碼管動態(tài)掃描顯示電原理圖如圖2-

27、5所示。</p><p>  圖2-5 LED數(shù)碼管掃描顯示電原理圖</p><p>  LED數(shù)碼管動態(tài)掃描顯示的原理是:采用四位共陰極LED數(shù)碼管,其位選信號引腳接到低電平輸出有效的3-8線譯碼器74HC138的輸出端,單片機(jī)控制譯碼器的輸出端來選通某一位數(shù)碼管工作,達(dá)到動態(tài)掃描顯示的效果。LED數(shù)碼管的段選信號引腳接到8位以為寄存器74HC164的并行輸出端,單片機(jī)將要顯示的字型碼信

28、息串行輸入到移位寄存器,再又移位寄存器并行輸出到LED數(shù)碼管的段選引腳,使得已選通的數(shù)碼管某一位顯示特定的數(shù)字。</p><p>  第三章 相關(guān)芯片介紹</p><p>  3.1 ATmega16單片機(jī)</p><p>  ATmega16是基于增強(qiáng)的AVR RISC結(jié)構(gòu)的低功耗8 位CMOS微控制器。由于其先進(jìn)的指令集以及單時鐘周期指令執(zhí)行時間,ATmega1

29、6 的數(shù)據(jù)吞吐率高達(dá)1 MIPS/MHz,從而可以緩減系統(tǒng)在功耗和處理速度之間的矛盾。</p><p>  ATmega16 AVR 內(nèi)核具有豐富的指令集和32 個通用工作寄存器。所有的寄存器都直接與算邏單元(ALU) 相連接,使得一條指令可以在一個時鐘周期內(nèi)同時訪問兩個獨立的寄存器。這種結(jié)構(gòu)大大提高了代碼效率,并且具有比普通的CISC 微控制器最高至10 倍的數(shù)據(jù)吞吐率。</p><p>

30、;  ATmega16 有如下特點:16K字節(jié)的系統(tǒng)內(nèi)可編程Flash(具有同時讀寫的能力,即RWW),512 字節(jié)EEPROM,1K 字節(jié)SRAM,32 個通用I/O 口線,32 個通用工作寄存器,用于邊界掃描的JTAG 接口,支持片內(nèi)調(diào)試與編程,三個具有比較模式的靈活的定時器/ 計數(shù)器(T/C),片內(nèi)/外中斷,可編程串行USART,有起始條件檢測器的通用串行接口,8路10位具有可選差分輸入級可編程增益(TQFP 封裝) 的ADC ,

31、具有片內(nèi)振蕩器的可編程看門狗定時器,一個SPI 串行端口,以及六個可以通過軟件進(jìn)行選擇的省電模式。ATmega16單片機(jī)管腳圖如圖3-1所示。</p><p>  圖3-1 ATmega16管腳圖</p><p>  工作于空閑模式時CPU 停止工作,而USART、兩線接口、A/D 轉(zhuǎn)換器、SRAM、T/C、SPI 端口以及中斷系統(tǒng)繼續(xù)工作;掉電模式時晶體振蕩器停止振蕩,所有功能除了中斷和

32、硬件復(fù)位之外都停止工作;在省電模式下,異步定時器繼續(xù)運行,允許用戶保持一個時間基準(zhǔn),而其余功能模塊處于休眠狀態(tài); ADC 噪聲抑制模式時終止CPU 和除了異步定時器與ADC 以外所有I/O 模塊的工作,以降低ADC 轉(zhuǎn)換時的開關(guān)噪聲; Standby 模式下只有晶體或諧振振蕩器運行,其余功能模塊處于休眠狀態(tài),使得器件只消耗極少的電流,同時具有快速啟動能力;擴(kuò)展Standby 模式下則允許振蕩器和異步定時器繼續(xù)工作。</p>

33、<p>  本芯片是以Atmel 高密度非易失性存儲器技術(shù)生產(chǎn)的。片內(nèi)ISP Flash 允許程序存儲器通過ISP 串行接口,或者通用編程器進(jìn)行編程,也可以通過運行于AVR 內(nèi)核之中的引導(dǎo)程序進(jìn)行編程。引導(dǎo)程序可以使用任意接口將應(yīng)用程序下載到應(yīng)用Flash存儲區(qū)(ApplicationFlash Memory)。在更新應(yīng)用Flash存儲區(qū)時引導(dǎo)Flash區(qū)(Boot Flash Memory)的程序繼續(xù)運行,實現(xiàn)了RWW 操

34、作。 通過將8 位RISC CPU 與系統(tǒng)內(nèi)可編程的Flash 集成在一個芯片內(nèi), ATmega16 成為一個功能強(qiáng)大的單片機(jī),為許多嵌入式控制應(yīng)用提供了靈活而低成本的解決方案。ATmega16 具有一整套的編程與系統(tǒng)開發(fā)工具,包括:C 語言 編譯器、宏匯編、 程序調(diào)試器/ 軟件仿真器、仿真器及評估板。</p><p>  3.2 3-8線譯碼器74HC138</p><p>  74H

35、C138是一款高速CMOS器件,74HC138引腳兼容低功耗肖特基TTL(LSTTL)系列。74HC138譯碼器可接受3位二進(jìn)制加權(quán)地址輸入(A0, A1和A2),并當(dāng)使能時,提供8個互斥的低有效輸出(Y0至Y7)。74HC138特有3個使能輸入端:兩個低有效(E1和E2)和一個高有效(E3)。除非E1和E2置低且E3置高,否則74HC138將保持所有輸出為高。利用這種復(fù)合使能特性,僅需4片74HC138芯片和1個反相器,即可輕松實現(xiàn)并

36、行擴(kuò)展,組合成為一個1-32(5線到32線)譯碼器。任選一個低有效使能輸入端作為數(shù)據(jù)輸入,而把其余的使能輸入端作為選通端,則74HC138亦可充當(dāng)一個8輸出多路分配器,未使用的使能輸入端必須保持綁定在各自合適的高有效或低有效狀態(tài)。74HC138的管腳圖如圖3-2所示。</p><p>  圖3-2 74HC138管腳圖</p><p>  本設(shè)計中用于顯示的LED數(shù)碼管是四位共陰極數(shù)碼管,

37、即每四位LED數(shù)碼管顯示計價器模擬裝置的一個參數(shù)。當(dāng)動態(tài)掃描顯示的時候,用74HC138來選通LED數(shù)碼管的位選管腳,既達(dá)到增強(qiáng)LED數(shù)碼管的驅(qū)動電流的效果,也能節(jié)省單片機(jī)的IO端口,使硬件設(shè)計變得簡潔。</p><p>  3.3 移位寄存器74HC164</p><p>  74HC164、74HCT164 是高速硅門 CMOS 器件,與低功耗肖特基型 TTL (LSTTL) 器件的引

38、腳兼容。74HC164、74HCT164 是 8 位邊沿觸發(fā)式移位寄存器,串行輸入數(shù)據(jù),然后并行輸出。數(shù)據(jù)通過兩個輸入端(DSA 或 DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數(shù)據(jù)輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。</p><p>  時鐘 (CP) 每次由低變高時,數(shù)據(jù)右移一位,輸入到 Q0, Q0 是兩個數(shù)據(jù)輸入端(DSA 和 DSB)的邏輯

39、與,它將上升時鐘沿之前保持一個建立時間的長度。主復(fù)位 (MR) 輸入端上的一個低電平將使其它所有輸入端都無效,同時非同步地清除寄存器,強(qiáng)制所有的輸出為低電平。74HC164的管腳圖如圖3-3所示。</p><p>  圖3-3 74HC164管腳圖</p><p>  本設(shè)計中用于顯示的LED數(shù)碼管是四位共陰極數(shù)碼管,即每四位LED數(shù)碼管顯示計價器模擬裝置的一個參數(shù)。當(dāng)動態(tài)掃描顯示的時候,

40、用74HC164來將要顯示的字型碼數(shù)據(jù)通過串入并出的方式傳送到LED數(shù)碼管的段選管腳,大大的節(jié)省了單片機(jī)的IO端口,使硬件設(shè)計變得簡潔。</p><p><b>  第四章 軟件設(shè)計</b></p><p>  主控制器芯片為Atmega16,由于處理器速度較快,所以采用C語言編程方便簡單。軟件編寫使用AVR單片機(jī)軟件開發(fā)平臺CVAVR編譯器,改編譯器有豐富的AVR單

41、片機(jī)常用函數(shù)模塊、常用外設(shè)硬件驅(qū)動動態(tài)鏈接庫,使用極其方便,具有高度的人性化。軟件流程圖如圖4-1所示。</p><p>  圖4-1 軟件流程圖</p><p><b>  第五章 系統(tǒng)測試</b></p><p>  由于時間不允許,設(shè)計的出租車計價器模擬裝置只在電子仿真平臺PROTEUS7.0仿真測試通過。測試結(jié)果表明,設(shè)計的出租車計價器

42、模擬裝置具有設(shè)計要求提出的絕大部分功能,并且全部仿真測試通過。仿真電子線路圖見附件。</p><p><b>  結(jié)論/展望</b></p><p>  在這段時間里,經(jīng)過自己努力,基本上完成了設(shè)計要求的內(nèi)容,在系統(tǒng)可行性分析、原理圖設(shè)計、PCB繪制等方面都作了許多實際工作,取得了一些成績,同時也遇到了一些問題,存在一些不足。經(jīng)過這段時間的學(xué)習(xí)和工作,我覺得自己不論是

43、在理論知識方面還是在動手能力方面都有了不小的進(jìn)步,自己從中受益匪淺。這次設(shè)計很好的把以前學(xué)到的理論知識應(yīng)用于實踐,使我認(rèn)識到理論知識與實踐之間有一定的差距,只有通過不斷的努力學(xué)習(xí)和實踐才能很好的把理論知識應(yīng)用到實踐當(dāng)中,也只有通過不斷的實踐才能對理論知識的理解。</p><p>  通過這次設(shè)計不僅學(xué)會了如何去查找相關(guān)資料,更重要的是通過查找資料和翻閱書籍學(xué)到了不少知識,擴(kuò)大了知識面,提高了知識水平。經(jīng)過單元設(shè)計

44、和系統(tǒng)設(shè)計鞏固了以前所學(xué)的專業(yè)知識,自己真正認(rèn)識到理論聯(lián)系實際的重要性,為以后的學(xué)習(xí)和工作提供了很多有價值的經(jīng)驗。通過這次設(shè)計不僅增強(qiáng)了自己的動腦能力和動手能力,也提高了我思考問題、分析問題、解決問題的能力,更重要的是學(xué)會用工程化的思想來解決問題。這在以前的學(xué)習(xí)過程中是不曾學(xué)到的。</p><p>  這次設(shè)計是我認(rèn)真認(rèn)識到完整、嚴(yán)謹(jǐn)、科學(xué)分析問題、解決問題的思想是多么的重要,只有擁有了科學(xué)的態(tài)度才能設(shè)計出有用的

45、產(chǎn)品。另外通過本次設(shè)計,使我認(rèn)識到自己理論知識的應(yīng)用能力有很大的欠缺,需要在以后的學(xué)習(xí)中進(jìn)一步提高。</p><p><b>  附錄</b></p><p>  附錄1 出租車計價器模擬裝置仿真測試線路圖</p><p>  附錄2出租車計價器模擬裝置電原理圖</p><p>  附錄3出租車計價器模擬裝置印制PCB圖

46、</p><p>  附錄4 出租車計價器模擬裝置程序清單</p><p>  /*****************************************************</p><p>  This program was produced by the</p><p>  CodeWizardAVR V2.05.0 Pr

47、ofessional</p><p>  Automatic Program Generator</p><p>  ?Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.</p><p>  http://www.hpinfotech.com</p><p>  Project : 出租車

48、計價器</p><p>  Version : 1</p><p>  Date : 2011/12/5</p><p>  Author : 曾憲金 陳志強(qiáng) 黃寶生</p><p>  Company : 廣西大學(xué)電氣工程學(xué)院</p><p>  Chip type : ATmeg

49、a16</p><p>  Program type : Application</p><p>  AVR Core Clock frequency: 8.000000 MHz</p><p>  Memory model : Small</p><p>  External RAM size

50、 : 0</p><p>  Data Stack size : 256</p><p>  *****************************************************/</p><p><b>  //所需頭文件</b></p><p>  #include &l

51、t;mega16.h></p><p>  #include <delay.h> </p><p>  //預(yù)定義移位寄存器所用端口</p><p>  #define HC164_data1 PORTC.0</p><p>  #define HC164_clk1 PORTC.1</p><p> 

52、 #define HC164_data2 PORTC.2</p><p>  #define HC164_clk2 PORTC.3</p><p>  #define key_oneway PINC.4</p><p>  #define key_pause PINC.5</p><p>  #define key_roundtrip PIN

53、C.6</p><p>  #define key_clear PINC.7</p><p>  #define key_licheng PIND.0</p><p>  #define key_jiance PIND.1</p><p>  #define key_shezhi PIND.2</p><p>  #d

54、efine key_shezhi_jia PIND.4</p><p>  #define key_shezhi_jian PIND.5</p><p>  //預(yù)定義出租車狀態(tài)所用變量</p><p>  #define zhunbei 0</p><p>  #define dancheng 1</p><p> 

55、 #define zanting 2</p><p>  #define wangfan 3 </p><p>  #define jiance 4</p><p>  #define shezhi 5</p><p>  #define mimaqueren 6</p><p>  #define lunzi_kon

56、gshu 8 //輪子邊沿所開的孔數(shù),即輪子每轉(zhuǎn)一圈所產(chǎn)生的脈沖數(shù)</p><p>  //#define lunzi_banjing 20 //輪子的半徑(單位:mm),用于計算累加里程 2*3.14*lunzi_banjing即為輪子轉(zhuǎn)過一圈時里程的累加量(單位也是:mm) </p><p>  //定義數(shù)碼管掃描字型碼及位選碼</p><p>  fla

57、sh unsigned char led_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};</p><p>  flash unsigned char position[]={0x00,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x80,0x90,0xa

58、0,0xb0,0xc0,0xd0,0xe0,0xf0};</p><p>  //定義taxi結(jié)構(gòu)體</p><p>  struct taxi {</p><p>  unsigned int licheng;</p><p>  unsigned int feiyong;</p><p>  unsigned ch

59、ar state; //出租車當(dāng)前狀態(tài),包括單程(1)、往返(2)、暫停三個狀態(tài)(0) </p><p>  unsigned int sudu;</p><p>  unsigned int dengdaishijian[2];</p><p>  unsigned char fujia_dengdai;</p><p>  unsig

60、ned char dancheng_danjia;</p><p>  unsigned char wangfan_danjia;</p><p>  unsigned int qibujia;</p><p>  unsigned char qibulicheng;</p><p>  } ; </p>

61、<p>  struct taxi mytaxi; //聲明mytaxi結(jié)構(gòu)體</p><p>  unsigned char dis_buff[]; //聲明顯示緩存區(qū)</p><p>  bit keyflag_oneway = 1;</p><p>  bit keyflag_pause = 1;</p>

62、<p>  bit keyflag_roundtrip = 1;</p><p>  bit keyflag_licheng = 1;</p><p>  bit keyflag_jiance = 1;</p><p>  bit keyflag_clear = 1;</p><p>  bit keyflag_shezhi =

63、 1;</p><p>  bit keyflag_shezhi_jia = 1;</p><p>  bit keyflag_shezhi_jian = 1;</p><p>  bit flag_dancheng=0;</p><p>  bit flag_wangfan=0; </p><p>  bit fl

64、ag_zanting=0;</p><p>  bit flag_jiance=0;</p><p>  bit time_lichengleijiajia_ok=0;</p><p>  unsigned char qibujia_from_epprom=0;</p><p>  unsigned int timecounter = 0;&

65、lt;/p><p>  unsigned int interrupt_timecounter = 0; //每兩個車速檢測脈沖中斷之間的時間間隔(ms)</p><p>  unsigned int speed_time = 0;//輪子轉(zhuǎn)過一圈(輪子邊沿所開的孔數(shù)個脈沖累計)所需要的時間</p><p>  unsigned char interrupt_c

66、ishu = 0; //判斷是否轉(zhuǎn)過一圈</p><p>  unsigned int leijia_licheng = 0; //通過速度來累加里程數(shù)(中間變量)</p><p>  //unsigned int licheng_timecounter = 0; //多長時間更新累加里程數(shù)(因為里程累加是用這個定時時間乘以當(dāng)時的瞬時速度得到的,所以這個定時時間必須足夠小才能保

67、證里程累加的準(zhǔn)確性)</p><p>  void eeprom_write(unsigned int uiAddress,unsigned char ucData) //寫EEPROM函數(shù)</p><p><b>  {</b></p><p>  while(EECR&(1<<EEWE)); //Wait for c

68、ompletion of previous write</p><p>  EEAR = uiAddress; //Set up address register</p><p>  EEDR = ucData; //Set up data register </p><p>  EECR |= (1<<EEMWE); //Write

69、 logical one to EEMWE</p><p>  EECR |= (1<<EEWE); //Start eeprom write by setting EEWE</p><p><b>  } </b></p><p>  /*for example</p><p>  eeprom_wri

70、te(0x01,135);</p><p>  eeprom_write(0x02,246); */ </p><p>  unsigned char eeprom_read(unsigned int uiAddress) //讀EEPROM函數(shù)</p><p><b>  {</b></p><p>  while(

71、EECR&(1<<EEWE)); //Wait for completion of previous write</p><p>  EEAR = uiAddress; //Set up address register</p><p>  EECR |= (1<<EERE); //Start eeprom read by writting EER

72、E</p><p>  return EEDR; //Return data from data register</p><p><b>  } </b></p><p>  /*for example</p><p>  mytaxi.qibulicheng = eeprom_read(0x01);</p&

73、gt;<p>  mytaxi.qibujia = eeprom_read(0x02); */</p><p>  void init(void) //初始化控制器端口及taxi各項參數(shù)</p><p><b>  { </b></p><p>  PORTA = 0xff; </p><p&g

74、t;  DDRA = 0xff;</p><p>  PORTB = 0x00;</p><p>  DDRB = 0xff;</p><p>  PORTC=0xff;</p><p>  DDRC=0x0f; </p><p>  PORTD=0xff;</p><p>  DDRD=0x8

75、0;</p><p>  mytaxi.licheng = 0; //實際里數(shù)的十倍</p><p>  mytaxi.feiyong = 0; //實際費用的100倍</p><p>  mytaxi.state = zhunbei;</p><p>  mytaxi.sudu = 0; //實際速度的十倍</p>&

76、lt;p>  mytaxi.dengdaishijian[0] = 0; //dengdaishijian[0]為等待時間分鐘數(shù)</p><p>  mytaxi.dengdaishijian[1] = 0; //dengdaishijian[1]為等待時間秒數(shù) </p><p>  mytaxi.fujia_dengdai = 0;</p><p> 

77、 //eeprom_write(0x03,20);</p><p>  // eeprom_write(0x04,15); //存儲的是起步價的十倍(char型,最大存儲255),但顯示的是費用的百倍</p><p>  //mytaxi.qibulicheng = eeprom_read(0x01);</p><p>  //qibujia_from_epprom

78、 = eeprom_read(0x02);</p><p>  //mytaxi.qibujia = (unsigned int) qibujia_from_epprom*10;</p><p><b>  } </b></p><p>  void to_disbuffer(void) //更新顯示緩存區(qū)函數(shù)</p>&

79、lt;p><b>  {</b></p><p>  unsigned char j=0; </p><p>  //dis_buff[j++] = 0; //出現(xiàn)了個debug,找不出來,先把它覆蓋先</p><p>  //dis_buff[j++] = 0; </p><p>  dis_buff[j++

80、] = mytaxi.feiyong%10;</p><p>  dis_buff[j++] = (mytaxi.feiyong%100)/10; </p><p>  dis_buff[j++] = (mytaxi.feiyong%1000)/100; </p><p>  dis_buff[j++] = (mytaxi.feiyong%10000)/1000;

81、</p><p>  dis_buff[j++] = mytaxi.feiyong/10000; </p><p>  dis_buff[j++] = mytaxi.licheng%10; </p><p>  dis_buff[j++] = (mytaxi.licheng%100)/10; </p><p>  dis_buff[j+

82、+] = (mytaxi.licheng%1000)/100; </p><p>  dis_buff[j++] = mytaxi.licheng/1000; </p><p>  dis_buff[j++] = mytaxi.dengdaishijian[1]%10; </p><p>  dis_buff[j++] = mytaxi.dengdaishi

83、jian[1]/10; </p><p>  dis_buff[j++] = mytaxi.dengdaishijian[0]%10; </p><p>  dis_buff[j++] = mytaxi.dengdaishijian[0]/10; </p><p>  dis_buff[j++] = mytaxi.sudu%10;</p><

84、;p>  dis_buff[j++] = (mytaxi.sudu%100)/10; </p><p>  dis_buff[j++] = (mytaxi.sudu%1000)/100; </p><p>  dis_buff[j++] = mytaxi.sudu/1000; </p><p><b>  }</b&

85、gt;</p><p>  void HC164_sent_bit1(char byte) //移位寄存器1發(fā)送數(shù)據(jù)函數(shù)</p><p><b>  {</b></p><p><b>  char i;</b></p><p>  for(i=0;i<=7;i++)</p>

86、;<p><b>  {</b></p><p>  HC164_data1=byte&(1<<i);</p><p>  HC164_clk1=1; </p><p>  HC164_clk1=0; </p><p><b>  }</b></p>

87、<p><b>  } </b></p><p>  void HC164_sent_bit2(char byte) //移位寄存器2發(fā)送數(shù)據(jù)函數(shù)</p><p><b>  {</b></p><p><b>  char i;</b></p><p

88、>  for(i=0;i<=7;i++)</p><p><b>  {</b></p><p>  HC164_data2=byte&(1<<i);</p><p>  HC164_clk2=1; </p><p>  HC164_clk2=0; </p><p&

89、gt;<b>  }</b></p><p><b>  } </b></p><p>  void display(void) //數(shù)碼管掃描顯示函數(shù)1(顯示車?yán)锍虜?shù)和金額數(shù))</p><p><b>  {</b></p><p>  unsigned

90、char temp1,i;</p><p>  to_disbuffer();</p><p>  for(i=0;i<=7;i++)</p><p><b>  {</b></p><p>  temp1=led_7[dis_buff[i+1]]; //i+1是為了忽略費用的最低位,但是還是存在的,只是不顯示而

91、已 </p><p>  if(i==1||i==5)</p><p>  HC164_sent_bit1(temp1|=0x80); //小數(shù)點顯示</p><p><b>  else</b></p><p>  HC164_sent_bit1(temp1); //PORTC&=0x03

92、; //PORTC|=position[(5-i)];</p><p>  PORTA = position[i+1]; </p><p>  delay_us(2100);</p><p>  PORTA = position[0]; </p><p><b>  } </b></p>&l

93、t;p><b>  }</b></p><p>  void display_one(void) //數(shù)碼管掃描顯示函數(shù)2(顯示車速度和等待時間)</p><p><b>  {</b></p><p>  unsigned char temp1,i;</p><p>  to

94、_disbuffer();</p><p>  for(i=8;i<=15;i++)</p><p><b>  {</b></p><p>  temp1=led_7[dis_buff[i+1]]; //i+1是為了忽略費用的最低位,但是還是存在的,只是不顯示而已 </p><p>  if(i==10

95、||i==13)</p><p>  HC164_sent_bit2(temp1|=0x80); //小數(shù)點顯示</p><p><b>  else</b></p><p>  HC164_sent_bit2(temp1); //PORTC&=0x03; //PORTC|=position[(5-i)];</p&g

96、t;<p>  PORTA = position[i+1]; </p><p>  delay_us(2100);</p><p>  PORTA = position[0]; </p><p><b>  } </b></p><p><b>  }</b></p>

97、;<p>  /////////////////////////////////////////////////////////////////////////////</p><p><b>  /*</b></p><p>  unsigned char read_key()</p><p><b>  {</

98、b></p><p>  static char key_state=0,key_value,key_line;</p><p>  char key_return=255,i;</p><p>  unsigned char tmp;</p><p>  switch(key_state)</p><p>&l

99、t;b>  {</b></p><p>  case 0:key_line=0x10; </p><p>  for(i=1;i<=4;i++)</p><p><b>  {</b></p><p>  key_port=~key_line;</p><p>  key_

100、port=~key_line;</p><p>  tmp=key_port;</p><p>  tmp=key_port;</p><p>  key_value=tmp&0x0f;</p><p>  if(key_value==0x0f)</p><p><b>  {</b>&l

101、t;/p><p>  key_line<<=1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  key_state++;</p>&

102、lt;p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p>  case 1:if(key_value==(key_po

103、rt&0x0f))</p><p><b>  {</b></p><p>  switch(key_value|key_line)</p><p><b>  {</b></p><p>  case 0x1e:key_return=0;break;</p><p>

104、;  case 0x1d:key_return=1;break;</p><p>  case 0x1b:key_return=2;break;</p><p>  case 0x17:key_return=3;break;</p><p>  case 0x2e:key_return=4;break;</p><p>  case 0x2d

105、:key_return=5;break;</p><p>  case 0x2b:key_return=6;break;</p><p>  case 0x27:key_return=7;break;</p><p>  case 0x4e:key_return=8;break;</p><p>  case 0x4d:key_return=

106、9;break;</p><p>  case 0x4b:key_return=10;break;</p><p>  case 0x47:key_return=11;break;</p><p>  case 0x8e:key_return=12;break;</p><p>  case 0x8d:key_return=13;break;

107、</p><p>  case 0x8b:key_return=14;break;</p><p>  case 0x87:key_return=15;break;</p><p><b>  }</b></p><p>  key_state++;</p><p><b>  }<

108、;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  key_state--;</p><p><b>  }</b></p><p><b>  break;</b&g

109、t;</p><p>  case 2: key_port=0x0f;</p><p>  key_port=0x0f;</p><p>  tmp=key_port;</p><p>  tmp=key_port;</p><p>  if((tmp&0x0f)==0x0f) </p><

110、;p><b>  {</b></p><p>  key_state=0;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  

111、return key_return;</p><p><b>  }</b></p><p><b>  */</b></p><p>  /////////////////////////////////////////////////////////////////////////////</p>&l

112、t;p>  // Timer 0 output compare interrupt service routine</p><p>  interrupt [TIM0_COMP] void timer0_comp_isr(void)</p><p><b>  {</b></p><p>  //time_scan_ok=1;

113、 //一毫秒定時到標(biāo)志位 </p><p>  /*if(++licheng_timecounter==200)</p><p><b>  {</b></p><p>  time_lichengleijiajia_ok=1;</p><p>  licheng_timecounter=0; <

114、/p><p><b>  }*/</b></p><p>  if(++interrupt_timecounter%100==0)time_lichengleijiajia_ok=1; //記錄每兩個脈沖中斷之間的時間間隔 (毫秒值)</p><p>  if(flag_zanting) //判斷是否在等待狀態(tài),是則更新等待時間,否則不更

115、新</p><p>  { </p><p>  if(++timecounter==10)//1s定時到 等待時間加一 暫停狀態(tài)下更新等待時間</p><p>  { </p><p>  if(++mytaxi.dengdaishijian[1]>=60)</p>&l

116、t;p><b>  {</b></p><p>  mytaxi.dengdaishijian[1] = 0; </p><p>  mytaxi.dengdaishijian[0] += 1 ; //dengdaishijian[0]為等待時間分鐘數(shù)</p><p>  if(++mytaxi.fujia_dengdai>

117、=5){mytaxi.fujia_dengdai = 0; mytaxi.feiyong += mytaxi.dancheng_danjia*10;} //等待每增加五分鐘增加一公里的費用</p><p><b>  }</b></p><p>  timecounter=0; </p><p><b>  }

118、 </b></p><p>  //PORTB.7=~PORTB.7; //測試用 </p><p><b>  } </b></p><p><b>  }</b></p><p>  // External Interrupt 1 service r

119、outine</p><p>  interrupt [EXT_INT1] void ext_int1_isr(void)</p><p><b>  {</b></p><p>  // Place your code here</p><p>  //規(guī)定轉(zhuǎn)盤轉(zhuǎn)速為5轉(zhuǎn)/分對應(yīng)車速5公里/小時,轉(zhuǎn)盤轉(zhuǎn)速為50轉(zhuǎn)/分對

120、應(yīng)車速50公里/小時,依此類推。</p><p>  if(flag_jiance)</p><p><b>  {</b></p><p>  speed_time += interrupt_timecounter; //累計脈沖之間的時間間隔(毫秒)</p><p>  interrupt_timecounter

121、= 0;</p><p>  if(++interrupt_cishu==lunzi_kongshu)</p><p>  { //計算一分鐘多少轉(zhuǎn),顯示的速度為真實速度的十倍 (+ 5是為了修正整形數(shù)計算誤差)</p><p>  mytaxi.sudu = 600000/speed_time + 5; //(60秒/分鐘 * 1000毫秒/秒 *10十倍實

溫馨提示

  • 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

提交評論