基于61板的99秒秒表課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩36頁(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>  第一章設(shè)計(jì)目的及要求</p><p><b>  1.1 設(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ì)。</p><p><b> 

2、 1.2 設(shè)計(jì)要求 </b></p><p>  1. 熟悉凌陽(yáng)十六位單片機(jī)系統(tǒng)板-61板的基本構(gòu)成。 </p><p>  2. 掌握LED數(shù)碼管原理及使用方法。 </p><p>  3. 掌握61板的使用方法。 </p><p>  4. 初步掌握SPCE061A單片機(jī)匯編語(yǔ)言一般編程技巧。</p><p

3、>  5. 初步掌握61板系統(tǒng)調(diào)試的一般步驟及方法。</p><p>  第二章設(shè)計(jì)原理及方案</p><p><b>  2.1 設(shè)計(jì)原理</b></p><p>  本實(shí)驗(yàn)硬件分為兩部分:61板和LED顯示模塊。</p><p>  2.1.1 61板的基本原理</p><p>  S

4、PCE061A精簡(jiǎn)開(kāi)發(fā)板(簡(jiǎn)稱61板),是以凌陽(yáng)16位單片機(jī)SPCE061A為核心的精簡(jiǎn)開(kāi)發(fā)-仿真-實(shí)驗(yàn)板,大小相當(dāng)于一張撲克牌,是“凌陽(yáng)科技大學(xué)計(jì)劃”專為大學(xué)生、電子愛(ài)好者等進(jìn)行電子實(shí)習(xí)、課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)、電子制作及電子競(jìng)賽所設(shè)計(jì)的,也可作為單片機(jī)項(xiàng)目初期研發(fā)使用。</p><p>  61板除了具備單片機(jī)最小系統(tǒng)電路外,還包括有電源電路、音頻電路(含Mic輸入部分和DAC音頻輸出部分)、復(fù)位電路等,采用電池

5、供電,方便學(xué)生隨身攜帶?。?!使學(xué)生在掌握軟件的同時(shí),熟悉單片機(jī)硬件的設(shè)計(jì)制作,鍛煉學(xué)生的動(dòng)手能力,也為單片機(jī)學(xué)習(xí)者和開(kāi)發(fā)者創(chuàng)造了一個(gè)良好的學(xué)習(xí)條件和開(kāi)發(fā)新產(chǎn)品的機(jī)會(huì)! </p><p>  61板上有調(diào)試器接口(Probe接口)以及下載線(EZ_Probe)接口,分別可接凌陽(yáng)科技的在線調(diào)試器、簡(jiǎn)易下載線,配合unSP IDE,可方便地在板上實(shí)現(xiàn)程序的下載、在線仿真調(diào)試。 </p><p>

6、  61板上的主要功能模塊如下: </p><p><b>  ★電源輸入模塊; </b></p><p>  ★音頻電路(包含Mic輸入、DAC音頻功放輸出)模塊; </p><p><b>  ★按鍵模塊; </b></p><p>  ★I/O端口接口模塊; </p><p

7、>  ★調(diào)試、下載接口模塊;</p><p>  圖2.1 SPCE061A單片機(jī)的內(nèi)部結(jié)構(gòu)框圖</p><p>  2.1.2 LED顯示原理</p><p>  LED顯示原理: 靜態(tài)顯示就是顯示驅(qū)動(dòng)電路具有輸出鎖存功能,單片機(jī)將所要顯示的數(shù)據(jù)送出后就不再管,直到下一次顯示數(shù)據(jù)需要更新時(shí)再傳送一次新數(shù)據(jù),顯示數(shù)據(jù)穩(wěn)定,占用很少的CPU時(shí)間。 </p&

8、gt;<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)態(tài)顯示雖然有閃爍感,占用的CPU時(shí)間多,但使用的硬件少,能節(jié)省線路板空間。</p><p>  基本的半導(dǎo)體數(shù)碼管是由七個(gè)條狀發(fā)光二極管芯片排列而成的,可實(shí)現(xiàn)0~9的顯示。&

9、lt;/p><p>  LED數(shù)碼管是由發(fā)光二級(jí)管顯示字段組成的顯示器,有8段和“米”字段之分,這種顯示器有共陽(yáng)級(jí)和共陰極兩種。所謂共陽(yáng)方式 是指筆畫(huà)顯示器各段發(fā)光管的陽(yáng)極(即P區(qū))是公共 的,而陰極互相隔離。所謂共陰方式是筆畫(huà)顯示器各段發(fā)光管的陰極(即N區(qū))是公共的,而陽(yáng)極是互相隔離的。</p><p>  圖2.2 數(shù)碼管排列圖</p>

10、<p><b>  2.2 設(shè)計(jì)方案</b></p><p>  方案一:基于61板的99秒秒表設(shè)計(jì)</p><p>  這種設(shè)計(jì)方法需要61板與LED模塊相連來(lái)實(shí)現(xiàn)99秒秒表。</p><p>  方案二:基于AT89C51的99秒秒表設(shè)計(jì)</p><p>  這種設(shè)計(jì)方法需要AT89C51芯片與鍵輸入模塊

11、、時(shí)鐘分頻模塊、控制模塊、秒表計(jì)時(shí)模塊、時(shí)間存儲(chǔ)模塊以及顯示譯碼模塊相連來(lái)實(shí)現(xiàn)。</p><p>  方案比較:方案二所需模塊較多,連線較復(fù)雜;而方案一只需61板與LED顯示模塊,比較簡(jiǎn)單,容易實(shí)現(xiàn)。所以選用方案一。</p><p><b>  第三章硬件設(shè)計(jì)</b></p><p><b>  3.1 總體設(shè)計(jì)</b>&

12、lt;/p><p>  本硬件裝置將實(shí)現(xiàn)0-99的計(jì)數(shù),每一秒鐘,計(jì)數(shù)器將加1,在LED數(shù)碼管上顯示當(dāng)前計(jì)數(shù)值,并可用61板的按鍵控制計(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í)和歸零

13、,功能分配如下表3.1所示:</p><p>  表3.1在61板上的按鍵功能分配</p><p>  采用凌陽(yáng)大學(xué)計(jì)劃的LED鍵盤(pán)模組和61板搭配可以很容易的完成這個(gè)課程設(shè)計(jì)的題目。它的連結(jié)圖如圖所示,IOB的低八位控制數(shù)碼管顯示段位,高八位控制點(diǎn)亮哪一個(gè)數(shù)碼管。如下圖3.1所示:</p><p>  圖3.1 LED鍵盤(pán)模組和61板連接圖</p>

14、<p><b>  3.2 單元設(shè)計(jì)</b></p><p>  該硬件設(shè)計(jì)主要分為兩個(gè)單元:SPCE061A板和LED顯示板。下面分別對(duì)兩個(gè)單元的硬件設(shè)計(jì)進(jìn)行說(shuō)明。</p><p>  3.2.1 61板硬件設(shè)計(jì)</p><p>  首先自己動(dòng)手焊好給定的SPCE061A電路板。了解板上各部分的結(jié)構(gòu)。其硬件結(jié)構(gòu)框圖如下圖3.1所示;

15、各部分硬件說(shuō)明如下表3.1所示:</p><p>  圖3.2 61板硬件結(jié)構(gòu)框圖</p><p>  表3.2 61板各部分硬件說(shuō)明</p><p>  3.2.2 LED硬件設(shè)計(jì)</p><p>  兩位數(shù)的顯示采用的是一個(gè)2位共陰極LED 數(shù)碼(LG5621AH),連接方法是SPCE061A的IOB0-IOB6接LED焊接板的A-G,小

16、數(shù)顯示部分可以省略不要;IOB8-IOB9分別接LED的位選COM1、COM2。LED與SPCE061A的引腳連接如表3.3。</p><p>  圖3.3 LED顯示部分電路原理圖</p><p>  表3.3 LED引腳連接</p><p><b>  第四章軟件設(shè)計(jì)</b></p><p><b>  4

17、.1 總體設(shè)計(jì)</b></p><p>  程序主流程主要完成鍵盤(pán)掃描、計(jì)時(shí)處理、鍵值分支控制的任務(wù),流程圖如圖4.1所示:</p><p>  圖4.1主程序流程圖</p><p><b>  4.2 單元設(shè)計(jì)</b></p><p>  根據(jù)設(shè)計(jì)要求的功能,程序主要分為三個(gè)單元,即:</p>

18、<p>  (1)計(jì)時(shí)顯示部分;</p><p><b> ?。?)秒計(jì)時(shí)部分;</b></p><p> ?。?)按鍵控制部分。</p><p>  4.2.1 計(jì)時(shí)顯示部分</p><p>  顯示部分是在IRQ4的1KHz中斷中控制顯示的,采用動(dòng)態(tài)掃描的方式,1KHz的時(shí)基中斷每1ms進(jìn)一次中斷,在中斷

19、中對(duì)2ms計(jì)數(shù)器i進(jìn)行累加,當(dāng)i從0累加到2時(shí),則剛好為2ms,此時(shí)更新一個(gè)位的LED顯示,并對(duì)i進(jìn)行清零;當(dāng)下一次累計(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ù)即可。具體流程圖如下圖4.2所示。</p><p>  4.2.2 秒計(jì)時(shí)部分</p>

20、<p>  秒計(jì)時(shí)采用IRQ5的2Hz時(shí)基中斷進(jìn)行計(jì)時(shí),首先判斷是否是2HZ,不是2HZ直接結(jié)束。是2HZ計(jì)時(shí)器自加1,加1后結(jié)束,當(dāng)計(jì)時(shí)器自加大于等于200時(shí),計(jì)時(shí)器清零。流程圖如下圖4.3所示。</p><p>  4.2.3 按鍵控制部分</p><p>  鍵盤(pán)輸入利用61板自帶的三個(gè)按鍵,輸入的端口為IOA0—IOA2。</p><p>  圖

21、4.2 IRQ4 1KHz時(shí)基中斷流程圖 圖4.3 IRQ5 2Hz時(shí)基中斷流程圖 </p><p><b>  4.3 源程序</b></p><p> ?。?)主程序:main.c</p><p>  int iShow[2],key=0;</p><p>  int iCounter=0;

22、//在2Hz中斷里面計(jì)時(shí)</p><p>  #define P_Watchdog_Clear(volatile unsigned int *) 0x7012</p><p>  //以下是鍵盤(pán)掃描程序,在key.asm中定義</p><p>  extern void F_Key_Scan_Initial(void);</p><p> 

23、 extern void F_Key_Scan_ServiceLoop(void);</p><p>  extern unsigned int SP_GetCh(void);</p><p>  int main(void)</p><p><b>  {</b></p><p>  int i,j,iCounter1

24、;</p><p>  F_IrqInti();//中斷初始化</p><p>  F_Key_Scan_Initial();//鍵盤(pán)初始化,在key.asm中定義</p><p><b>  while(1)</b></p><p><b>  {</b></p>&

25、lt;p>  key = SP_GetCh();//按鍵掃描,并獲取鍵值,在key.asm中定義</p><p>  switch(key)</p><p><b>  { </b></p><p>  case 0x0001://按鍵1則開(kāi)始計(jì)數(shù)</p><p>  F_Irq5_2HzOn

26、();//打開(kāi)2Hz中斷,則開(kāi)始計(jì)數(shù)</p><p><b>  break;</b></p><p>  case 0x0002://按鍵2則停止計(jì)數(shù)</p><p>  F_Irq5_2HzOff();//關(guān)掉2Hz中斷,即停止計(jì)數(shù)</p><p><b>  break;</b>

27、</p><p>  case 0x0004://按鍵3則計(jì)數(shù)器清零</p><p>  iCounter=0;//</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  break;

28、 </p><p><b>  }</b></p><p>  //計(jì)算要顯示的值,顯示程序?qū)懺谥袛嘀?,以便播放語(yǔ)音時(shí)能及時(shí)更新顯示數(shù)據(jù)</p><p>  iCounter1 = iCounter>>1;</p><p>  iShow[0] = (iCounter1/10)%10;</p&

29、gt;<p>  iShow[1] = iCounter1%10; </p><p>  *P_Watchdog_Clear = 0x0001;//清看門(mén)狗</p><p>  F_Key_Scan_ServiceLoop();//鍵盤(pán)掃描的后臺(tái)循環(huán)服務(wù)程序,在key.asm中定義</p><p><b>  }</b&

30、gt;</p><p><b>  }</b></p><p>  (2) 鍵盤(pán)掃描子程序:key.asm</p><p>  .DEFINEP_IOA_Data 0x7000 // Write Data into data register and read from IOA pad</p><p

31、>  .DEFINE P_IOA_Buffer 0x7001 // Write Data into buffer register and read from buffer register</p><p>  .DEFINE P_IOA_Dir 0x7002 // Direction vector for IOA</p>&l

32、t;p>  .DEFINE P_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_

33、IOB_Data 0x7005 // 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 registe

34、r</p><p>  .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

35、 0x7012</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>

36、<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>

37、;<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_Buffe

38、r</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 numb

39、ers</p><p>  //////////////////////////////////////////////////////////////////</p><p>  // RAM Define Area</p><p>  ////////////////////////////////////////////////////////

40、//////////</p><p><b>  .RAM</b></p><p>  .VARR_DebounceReg;//for keyboard scan</p><p>  .DEFINE C_DebounceCnt0x0009;</p><p>  .VARR_KeyStrobe;

41、//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 of key

42、</p><p><b>  .CODE</b></p><p>  //////////////////////////////////////////////////////////////////</p><p>  // Function: Initialization for F_Key_Scan_ServiceLoop</p&

43、gt;<p>  ////////////////////////////////////////////////////////////////// </p><p>  _F_Key_Scan_Initial: </p><p>  F_Key_Scan_Initial:</p><p>  r1 = [Port_Key_A]</p&g

44、t;<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><p>

45、;  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>  [R_

46、Keyflag] = r1; //</p><p>  [R_Keyoll] = r1;//</p><p>  [R_KeyStrobe] = r1;</p><p>  //r1 = C_DebounceCnt;//</p><p>  //[R_DebounceCnt] = r1; //reset de

47、bounce counter</p><p><b>  retf;</b></p><p>  //////////////////////////////////////////////////////////////////</p><p>  // Function: Get Key code from key pad(8 x 1 ke

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

49、</p><p>  // | | | |</p><p>  // IOA.15 IOA.8</p><p>  // Note: 1)link F_DebounceCntDown is necessary </p><p>  // Destory regi

50、ster: r1, r2 </p><p>  ////////////////////////////////////////////////////////////////// </p><p>  _F_Key_Scan_ServiceLoop:</p><p>  F_Ke

51、y_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//非零轉(zhuǎn)

52、</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>  L_Key

53、Low:</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_KeyCou

54、nter] = 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:</p

55、><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</b&g

56、t;</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_Debou

57、nceCnt //比較</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_KeyHi

58、ght_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><

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

60、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>

61、<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//</

62、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//....end

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

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

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

66、// 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;</b&g

67、t;</p><p>  //=================================================================//</p><p>  //name:F_KeyScan</p><p>  //for user: C function unsigned int F_KeyScan(void)</p>&

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

69、=====//</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>  jnz

70、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</p>

71、<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_Exit</

72、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_ScanBegin

73、//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_KeyNumber //8&

74、lt;/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:</p>&l

75、t;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_MASK</p>

76、;<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></p>&l

77、t;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><p&g

78、t;  [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><p>  //

79、======================================================================================== </p><p>  // End of key.asm</p><p>  //========================================================<

80、;/p><p> ?。?)中斷處理子程序:ISR.asm</p><p>  #define P_INT_Clear (volatile unsigned int *)0x7011</p><p>  #define P_INT_Ctrl(volatile unsigned int *)0x7010 </p><p&

81、gt;  #define ClearWDog (*((volatile unsigned char *) 0x7012))=1</p><p>  extern struct clock *clkset;</p><p>  extern struct clock a;</p><p>  #include "hardware.h"</

82、p><p>  unsigned int i=0,j=0,k=0,sensor2=0,flag,minute=0,guest=0;</p><p>  extern PlayFlag,iShow[4],key,iCounter;</p><p>  void BREAK(void) __attribute__ ((ISR));</p><p> 

83、 void BREAK(void)</p><p><b>  {</b></p><p><b>  }</b></p><p>  void FIQ(void) __attribute__ ((ISR));</p><p>  void FIQ(void)</p><p>

84、;<b>  {</b></p><p>  if(*P_INT_Ctrl==0x2000)</p><p><b>  {</b></p><p>  *P_INT_Clear=0x2000;</p><p><b>  }</b></p><p>&

85、lt;b>  }</b></p><p>  void IRQ0(void) __attribute__ ((ISR));</p><p>  void IRQ0(void)</p><p><b>  {</b></p><p><b>  }</b></p>&l

86、t;p>  void IRQ1(void) __attribute__ ((ISR));</p><p>  void IRQ1(void)</p><p><b>  {</b></p><p><b>  }</b></p><p>  void IRQ2(void) __attribut

87、e__ ((ISR));</p><p>  void IRQ2(void)</p><p><b>  {</b></p><p><b>  }</b></p><p>  void IRQ3(void) __attribute__ ((ISR));</p><p>  

88、void IRQ3(void)</p><p><b>  {</b></p><p><b>  }</b></p><p>  void IRQ4(void) __attribute__ ((ISR));</p><p>  void IRQ4(void)</p><p>

89、;<b>  {</b></p><p><b>  i++;</b></p><p><b>  if(i>=2)</b></p><p><b>  { </b></p><p>  F_numLED_Ctrl(j,iShow[j]);&

90、lt;/p><p><b>  j++;</b></p><p>  if(j==2) j=0;</p><p>  i=0; </p><p><b>  }</b></p><p>  *P_INT_Clear=0x0040;</p><p>

91、;<b>  }</b></p><p>  void IRQ5(void) __attribute__ ((ISR));</p><p>  void IRQ5(void)</p><p><b>  {</b></p><p>  if(*P_INT_Ctrl&0x0004)</p

92、><p><b>  {</b></p><p>  *P_INT_Clear=0x0004;</p><p>  iCounter++;//計(jì)數(shù)</p><p>  if(iCounter>=200) iCounter=0;//超出范圍則清零</p><p><b>

93、  }</b></p><p><b>  }</b></p><p>  void IRQ6(void) __attribute__ ((ISR));</p><p>  void IRQ6(void)</p><p><b>  {</b></p><p>&

94、lt;b>  }</b></p><p>  void IRQ7(void) __attribute__ ((ISR));</p><p>  void IRQ7(void)</p><p><b>  {</b></p><p><b>  }</b></p>&l

95、t;p> ?。?)SPCE061A內(nèi)部硬件資源定義: Hardware.asm</p><p>  此程序?qū)儆谕獠空{(diào)用程序。</p><p> ?。?)動(dòng)態(tài)顯示子程序: NumLED.c</p><p>  #define ClearWDog (*((volatile unsigned char *) 0x7012))=1</p><p

96、>  #defineP_IOA_Data (volatile unsigned int *)0x7000 </p><p>  #define P_IOA_Buffer (volatile unsigned int *)0x7001</p><p>  #define P_IOA_Dir (volatile unsigned int *)0x7002<

97、;/p><p>  #define P_IOA_Attrib (volatile unsigned int *)0x7003</p><p>  #define P_IOA_Latch (volatile unsigned int *)0x7004</p><p>  #define P_IOB_Data(volatile unsigned int

98、*)0x7005 </p><p>  #define P_IOB_Buffer(volatile unsigned int *)0x7006 </p><p>  #define P_IOB_Dir(volatile unsigned int *)0x7007 </p><p>  #define P_IOB_Attrib(volat

99、ile unsigned int *)0x7008 </p><p>  #define bitset(var,bitno) ((var)|=(1<<(bitno)))</p><p>  #define bitclr(var,bitno) ((var)&=((1<<bitno)^0xffff)) </p><p

100、>  const int ciNum[10]={0x3f00,0x0600,0x5b00,0x4f00, 0x6600,0x6d00,0x7c00,0x0700,0x7f00,0x6f00}; </p><p>  //const int ciNum[10]={0x003f,0x0086,0x00db,0x00cf, 0x00e6,0x00ed,0x00fc,0x0087,0x00ff,0x00e

101、f}; </p><p>  //========================================================================================</p><p>  //函數(shù)名稱 : F_numLED_Ctrl(int iBit,int iNum)</p><p>  //描述 :

102、 控制數(shù)碼管顯示</p><p>  //入口參數(shù) : iBit:選擇第幾位亮;iNum:顯示數(shù)字幾</p><p>  // IOB2--IOB5 選擇第幾位亮</p><p>  // IOB8---IOB15 顯示數(shù)字</p><p>  //出口 : 無(wú)<

103、;/p><p>  //========================================================================================</p><p>  void F_numLED_Ctrl(int iBit,int iNum)</p><p><b>  {</b></p&

104、gt;<p>  int i,j,k=0;</p><p>  *P_IOB_Dir=0x00ff|*P_IOB_Dir;</p><p>  *P_IOB_Attrib=0x00ff|*P_IOB_Attrib;</p><p>  *P_IOB_Data=0xFF00&*P_IOB_Data;</p><p>  *

105、P_IOB_Data=0;</p><p>  *P_IOB_Data=(0x1<<iBit);</p><p>  *P_IOB_Dir=0xff00|*P_IOB_Dir;</p><p>  *P_IOB_Attrib=0xff00|*P_IOB_Attrib;</p><p>  *P_IOB_Data=0x00ff&am

106、p;*P_IOB_Data;</p><p>  *P_IOB_Data=ciNum[iNum]|*P_IOB_Buffer;</p><p>  ClearWDog;</p><p><b>  }</b></p><p>  (6)中斷設(shè)置子程序: boot.asm</p><p>  .in

107、clude hardware.inc</p><p>  .define P_INT_Ctrl_New0x702D</p><p><b>  .code</b></p><p>  .public _F_IrqInti</p><p>  _F_IrqInti: .proc</p><p>

108、;  push r1,r5 to [sp]</p><p>  r1 = 0x0040 //開(kāi)1kHZ中斷</p><p>  r2=[R_InterruptStatus]</p><p><b>  r1=r1|r2</b></p><p>  [R_InterruptStatus]=r1</p>

109、<p>  [P_INT_Ctrl] = r1</p><p><b>  IRQ ON</b></p><p><b>  FIQ off</b></p><p>  popr1,r5 from [sp];</p><p><b>  retf</b></p

110、><p><b>  .endp</b></p><p>  .public _F_Irq5_2HzOff</p><p>  _F_Irq5_2HzOff: .proc</p><p>  push r1,r5 to [sp]</p><p>  r1 = [P_INT_Ctrl_New] /

111、/開(kāi)1kHZ中斷側(cè)以及2Hz中斷</p><p>  // r2=[R_InterruptStatus]</p><p>  r1&=~0x0004</p><p>  [R_InterruptStatus]=r1</p><p>  [P_INT_Ctrl] = r1</p><p><b>  

112、IRQ ON</b></p><p><b>  FIQ off</b></p><p>  popr1,r5 from [sp];</p><p><b>  retf</b></p><p><b>  .endp</b></p><p&

113、gt;  .public _F_Irq5_2HzOn</p><p>  _F_Irq5_2HzOn: .proc</p><p>  push r1,r5 to [sp]</p><p>  r1 = [P_INT_Ctrl_New] //開(kāi)1kHZ中斷側(cè)以及2Hz中斷</p><p>  r1|=0x0004</p>

114、<p>  [R_InterruptStatus]=r1</p><p>  [P_INT_Ctrl] = r1</p><p><b>  IRQ ON</b></p><p><b>  FIQ off</b></p><p>  popr1,r5 from [sp];</p&

115、gt;<p><b>  retf</b></p><p><b>  .endp</b></p><p><b>  第五章、系統(tǒng)調(diào)試</b></p><p><b>  5.1 硬件調(diào)試</b></p><p>  測(cè)試一些重要引腳上的

116、電壓是否是正常的工作電壓,主要有:</p><p>  (1).電源電壓5V或接近5V。</p><p>  (2).VDDH、VDD引腳上的電壓分別是3.5v和3v。</p><p><b>  1.電源部分:</b></p><p>  用萬(wàn)用表分別測(cè)試以下12個(gè)點(diǎn)的電壓</p><p>&l

117、t;b>  調(diào)試1:</b></p><p>  目的:測(cè)試61板電路源和地是否有短路。</p><p>  步驟:用萬(wàn)用表測(cè)量J10的兩腳的電阻是否為零。</p><p><b>  調(diào)試2:</b></p><p>  目的:測(cè)試61板電源部分器件是否工作正常。</p><p&g

118、t;  對(duì)電源部分一些器件引腳的電壓進(jìn)行測(cè)試,如果電壓正常,則進(jìn)行下一步的測(cè)試,不正常則分析它的原因。</p><p><b>  調(diào)試3:</b></p><p>  目的:測(cè)試61板上各器件電源供電是否正常。</p><p>  步驟:測(cè)試U1的第7腳電壓——3.3v左右。</p><p>  測(cè)試U4的第20腳電壓

119、——3.3v左右。</p><p>  測(cè)試J4的第1腳電壓——3.3v左右。</p><p>  測(cè)試U2的第7、8腳電壓——4.5v左右。</p><p>  測(cè)試J6、J7、J8、J9的+端電壓——4.5v左右。</p><p><b>  2.鍵盤(pán)部分:</b></p><p>  目的:

120、測(cè)試鍵盤(pán)輸入是否正確。</p><p>  條件:U1 U2 U4 芯片座中不安放元件:給61板通電,萬(wàn)用表選擇電壓檔,利用萬(wàn)用表的負(fù)極接板子的地,萬(wàn)用表筆的正端分別檢測(cè)接IOA0、IOA1、IOA2。</p><p>  步驟:用萬(wàn)用表筆的正端放在IOA0上時(shí),按下KEY1鍵,讀取萬(wàn)用表上的電壓值并記錄,之后用同樣的方法分別檢測(cè)KEY2、KEY3電壓值。</p><p

121、><b>  5.2 軟件調(diào)試</b></p><p>  1、下載程序時(shí)正確連接下載線及短接冒,以防程序無(wú)法正常下載或下載時(shí)造成61芯片的損壞;</p><p>  2、進(jìn)入IDE程序時(shí)打開(kāi)file-open查找自己已編成程序;</p><p>  3、點(diǎn)擊Build,進(jìn)行rebuild all</p><p>

122、  4、無(wú)錯(cuò)誤后點(diǎn)擊下載。將程序下載至61芯片。</p><p><b>  5.3 總體聯(lián)調(diào)</b></p><p>  根據(jù)系統(tǒng)的功能現(xiàn)選擇61板作為單片機(jī)控制處理部分,利用2位LED作為顯示部分,而按鍵采用61板上自帶的三個(gè)按鍵,如下圖5.1所示。</p><p>  首先用兩根排線把61板和LED顯示板連接起來(lái),用下載線連接至電腦上,然

123、后下載程序,當(dāng)61板和LED顯示板程序下載好后,兩個(gè)數(shù)碼管燈亮,則進(jìn)行如下操作就會(huì)有如下情況:</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><p><b>  按KEY3歸零;</b></p><p>&

124、lt;b>  圖5.1 系統(tǒng)框圖</b></p><p>  第六章、結(jié)論分析及體會(huì)</p><p><b>  6.1 結(jié)論分析</b></p><p>  本設(shè)計(jì)應(yīng)該熟悉凌陽(yáng)十六位單片機(jī)系統(tǒng)板-61板的基本構(gòu)成, 掌握 LED數(shù)碼管原理及使用方法,掌握61板的使用方法,初步掌握 SPCE061A單片機(jī)匯編語(yǔ)言一般編程技巧,

125、初步掌握61板系統(tǒng)調(diào)試的一般步驟及方法。設(shè)計(jì)結(jié)構(gòu)現(xiàn)實(shí):開(kāi)機(jī)時(shí)數(shù)碼管顯示為00,每一秒鐘計(jì)數(shù)器自動(dòng)加一,按KEY1鍵開(kāi)始計(jì)時(shí),按KEY2鍵停止計(jì)時(shí)并現(xiàn)實(shí)當(dāng)前數(shù)值,按KEY3鍵歸零。</p><p>  1.在設(shè)計(jì)中我遇到了數(shù)碼管各腳個(gè)借口不知道如何連接和對(duì)單片機(jī)匯編語(yǔ)言不熟悉程序編寫(xiě)困難等問(wèn)題。</p><p>  2.我采用的方法是用萬(wàn)用表逐一測(cè)試管腳確定abcdefg腳的編號(hào)和通過(guò)光盤(pán)盒

126、網(wǎng)站中相關(guān)資料進(jìn)行學(xué)習(xí)。</p><p>  3.此設(shè)計(jì)的優(yōu)點(diǎn)是思路清晰、連接簡(jiǎn)單。缺點(diǎn)是LED引腳確認(rèn)麻煩。</p><p>  4.我建議在LED引腳應(yīng)先標(biāo)志出來(lái),增加單片機(jī)軟件程序智能的對(duì)進(jìn)制進(jìn)行轉(zhuǎn)換,除去繁冗的進(jìn)制計(jì)算</p><p><b>  6.2 設(shè)計(jì)體會(huì) </b></p><p>  通過(guò)這次課程設(shè)計(jì),

127、我對(duì)如何完成一項(xiàng)實(shí)際的計(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)富。或許大學(xué)生活中的片斷隨著歲月的流逝難免被遺忘,但是這段課程設(shè)計(jì)的日子相信仍會(huì)是記憶深刻,它作為我們走向社會(huì)的第一步,承載了即將面對(duì)現(xiàn)實(shí)和挑戰(zhàn)的心情,必將難忘。</p>&

128、lt;p>  本次課程設(shè)計(jì)對(duì)我們很重要,是我們電子系學(xué)生實(shí)踐中的重要環(huán)節(jié)。在以前我們學(xué)的都是一些理論知識(shí)。這一次的實(shí)習(xí)正如老師所講,沒(méi)有多少東西要我們?nèi)ハ?,更多的是要我們?nèi)プ?,好多東西看起來(lái)十分簡(jiǎn)單,看著電路圖都懂,但沒(méi)有親自去操作,就不會(huì)懂得理論與實(shí)踐是有很大區(qū)別的??匆粋€(gè)東西簡(jiǎn)單,但在實(shí)際操作中就是有許多要注意的地方,有些東西也與你的想象不一樣,我們這次的課程設(shè)計(jì)就是要我們跨過(guò)這道實(shí)際和理論之間的鴻溝。</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)論