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

下載本文檔

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

文檔簡介

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

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

3、2.3 元器件選擇3</p><p>  2.4 系統(tǒng)設(shè)計3</p><p>  2.5硬件工作原理4</p><p>  2.6 硬件連接4</p><p><b>  3 設(shè)計流程5</b></p><p><b>  3.1設(shè)計步驟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è)計是設(shè)計一個單片機(jī)控制的多功能秒表系統(tǒng)。近年來隨著科

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

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

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

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

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

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

12、LED數(shù)碼管原理及使用方法。</p><p>  2. 掌握61板的使用方法。</p><p>  3. 初步掌握SPCE061A單片機(jī)匯編語言一般編程技巧。</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ī)一臺,μ’nSP? 十六位單片機(jī)實驗箱一個。本設(shè)計用到的實驗箱硬件模塊為:SPCE061A核心及周邊電路模塊(包含32個I/O口),LED數(shù)碼管。做此實驗用51板也可以,因為51板也提供了相應(yīng)的LED模組,因為實驗室里面給我們提供了61板,所以我決定選用SPCE061A單片機(jī)實驗箱。</p><p><b>  1.4 設(shè)計內(nèi)容</b&

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

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

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

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

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

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

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

21、示。</p><p><b>  圖2-1 系統(tǒng)框圖</b></p><p><b>  2.5硬件工作原理</b></p><p>  兩位數(shù)的顯示采用的是一個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>  采用凌陽大學(xué)計劃的LED鍵盤模組和61板搭配可以很容易的完成這個課程設(shè)計的題目。它的連結(jié)圖如圖所示,IOB的低八位控制數(shù)碼管顯示段位,高八位控制點亮哪一個數(shù)碼管。</p><p>  表2-1 LED引腳連接表</p><p><b&g

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

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

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

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

27、3所示。鍵盤輸入利用61板自帶的三個按鍵,輸入的端口為IOA0—IOA2。</p><p>  圖3-2 IRQ4 1KHz時基中斷流程 圖3-3IRQ5 2Hz時基中斷流程圖 </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>  // 實現(xiàn)功能: 課程設(shè)計2,用61板和LED板子實現(xiàn)99秒計數(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>  // 涉及的庫:

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中斷里面計時</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則開始計數(shù)</p><p>  F_Irq5_2HzOn();//打開2Hz中斷,則開始計數(shù)</p><p><b>  break;</b></p><p>  case 0x0002://按鍵2則停止計數(shù)</p><p>  F_Irq

44、5_2HzOff();//關(guān)掉2Hz中斷,即停止計數(shù)</p><p><b>  break;</b></p><p>  case 0x0004://按鍵3則計數(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>  //計算要顯示的值,顯示程序?qū)懺谥袛嘀?,以便播放語音時能及時更新顯示數(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();//鍵盤掃描的后臺循環(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)先級的程序</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)先級而做的 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——動態(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>  本裝置將實現(xiàn)0-99的計數(shù),每一秒鐘,計數(shù)器將加1,在數(shù)碼管上顯示當(dāng)前計數(shù)值,并可用鍵盤按制計數(shù)的起始,以及歸零。具體要求如下:</p><p>  1. 開機(jī)時

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

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

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

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

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

溫馨提示

  • 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

提交評論