99秒秒表課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  目 錄</b></p><p><b>  摘要 1</b></p><p>  1 99秒秒表設(shè)計(jì)背景及目的要求1</p><p>  1.1 99秒秒表設(shè)計(jì)背景1</p><p><b>  1.2設(shè)計(jì)目的1</b></p>

2、<p><b>  1.3硬件選擇2</b></p><p><b>  1.4設(shè)計(jì)內(nèi)容2</b></p><p>  2 設(shè)計(jì)方案及基本原理2</p><p>  2.1 預(yù)備知識(shí)2</p><p>  2.2 LED顯示原理3</p><p>  

3、2.3 元器件選擇3</p><p>  2.4 系統(tǒng)設(shè)計(jì)3</p><p>  2.5硬件工作原理4</p><p>  2.6 硬件連接4</p><p><b>  3 設(shè)計(jì)流程5</b></p><p><b>  3.1設(shè)計(jì)步驟5</b></p&g

4、t;<p><b>  3.2程序代碼6</b></p><p><b>  4 程序7</b></p><p>  4.1 main.c主程序7</p><p>  4.2 key.asm ——鍵盤掃描子程序11</p><p>  5 調(diào)試結(jié)果及分析24</p>

5、;<p>  5.1 調(diào)試結(jié)果24</p><p>  5.2 結(jié)果分析25</p><p>  6 結(jié)論與分析25</p><p>  7 參考與文獻(xiàn)25</p><p><b>  摘要</b></p><p>  本設(shè)計(jì)是設(shè)計(jì)一個(gè)單片機(jī)控制的多功能秒表系統(tǒng)。近年來(lái)隨著科

6、技的飛速發(fā)展,單片機(jī)的應(yīng)用正在不斷的走向深入,同時(shí)帶動(dòng)著傳統(tǒng)控制檢測(cè)日新月異更新。在實(shí)時(shí)檢測(cè)和自動(dòng)控制的單片機(jī)應(yīng)用系統(tǒng)中,單片機(jī)往往是作為一個(gè)核心部件來(lái)使用,僅單片機(jī)方面的知識(shí)是不夠的,還要根據(jù)具體的硬件結(jié)構(gòu),以及針對(duì)具體的應(yīng)用對(duì)象的軟件結(jié)合,加以完善。秒表的出現(xiàn),解決了傳統(tǒng)的由于人為因素造成的誤差和不公平性。將軟、硬件有機(jī)地結(jié)合起來(lái),使得系統(tǒng)能夠?qū)崿F(xiàn)兩位LED顯示,顯示時(shí)間為00~99秒,每秒自動(dòng)加1,能正確地進(jìn)行加、減(倒)計(jì)時(shí),快

7、加,快減,可以同時(shí)記錄4個(gè)相對(duì)獨(dú)立的時(shí)間,通過(guò)上翻下翻來(lái)查看這4個(gè)不同的計(jì)時(shí)值,可謂功能強(qiáng)大。其中軟件系統(tǒng)采用匯編語(yǔ)言編寫程序,包括顯示程序,加減計(jì)數(shù)程序,快加快減程序,中斷,延時(shí)程序,按鍵消抖程序等,并在WAVE中調(diào)試運(yùn)行,硬件系統(tǒng)利用PROTEUS強(qiáng)大的功能來(lái)實(shí)現(xiàn),簡(jiǎn)單切易于觀察,在仿真中就可以觀察到實(shí)際的工作狀態(tài)。</p><p>  關(guān)鍵詞:?jiǎn)纹瑱C(jī) AT89C51 99秒</p>&

8、lt;p>  【設(shè)計(jì)題目】99秒秒表設(shè)計(jì)</p><p>  1 99秒秒表設(shè)計(jì)背景及目的要求</p><p>  1.1 99秒秒表設(shè)計(jì)背景 </p><p>  目前,單片機(jī)正朝著高性能和對(duì)品種方向發(fā)展,趨勢(shì)是進(jìn)一步向著CMO化,低功耗,小體積,大存量,高性能,低價(jià)格和外國(guó)電路內(nèi)裝化等幾個(gè)方面發(fā)展。</p><p>  單片機(jī)應(yīng)用的

9、重要意義還在于他從根本上改變了傳統(tǒng)的控制系統(tǒng)設(shè)計(jì)思想和設(shè)計(jì)方法。從前必須由模擬電路或數(shù)字電路實(shí)現(xiàn)的大部分功能功能,現(xiàn)在已能用單片機(jī)通過(guò)軟件方法來(lái)實(shí)現(xiàn)了。這種軟件代替硬件的控制技術(shù)也稱為微控制技術(shù),是傳統(tǒng)控制技術(shù)的一次革命。</p><p>  單片機(jī)模塊中最常見(jiàn)的是秒表、數(shù)字鐘等顯示時(shí)間類的裝置,此裝置是一種用數(shù)字電路實(shí)現(xiàn)時(shí)、分、秒計(jì)時(shí)的裝置,與機(jī)械式時(shí)鐘相比具有更高的準(zhǔn)確性和直觀性,且無(wú)機(jī)械裝置,具有更長(zhǎng)的使用

10、壽命,因此得到了廣泛的使用。</p><p>  此設(shè)計(jì)利用凌陽(yáng)科技公司的凌陽(yáng)16位單片機(jī)SPCE061A為主控芯片,充分利用61板上面的三個(gè)按鍵,完成一個(gè)簡(jiǎn)易的現(xiàn)實(shí)系統(tǒng)——99秒秒表。</p><p>  61板是一套完整的16位單片機(jī)開(kāi)發(fā)系統(tǒng),可直接把程序下載到61板上進(jìn)行調(diào)試和封裝。集成度高、運(yùn)算速度快、體積小、運(yùn)算可靠、價(jià)格低廉,在過(guò)程控制、數(shù)據(jù)采集、機(jī)電一體化、智能儀器儀表、網(wǎng)絡(luò)

11、技術(shù)等方面得到廣泛應(yīng)用。</p><p><b>  1.2 設(shè)計(jì)目的</b></p><p>  隨著單片機(jī)應(yīng)用的日益廣泛,在校學(xué)生加強(qiáng)對(duì)單片機(jī)的認(rèn)識(shí)和動(dòng)手能力,已經(jīng)是非常重要的一項(xiàng)鍛煉。課程設(shè)計(jì)就是為加強(qiáng)實(shí)踐機(jī)會(huì)、培養(yǎng)學(xué)生動(dòng)手能力的一個(gè)重要環(huán)節(jié),將理論知識(shí)與實(shí)際聯(lián)系起來(lái)的一個(gè)關(guān)鍵機(jī)會(huì)。本課程設(shè)計(jì)的基本要求是:</p><p>  1. 掌握

12、LED數(shù)碼管原理及使用方法。</p><p>  2. 掌握61板的使用方法。</p><p>  3. 初步掌握SPCE061A單片機(jī)匯編語(yǔ)言一般編程技巧。</p><p>  4. 初步掌握61板系統(tǒng)調(diào)試的一般步驟及方法。</p><p><b>  1.3硬件選擇</b></p><p> 

13、 裝有Windows系統(tǒng)和μ’nSP? IDE仿真環(huán)境的PC機(jī)一臺(tái),μ’nSP? 十六位單片機(jī)實(shí)驗(yàn)箱一個(gè)。本設(shè)計(jì)用到的實(shí)驗(yàn)箱硬件模塊為:SPCE061A核心及周邊電路模塊(包含32個(gè)I/O口),LED數(shù)碼管。做此實(shí)驗(yàn)用51板也可以,因?yàn)?1板也提供了相應(yīng)的LED模組,因?yàn)閷?shí)驗(yàn)室里面給我們提供了61板,所以我決定選用SPCE061A單片機(jī)實(shí)驗(yàn)箱。</p><p><b>  1.4 設(shè)計(jì)內(nèi)容</b&

14、gt;</p><p>  本裝置將實(shí)現(xiàn)0-99的計(jì)數(shù),每一秒鐘,計(jì)數(shù)器將加1,在數(shù)碼管上顯示當(dāng)前計(jì)數(shù)值,并可用鍵盤按制計(jì)數(shù)的起始,以及歸零。具體要求如下:</p><p>  1. 開(kāi)機(jī)時(shí)數(shù)碼管顯示00。</p><p>  2. 每一秒鐘,計(jì)數(shù)器自動(dòng)加1。</p><p>  3. 按鍵控制計(jì)數(shù),分別控制開(kāi)始計(jì)時(shí)、停止計(jì)時(shí)和歸零,功能分配

15、如下:</p><p>  表1-1按鍵功能分配</p><p>  2 設(shè)計(jì)方案及基本原理</p><p><b>  2.1 預(yù)備知識(shí)</b></p><p>  1.熟悉凌陽(yáng)單片機(jī)的工作原理。</p><p> ?。?)I/O口的使用原理和設(shè)置;</p><p>  

16、(2)定時(shí)器或時(shí)基的設(shè)置、使用;</p><p><b> ?。?)中斷的設(shè)定。</b></p><p>  2.了解數(shù)碼管的顯示原理。</p><p>  3.熟悉鍵盤掃描原理。</p><p>  4.熟悉匯編語(yǔ)言或C語(yǔ)言。</p><p>  2.2 LED顯示原理</p>&

17、lt;p>  靜態(tài)顯示就是顯示驅(qū)動(dòng)電路具有輸出鎖存功能,單片機(jī)將所要顯示的數(shù)據(jù)送出后就不再管,直到下一次顯示數(shù)據(jù)需要更新時(shí)再傳送一次新數(shù)據(jù),顯示數(shù)據(jù)穩(wěn)定,占用很少的CPU時(shí)間。 </p><p>  動(dòng)態(tài)顯示需要CPU時(shí)刻對(duì)顯示器件進(jìn)行數(shù)據(jù)刷新,顯示數(shù)據(jù)有閃爍感,占用的CPU時(shí)間多。這兩種顯示方式各有利弊;靜態(tài)顯示雖然數(shù)據(jù)穩(wěn)定,占用很少的CPU時(shí)間,但每個(gè)顯示單元都需要單獨(dú)的顯示驅(qū)動(dòng)電路,使用的硬件較多;動(dòng)

18、態(tài)顯示雖然有閃爍感,占用的CPU時(shí)間多,但使用的硬件少,能節(jié)省線路板空間。</p><p>  基本的半導(dǎo)體數(shù)碼管是由七個(gè)條狀發(fā)光二極管芯片排列而成的,可實(shí)現(xiàn)0~9的顯示。</p><p>  LED數(shù)碼管是由發(fā)光二級(jí)管顯示字段組成的顯示器,有8段和“米”字段之分,這種顯示器有共陽(yáng)級(jí)和共陰極兩種。所謂共陽(yáng)方式是指筆畫顯示器各段發(fā)光管的陽(yáng)極(即P區(qū))是公共的,而陰極互相隔離。所謂共陰方式是筆

19、畫顯示器各段發(fā)光管的陰極(即N區(qū))是公共的,而陽(yáng)極是互相隔離的。</p><p><b>  2.3 元器件選擇</b></p><p>  61板一個(gè),共陰極2位LED數(shù)碼管一個(gè),電路板一個(gè),8050三極管二個(gè),1k的電阻8個(gè),33k電阻2個(gè),導(dǎo)線若干,排針(10位)2個(gè)。</p><p><b>  2.4 系統(tǒng)設(shè)計(jì)</b&

20、gt;</p><p>  根據(jù)設(shè)計(jì)題目的要求分析,并考慮到題目的可擴(kuò)展性,可將系統(tǒng)分成兩大部分:</p><p>  1. 時(shí)間的產(chǎn)生和顯示。</p><p>  2. 按鍵控制計(jì)數(shù)起始、歸零。</p><p>  根據(jù)系統(tǒng)的功能現(xiàn)選擇61板作為單片機(jī)控制處理部分,利用一2位LED作為顯示部分,而按鍵采用61板上自帶的三個(gè)按鍵,如圖2-1所

21、示。</p><p><b>  圖2-1 系統(tǒng)框圖</b></p><p><b>  2.5硬件工作原理</b></p><p>  兩位數(shù)的顯示采用的是一個(gè)2位共陰極LED 數(shù)碼管(LG5621AH),連接方法是SPCE061A的IOB0-IOB6接LED焊接板的A-G,小數(shù)顯示部分可以省略不要;IOB8-IOB9分

22、別接LED的位選COM1、COM2,電路原理圖如圖2-4。LED與SPCE061A的引腳連接如表2-1。</p><p>  采用凌陽(yáng)大學(xué)計(jì)劃的LED鍵盤模組和61板搭配可以很容易的完成這個(gè)課程設(shè)計(jì)的題目。它的連結(jié)圖如圖所示,IOB的低八位控制數(shù)碼管顯示段位,高八位控制點(diǎn)亮哪一個(gè)數(shù)碼管。</p><p>  表2-1 LED引腳連接表</p><p><b&g

23、t;  2.6 硬件連接</b></p><p>  采用凌陽(yáng)大學(xué)計(jì)劃的LED鍵盤模組和61板搭配可以很容易的完成這個(gè)課程設(shè)計(jì)的題目。它的連結(jié)圖如圖所示,IOB的低八位控制數(shù)碼管顯示段位,高八位控制點(diǎn)亮哪一個(gè)數(shù)碼管。</p><p>  圖2-2 LED鍵盤模組和61板連接圖</p><p><b>  3 設(shè)計(jì)流程</b><

24、/p><p><b>  3.1設(shè)計(jì)步驟</b></p><p>  根據(jù)設(shè)計(jì)要求的功能,程序主要分為三部分,即:</p><p> ?。?)計(jì)時(shí)顯示部分;</p><p><b> ?。?)秒計(jì)時(shí)部分;</b></p><p> ?。?)按鍵控制部分。</p>&

25、lt;p> ?。?)程序主流程主要完成鍵盤掃描、計(jì)時(shí)處理、鍵值分支控制的任務(wù),流程圖如圖所示:</p><p>  圖3-1 主程序流程圖</p><p>  顯示部分是在IRQ4的1KHz中斷中控制顯示的,采用動(dòng)態(tài)掃描的方式,1KHz的時(shí)基中斷每1ms進(jìn)一次中斷,在中斷中對(duì)2ms計(jì)數(shù)器i進(jìn)行累加,當(dāng)i從0累加到2時(shí),則剛好為2ms,此時(shí)更新一個(gè)位的LED顯示,并對(duì)i進(jìn)行清零;當(dāng)下一

26、次累計(jì)到2ms時(shí),則會(huì)再更新顯示下一位LED數(shù)碼管,當(dāng)更新到最后一位時(shí),返回重第一位開(kāi)始更新;依此循環(huán)更新顯示,而更新顯示的數(shù)據(jù)保存在緩沖區(qū)當(dāng)中,用戶需要更新顯示的數(shù)據(jù)時(shí),只需要改變對(duì)應(yīng)的緩沖區(qū)中的數(shù)據(jù)即可。具體流程圖如下。 </p><p>  秒計(jì)時(shí)采用IRQ5的2Hz時(shí)基中斷進(jìn)行計(jì)時(shí),流程圖如圖3-

27、3所示。鍵盤輸入利用61板自帶的三個(gè)按鍵,輸入的端口為IOA0—IOA2。</p><p>  圖3-2 IRQ4 1KHz時(shí)基中斷流程 圖3-3IRQ5 2Hz時(shí)基中斷流程圖 </p><p><b>  4 程序</b></p><p>  提供的程序名稱為counter,主要包括以下文件:&l

28、t;/p><p>  4.1 main.c主程序</p><p>  //==================================================================</p><p>  // The information contained herein is the exclusive property of&

29、lt;/p><p>  // Sunplus Technology Co. And shall not be distributed, reproduced,</p><p>  // or disclosed in whole in part without prior written permission.、</p><p>  //

30、 (C) COPYRIGHT 2001 SUNPLUS TECHNOLOGY CO.</p><p>  // ALL RIGHTS RESERVED</p><p>  // The entire notice above must be reproduced on all authorized copies.<

31、;/p><p><b>  //</b></p><p>  //====================================================================</p><p>  // 工程名稱:counter.spj</p><p>  // 作者: xinyan (ema

32、il: xinyan@sunnorth.com.cn) </p><p>  // 聯(lián)系方式: 010-62981668-2919</p><p>  // 適應(yīng)芯片: SPCE061A</p><p>  // 實(shí)現(xiàn)功能: 課程設(shè)計(jì)2,用61板和LED板子實(shí)現(xiàn)99秒計(jì)數(shù)器</p><p><b>  //</b

33、></p><p>  // 系統(tǒng)要求: PC with CPU 233MHz,128MB RAM,</p><p>  // SUNPLUS u'nSPTM IDE 1.8.4(or later)</p><p><b>  //</b></p><p>  // 涉及的庫(kù):

34、(a) C-Lib: (CMacro.lib); </p><p>  // (b) SACM-Lib: SacmV26.lib; </p><p><b>  //</b></p><p><b>  // 組成文件:</b></p><p>  //

35、 main.c/ISR.c/numLED.c</p><p>  // boot.asm/hardware.asm/key.asm </p><p>  // hardware.h/hardware.inc</p><p><b>  //</b></p><p>  // 當(dāng)前版本: V1.0&l

36、t;/p><p>  // 日期: 2004-8-3</p><p><b>  // </b></p><p><b>  // 參考文件:</b></p><p><b>  // 維護(hù)記錄:</b></p><p>  //---------

37、-----------------------------------------------------------------------------------------------</p><p>  // Version YYYY-MM-DD-INDEX Modified By Description</p><p>  // V1.0.0

38、 2004-8-3 by xinyan originality </p><p>  //V2.0.02005-9-20 by xinqiang Edit for new user</p><p>  //===============================================</p><p>

39、  int iShow[2],key=0;</p><p>  int iCounter=0;//在2Hz中斷里面計(jì)時(shí)</p><p>  #define P_Watchdog_Clear(volatile unsigned int *) 0x7012</p><p>  //以下是鍵盤掃描程序,在key.asm中定義</p><p&g

40、t;  extern void F_Key_Scan_Initial(void);</p><p>  extern void F_Key_Scan_ServiceLoop(void);</p><p>  extern unsigned int SP_GetCh(void);</p><p>  int main(void)</p><p>

41、;<b>  {</b></p><p>  int i,j,iCounter1;</p><p>  F_IrqInti();//中斷初始化</p><p>  F_Key_Scan_Initial();//鍵盤初始化,在key.asm中定義</p><p><b>  while(1

42、)</b></p><p><b>  {</b></p><p>  key = SP_GetCh();//按鍵掃描,并獲取鍵值,在key.asm中定義</p><p>  switch(key)</p><p><b>  { </b></p>&

43、lt;p>  case 0x0001://按鍵1則開(kāi)始計(jì)數(shù)</p><p>  F_Irq5_2HzOn();//打開(kāi)2Hz中斷,則開(kāi)始計(jì)數(shù)</p><p><b>  break;</b></p><p>  case 0x0002://按鍵2則停止計(jì)數(shù)</p><p>  F_Irq

44、5_2HzOff();//關(guān)掉2Hz中斷,即停止計(jì)數(shù)</p><p><b>  break;</b></p><p>  case 0x0004://按鍵3則計(jì)數(shù)器清零</p><p>  iCounter=0;//</p><p><b>  break;</b><

45、;/p><p><b>  default:</b></p><p>  break; </p><p><b>  }</b></p><p>  //計(jì)算要顯示的值,顯示程序?qū)懺谥袛嘀?,以便播放語(yǔ)音時(shí)能及時(shí)更新顯示數(shù)據(jù)</p><p>  iCounter1 =

46、iCounter>>1;</p><p>  iShow[0] = (iCounter1/10)%10;</p><p>  iShow[1] = iCounter1%10; </p><p>  *P_Watchdog_Clear = 0x0001;//清看門狗</p><p>  F_Key_Scan_Service

47、Loop();//鍵盤掃描的后臺(tái)循環(huán)服務(wù)程序,在key.asm中定義</p><p><b>  }</b></p><p><b>  }</b></p><p>  4.2 key.asm ——鍵盤掃描子程序</p><p>  //============================

48、============================================================</p><p>  // Progarm: The head file for key.asm in assembly view</p><p>  // Arranged by: Andy Hsu</p><p>  // Modified b

49、y Arthur Shieh</p><p>  // Last modified date: </p><p>  // 2000/06/23: first version</p><p>  //2000/07/20: modified</p><p>  // 2002/5/31 : Modified by Arthu

50、r Shieh to use IOA8~IOA15 for keyscan</p><p>  //2005/8/12 : Modified by xinqiang for more user & function </p><p>  // Functions:</p><p>  // F_Key_Scan_Initial;</p>

51、<p>  // F_Key_Scan_ServiceLoop;</p><p>  // F_Key_DebounceCnt_Down;</p><p><b>  //</b></p><p>  //call F_SP_GetCh;</p><p>  //===================

52、=====================================================================</p><p>  .DEFINEP_IOA_Data 0x7000 // Write Data into data register and read from IOA pad</p><p>  .DEFINE P_IOA

53、_Buffer 0x7001 // Write Data into buffer register and read from buffer register</p><p>  .DEFINE P_IOA_Dir 0x7002 // Direction vector for IOA</p><p>  .DEFINE P_

54、IOA_Attrib 0x7003 // Attribute vector for IOA</p><p>  .DEFINE P_IOA_Latch 0x7004 // Latch PortA data for key change wake-up</p><p>  .DEFINE P_IOB_Data 0

55、x7005 // Write Data into the data register and read from IOB pad</p><p>  .DEFINE P_IOB_Buffer 0x7006 // Write Data into buffer register and read from buffer register</p><p&

56、gt;  .DEFINE P_IOB_Dir 0x7007 // Direction vector for IOB</p><p>  .DEFINE P_IOB_Attrib 0x7008 // Attribute vector for IOB</p><p>  .define P_Watchdog_Clear 0

57、x7012</p><p>  //.INCLUDE hardware.inc;</p><p>  .public _F_Key_Scan_Initial</p><p>  .PUBLICF_Key_Scan_Initial;</p><p>  .public _F_Key_Scan_ServiceLoop</p>&l

58、t;p>  .PUBLIC F_Key_Scan_ServiceLoop;</p><p>  .PUBLIC _SP_GetCh;</p><p>  .PUBLICF_SP_GetCh;</p><p>  .PUBLIC R_KeyStrobe;</p><p>  .public _F_KeyScan;</p>

59、<p>  .define Port_KeyP_IOA_Data//Key input port</p><p>  .definePort_Key_AP_IOA_Attrib</p><p>  .definePort_Key_DP_IOA_Dir</p><p>  .definePort_Key_BP_IOA_Buffer&l

60、t;/p><p>  .define M_MASK0x0007//the port of the key input</p><p>  .define M_ScanBegin0x0001//the begin bit of key scan</p><p>  .define M_KeyNumber 0x0003//key n

61、umbers</p><p>  //////////////////////////////////////////////////////////////////</p><p>  // RAM Define Area</p><p>  /////////////////////////////////////////////////////

62、/////////////</p><p><b>  .RAM</b></p><p>  .VARR_DebounceReg;//for keyboard scan</p><p>  .DEFINE C_DebounceCnt0x0009;</p><p>  .VARR_KeyStrob

63、e;//for keyboard scan</p><p>  .var R_KeyCounter//key down counter</p><p>  .var R_Keyflag//save the key flag</p><p>  .var R_Keyoll//save the oll data

64、of key</p><p><b>  .CODE</b></p><p>  //////////////////////////////////////////////////////////////////</p><p>  // Function: Initialization for F_Key_Scan_ServiceLoop&

65、lt;/p><p>  ////////////////////////////////////////////////////////////////// </p><p>  _F_Key_Scan_Initial: </p><p>  F_Key_Scan_Initial:</p><p>  r1 = [Port_Key_A]&l

66、t;/p><p>  r1 = r1&(~M_MASK)</p><p>  [Port_Key_A] = r1</p><p>  r1 = [Port_Key_D]</p><p>  r1 = R1&(~M_MASK)</p><p>  [Port_Key_D] = r1</p>&l

67、t;p>  r1 = [Port_Key_B]</p><p>  r1 = r1&(~M_MASK)</p><p>  [Port_Key_B] = r1</p><p>  r1 = 0x0000;//</p><p>  [R_KeyCounter] = r1;//</p><p>

68、;  [R_Keyflag] = r1; //</p><p>  [R_Keyoll] = r1;//</p><p>  [R_KeyStrobe] = r1;</p><p>  //r1 = C_DebounceCnt;//</p><p>  //[R_DebounceCnt] = r1;//re

69、set debounce counter</p><p><b>  retf;</b></p><p>  //////////////////////////////////////////////////////////////////</p><p>  // Function: Get Key code from key pad(8

70、x 1 key pad)</p><p>  // Input: Port IOA b15-b8</p><p>  // Output: R_KeyStrobe b7-b0</p><p>  // | | | | </p><p>  // +Vcc --- x --- x ... x --- x

71、--- </p><p>  // | | | |</p><p>  // IOA.15 IOA.8</p><p>  // Note: 1)link F_DebounceCntDown is necessary </p><p>  // Destor

72、y register: r1, r2 </p><p>  ////////////////////////////////////////////////////////////////// </p><p>  _F_Key_Scan_ServiceLoop:</p><p>

73、  F_Key_Scan_ServiceLoop:</p><p>  r1 = [Port_Key];// get key data from IOA </p><p>  r2 = M_MASK</p><p><b>  r1 &= R2</b></p><p>  jnz H_KeyHight

74、//非零轉(zhuǎn)</p><p>  r2 = [R_Keyoll]</p><p>  jnz L_KeyLow//上一次的鍵值非零,則轉(zhuǎn)</p><p><b>  r1 = 0</b></p><p>  jmp L_KS_Exit2//退出</p><p><b> 

75、 L_KeyLow:</b></p><p>  r2 = [R_Keyflag]</p><p>  test r2,0x0001</p><p>  jnz L_KeyLow_1//標(biāo)志位非零則轉(zhuǎn)</p><p><b>  r2 = 0</b></p><p>  [R_

76、KeyCounter] = r2</p><p>  [R_Keyflag] = r2</p><p>  [R_Keyoll] = r1</p><p><b>  r1 = 0</b></p><p>  jmp L_KS_Exit2//退出</p><p>  L_KeyLow_1:

77、</p><p><b>  r2 = 0</b></p><p>  [R_KeyCounter] = r2</p><p>  [R_Keyflag] = r2</p><p>  r1 = [R_Keyoll]//取上一次的鍵值</p><p><b>  r2 = 0&l

78、t;/b></p><p>  [R_Keyoll] = r2</p><p>  jmp L_KeyGet//到判斷優(yōu)先級(jí)的程序</p><p>  H_KeyHight://當(dāng)次按鍵非零處理</p><p>  r2 = [R_KeyCounter]</p><p>  cmp r2,C

79、_DebounceCnt //比較</p><p>  ja H_KeyHight_1//大于規(guī)定數(shù),轉(zhuǎn)</p><p>  r2+=1//Counter++</p><p>  [R_KeyCounter] = r2</p><p>  jmp H_KeyHight_2</p><p>  H

80、_KeyHight_1:</p><p>  r2 = [R_Keyflag]//flag 置位</p><p>  r2 |= 0x0001</p><p>  [R_Keyflag] = r2</p><p>  H_KeyHight_2:</p><p>  [R_Keyoll] = r1</p>

81、;<p><b>  r1 = 0</b></p><p>  jmp L_KS_Exit2//退出 </p><p>  //L_KeyGet:</p><p>  //r2 = r1//鍵盤優(yōu)先級(jí)而做的 begin....</p><p>  //r3 = 0x0080

82、//Edit by xinqiang 2004.12.21</p><p>  //L_KS_Renews2://xinqiang@sunnorth.com.cn</p><p>  //r3 = r3 lsl 1//tel:010-62981668-2916</p><p>  //test r3,0x2000//</p

83、><p>  //jz L_KS_Renews12//</p><p>  //r1 = 0//</p><p>  //jmp L_KS_Exit2//</p><p>  //L_KS_Renews12://</p><p>  //r1 = r1&r3/

84、/</p><p>  //jnz L_KS_Exit2//</p><p><b>  L_KeyGet:</b></p><p>  jmp L_KS_Exit2</p><p>  r1 = r2//</p><p>  //jmp L_KS_Renews2//.

85、...end</p><p>  L_KS_Exit2:</p><p>  [R_KeyStrobe] = r1;//save stable key code to R_KeyStrobe</p><p>  retf;//</p><p>  //*********************************

86、*******************************</p><p>  // Function: Get Keycode for I/O Port </p><p>  // Destory register: r1, r2 </p><p>

87、;  //****************************************************************</p><p>  _SP_GetCh:</p><p>  F_SP_GetCh:</p><p>  push r2 to [SP]; </p><p>  r1 = [R_KeyStr

88、obe];// Get Key code</p><p>  r2 = 0x0000;// Clear KeyStrobe for next key</p><p>  [R_KeyStrobe] = r2;//</p><p>  popr2 from [SP];</p><p><b>  retf

89、;</b></p><p>  //=================================================================//</p><p>  //name:F_KeyScan</p><p>  //for user: C function unsigned int F_KeyScan(void)<

90、/p><p>  //output:Key Sand data from Key1~5 Key1>>Key2>>Key3>>Key4>>Key5</p><p>  //note: noll</p><p>  //===================================================

91、==============//</p><p>  _F_KeyScan:.proc</p><p>  F_KeyScan:</p><p>  push r2,r5 to [sp]</p><p>  r1 = [Port_Key]</p><p>  r1 ^= M_MASK</p><p&

92、gt;  jnz F_KeyScan_Get1</p><p><b>  r1 = 0</b></p><p>  jmp F_KeyScan_Exit</p><p>  F_KeyScan_Get1:</p><p>  call F_Delay//call key Scan delay 10~18ms&l

93、t;/p><p>  r1 = [Port_Key]</p><p>  r1 ^= M_MASK</p><p>  jnz F_KeyScan_Get2//check the key again</p><p><b>  r1 = 0</b></p><p>  jmp F_KeyScan

94、_Exit</p><p>  F_KeyScan_Get2:</p><p><b>  r2 = r1</b></p><p><b>  r3 = r1</b></p><p><b>  r1 = 0</b></p><p>  r4 = M_S

95、canBegin //0x0001</p><p>  F_KeyScan_loop1:</p><p><b>  r1+=1</b></p><p>  r3 = r3&r4</p><p>  jnz F_KeyScan_Exit1</p><p>  cmp r1,M_KeyNu

96、mber //8</p><p>  je F_KeyScan_Exit1</p><p>  r4 = r4 lsl 1</p><p><b>  r3 = r2</b></p><p>  jmp F_KeyScan_loop1</p><p>  F_KeyScan_Exit1:<

97、/p><p>  //r1 = r3</p><p>  F_KeyScan_Exit2:</p><p>  r3 = 0x0001</p><p>  [P_Watchdog_Clear] = r3</p><p>  r2 = [Port_Key]</p><p>  r2 ^= M_MAS

98、K</p><p>  jnz F_KeyScan_Exit2</p><p>  F_KeyScan_Exit:</p><p>  pop r2,r5 from [sp]</p><p><b>  retf</b></p><p><b>  .endp</b><

99、/p><p><b>  F_Delay:</b></p><p>  push r3 ,r5 to [sp]</p><p>  r3=0x6e6d//0xDCDB</p><p><b>  Dely_L:</b></p><p>  r4 = 0x0001</p>

100、;<p>  [P_Watchdog_Clear] = r4</p><p><b>  r3-=1</b></p><p>  jnz Dely_L</p><p>  pop r3,r5 from [sp]</p><p><b>  retf</b></p><

101、;p>  //======================================================================================== </p><p>  // End of key.asm</p><p>  //=================================================

102、=======================================</p><p>  4.3 ISR.asm ——中斷處理子程序</p><p>  4.4 hardware——SPEC061內(nèi)部硬件資源定義</p><p>  4.5 NumLED.c——?jiǎng)討B(tài)顯示子程序</p><p>  4.6 boot.asm——中斷設(shè)置

103、子程序</p><p><b>  5 調(diào)試結(jié)果及分析</b></p><p><b>  5.1 調(diào)試結(jié)果</b></p><p>  本裝置將實(shí)現(xiàn)0-99的計(jì)數(shù),每一秒鐘,計(jì)數(shù)器將加1,在數(shù)碼管上顯示當(dāng)前計(jì)數(shù)值,并可用鍵盤按制計(jì)數(shù)的起始,以及歸零。具體要求如下:</p><p>  1. 開(kāi)機(jī)時(shí)

104、數(shù)碼管顯示00。</p><p>  2. 每一秒鐘,計(jì)數(shù)器自動(dòng)加1。</p><p>  3. 按鍵控制計(jì)數(shù),分別控制開(kāi)始計(jì)時(shí)、停止計(jì)時(shí)和歸零,功能分配如下:</p><p>  按KEY1開(kāi)始計(jì)時(shí)數(shù)碼管顯示從00開(kāi)始計(jì)時(shí)到99結(jié)束再?gòu)?0開(kāi)始循環(huán);</p><p>  按KEY2 停止計(jì)時(shí)數(shù)碼管顯示當(dāng)前數(shù)值;</p><

105、;p>  按KEY3歸零;按KEY4復(fù)位.</p><p><b>  5.2 結(jié)果分析</b></p><p>  本設(shè)計(jì)應(yīng)該熟悉凌陽(yáng)十六位單片機(jī)系統(tǒng)板-61板的基本構(gòu)成, 掌握 LED數(shù)碼管原理及使用方法,掌握61板的使用方法,初步掌握 SPCE061A單片機(jī)匯編語(yǔ)言一般編程技巧,初步掌握61板系統(tǒng)調(diào)試的一般步驟及方法。設(shè)計(jì)結(jié)構(gòu)現(xiàn)實(shí):開(kāi)機(jī)時(shí)數(shù)碼管顯示為00,

106、每一秒鐘計(jì)數(shù)器自動(dòng)加一,按KEY1鍵開(kāi)始計(jì)時(shí),按KEY2鍵停止計(jì)時(shí)并現(xiàn)實(shí)當(dāng)前數(shù)值,按KEY3鍵歸零。</p><p><b>  6 結(jié)論與體會(huì)</b></p><p>  兩周的單片機(jī)課程設(shè)計(jì)結(jié)束了,最初的目的是想學(xué)到一些對(duì)將來(lái)就業(yè)很有實(shí)質(zhì)性幫助的東西。結(jié)果還算可以接受,雖然說(shuō)與預(yù)期的有不少出入,但鍛煉自己這個(gè)主要目標(biāo)算是達(dá)成了。通過(guò)這次課程設(shè)計(jì),我對(duì)如何完成一項(xiàng)實(shí)

107、際的計(jì)劃有了進(jìn)一步的認(rèn)識(shí),對(duì)如何加強(qiáng)自己的合作能力有了更進(jìn)一步的思考。通過(guò)這次課程設(shè)計(jì),我想下學(xué)期的畢業(yè)設(shè)計(jì)會(huì)少點(diǎn)困難,以后在工作中也能夠有更多的經(jīng)驗(yàn)好借鑒。在這段日子里,我實(shí)踐、思考、反思、總結(jié),所得收獲都已經(jīng)成為大學(xué)生涯中的寶貴財(cái)富?;蛟S大學(xué)生活中的片斷隨著歲月的流逝難免被遺忘,但是這段課程設(shè)計(jì)的日子相信仍會(huì)是記憶深刻,它作為我們走向社會(huì)的第一步,承載了即將面對(duì)現(xiàn)實(shí)和挑戰(zhàn)的心情,必將難忘。</p><p> 

108、 在此,感謝趙老師的細(xì)心輔導(dǎo),有了這次的實(shí)踐經(jīng)驗(yàn),為畢業(yè)設(shè)計(jì)奠定基礎(chǔ)。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 于海生.微型計(jì)算機(jī)控制技術(shù)[M].清華大學(xué)出版社,1999-6.</p><p>  [2] 孫涵芳.MCS-51系列單片機(jī)原理及應(yīng)用[J].北京航天大學(xué)出版社,1996-4.</p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論