版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 第一章設(shè)計目的及要求</p><p><b> 1.1 設(shè)計目的</b></p><p> 隨著單片機應(yīng)用的日益廣泛,在校學(xué)生加強對單片機的認(rèn)識和動手能力,已經(jīng)是非常重要的一項鍛煉。課程設(shè)計就是為加強實踐機會、培養(yǎng)學(xué)生動手能力的一個重要環(huán)節(jié),將理論知識與實際聯(lián)系起來的一個關(guān)鍵機會。</p><p><b>
2、 1.2 設(shè)計要求 </b></p><p> 1. 熟悉凌陽十六位單片機系統(tǒng)板-61板的基本構(gòu)成。 </p><p> 2. 掌握LED數(shù)碼管原理及使用方法。 </p><p> 3. 掌握61板的使用方法。 </p><p> 4. 初步掌握SPCE061A單片機匯編語言一般編程技巧。</p><p
3、> 5. 初步掌握61板系統(tǒng)調(diào)試的一般步驟及方法。</p><p> 第二章設(shè)計原理及方案</p><p><b> 2.1 設(shè)計原理</b></p><p> 本實驗硬件分為兩部分:61板和LED顯示模塊。</p><p> 2.1.1 61板的基本原理</p><p> S
4、PCE061A精簡開發(fā)板(簡稱61板),是以凌陽16位單片機SPCE061A為核心的精簡開發(fā)-仿真-實驗板,大小相當(dāng)于一張撲克牌,是“凌陽科技大學(xué)計劃”專為大學(xué)生、電子愛好者等進(jìn)行電子實習(xí)、課程設(shè)計、畢業(yè)設(shè)計、電子制作及電子競賽所設(shè)計的,也可作為單片機項目初期研發(fā)使用。</p><p> 61板除了具備單片機最小系統(tǒng)電路外,還包括有電源電路、音頻電路(含Mic輸入部分和DAC音頻輸出部分)、復(fù)位電路等,采用電池
5、供電,方便學(xué)生隨身攜帶?。。∈箤W(xué)生在掌握軟件的同時,熟悉單片機硬件的設(shè)計制作,鍛煉學(xué)生的動手能力,也為單片機學(xué)習(xí)者和開發(fā)者創(chuàng)造了一個良好的學(xué)習(xí)條件和開發(fā)新產(chǎn)品的機會! </p><p> 61板上有調(diào)試器接口(Probe接口)以及下載線(EZ_Probe)接口,分別可接凌陽科技的在線調(diào)試器、簡易下載線,配合unSP IDE,可方便地在板上實現(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單片機的內(nèi)部結(jié)構(gòu)框圖</p><p> 2.1.2 LED顯示原理</p><p> LED顯示原理: 靜態(tài)顯示就是顯示驅(qū)動電路具有輸出鎖存功能,單片機將所要顯示的數(shù)據(jù)送出后就不再管,直到下一次顯示數(shù)據(jù)需要更新時再傳送一次新數(shù)據(jù),顯示數(shù)據(jù)穩(wěn)定,占用很少的CPU時間。 </p&
8、gt;<p> 動態(tài)顯示需要CPU時刻對顯示器件進(jìn)行數(shù)據(jù)刷新,顯示數(shù)據(jù)有閃爍感,占用的CPU時間多。這兩種顯示方式各有利弊;靜態(tài)顯示雖然數(shù)據(jù)穩(wěn)定,占用很少的CPU時間,但每個顯示單元都需要單獨的顯示驅(qū)動電路,使用的硬件較多;動態(tài)顯示雖然有閃爍感,占用的CPU時間多,但使用的硬件少,能節(jié)省線路板空間。</p><p> 基本的半導(dǎo)體數(shù)碼管是由七個條狀發(fā)光二極管芯片排列而成的,可實現(xiàn)0~9的顯示。&
9、lt;/p><p> LED數(shù)碼管是由發(fā)光二級管顯示字段組成的顯示器,有8段和“米”字段之分,這種顯示器有共陽級和共陰極兩種。所謂共陽方式 是指筆畫顯示器各段發(fā)光管的陽極(即P區(qū))是公共 的,而陰極互相隔離。所謂共陰方式是筆畫顯示器各段發(fā)光管的陰極(即N區(qū))是公共的,而陽極是互相隔離的。</p><p> 圖2.2 數(shù)碼管排列圖</p>
10、<p><b> 2.2 設(shè)計方案</b></p><p> 方案一:基于61板的99秒秒表設(shè)計</p><p> 這種設(shè)計方法需要61板與LED模塊相連來實現(xiàn)99秒秒表。</p><p> 方案二:基于AT89C51的99秒秒表設(shè)計</p><p> 這種設(shè)計方法需要AT89C51芯片與鍵輸入模塊
11、、時鐘分頻模塊、控制模塊、秒表計時模塊、時間存儲模塊以及顯示譯碼模塊相連來實現(xiàn)。</p><p> 方案比較:方案二所需模塊較多,連線較復(fù)雜;而方案一只需61板與LED顯示模塊,比較簡單,容易實現(xiàn)。所以選用方案一。</p><p><b> 第三章硬件設(shè)計</b></p><p><b> 3.1 總體設(shè)計</b>&
12、lt;/p><p> 本硬件裝置將實現(xiàn)0-99的計數(shù),每一秒鐘,計數(shù)器將加1,在LED數(shù)碼管上顯示當(dāng)前計數(shù)值,并可用61板的按鍵控制計數(shù)的起始,以及歸零。具體要求如下:</p><p> 1. 開機時數(shù)碼管顯示00。</p><p> 2. 每一秒鐘,計數(shù)器自動加1。</p><p> 3. 按鍵控制計數(shù),分別控制開始計時、停止計時和歸零
13、,功能分配如下表3.1所示:</p><p> 表3.1在61板上的按鍵功能分配</p><p> 采用凌陽大學(xué)計劃的LED鍵盤模組和61板搭配可以很容易的完成這個課程設(shè)計的題目。它的連結(jié)圖如圖所示,IOB的低八位控制數(shù)碼管顯示段位,高八位控制點亮哪一個數(shù)碼管。如下圖3.1所示:</p><p> 圖3.1 LED鍵盤模組和61板連接圖</p>
14、<p><b> 3.2 單元設(shè)計</b></p><p> 該硬件設(shè)計主要分為兩個單元:SPCE061A板和LED顯示板。下面分別對兩個單元的硬件設(shè)計進(jìn)行說明。</p><p> 3.2.1 61板硬件設(shè)計</p><p> 首先自己動手焊好給定的SPCE061A電路板。了解板上各部分的結(jié)構(gòu)。其硬件結(jié)構(gòu)框圖如下圖3.1所示;
15、各部分硬件說明如下表3.1所示:</p><p> 圖3.2 61板硬件結(jié)構(gòu)框圖</p><p> 表3.2 61板各部分硬件說明</p><p> 3.2.2 LED硬件設(shè)計</p><p> 兩位數(shù)的顯示采用的是一個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è)計</b></p><p><b> 4
17、.1 總體設(shè)計</b></p><p> 程序主流程主要完成鍵盤掃描、計時處理、鍵值分支控制的任務(wù),流程圖如圖4.1所示:</p><p> 圖4.1主程序流程圖</p><p><b> 4.2 單元設(shè)計</b></p><p> 根據(jù)設(shè)計要求的功能,程序主要分為三個單元,即:</p>
18、<p> ?。?)計時顯示部分;</p><p><b> ?。?)秒計時部分;</b></p><p> ?。?)按鍵控制部分。</p><p> 4.2.1 計時顯示部分</p><p> 顯示部分是在IRQ4的1KHz中斷中控制顯示的,采用動態(tài)掃描的方式,1KHz的時基中斷每1ms進(jìn)一次中斷,在中斷
19、中對2ms計數(shù)器i進(jìn)行累加,當(dāng)i從0累加到2時,則剛好為2ms,此時更新一個位的LED顯示,并對i進(jìn)行清零;當(dāng)下一次累計到2ms時,則會再更新顯示下一位LED數(shù)碼管,當(dāng)更新到最后一位時,返回重第一位開始更新;依此循環(huán)更新顯示,而更新顯示的數(shù)據(jù)保存在緩沖區(qū)當(dāng)中,用戶需要更新顯示的數(shù)據(jù)時,只需要改變對應(yīng)的緩沖區(qū)中的數(shù)據(jù)即可。具體流程圖如下圖4.2所示。</p><p> 4.2.2 秒計時部分</p>
20、<p> 秒計時采用IRQ5的2Hz時基中斷進(jìn)行計時,首先判斷是否是2HZ,不是2HZ直接結(jié)束。是2HZ計時器自加1,加1后結(jié)束,當(dāng)計時器自加大于等于200時,計時器清零。流程圖如下圖4.3所示。</p><p> 4.2.3 按鍵控制部分</p><p> 鍵盤輸入利用61板自帶的三個按鍵,輸入的端口為IOA0—IOA2。</p><p> 圖
21、4.2 IRQ4 1KHz時基中斷流程圖 圖4.3 IRQ5 2Hz時基中斷流程圖 </p><p><b> 4.3 源程序</b></p><p> (1)主程序:main.c</p><p> int iShow[2],key=0;</p><p> int iCounter=0;
22、//在2Hz中斷里面計時</p><p> #define P_Watchdog_Clear(volatile unsigned int *) 0x7012</p><p> //以下是鍵盤掃描程序,在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();//鍵盤初始化,在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則開始計數(shù)</p><p> F_Irq5_2HzOn
26、();//打開2Hz中斷,則開始計數(shù)</p><p><b> break;</b></p><p> case 0x0002://按鍵2則停止計數(shù)</p><p> F_Irq5_2HzOff();//關(guān)掉2Hz中斷,即停止計數(shù)</p><p><b> break;</b>
27、</p><p> case 0x0004://按鍵3則計數(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> //計算要顯示的值,顯示程序?qū)懺谥袛嘀校员悴シ耪Z音時能及時更新顯示數(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;//清看門狗</p><p> F_Key_Scan_ServiceLoop();//鍵盤掃描的后臺循環(huán)服務(wù)程序,在key.asm中定義</p><p><b> }</b&
30、gt;</p><p><b> }</b></p><p> (2) 鍵盤掃描子程序: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)先級的程序</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//鍵盤優(yōu)先級而做的 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> (3)中斷處理子程序: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++;//計數(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> (5)動態(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> //出口 : 無<
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> ?。?)中斷設(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 //開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、/開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] //開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> 測試一些重要引腳上的
116、電壓是否是正常的工作電壓,主要有:</p><p> (1).電源電壓5V或接近5V。</p><p> (2).VDDH、VDD引腳上的電壓分別是3.5v和3v。</p><p><b> 1.電源部分:</b></p><p> 用萬用表分別測試以下12個點的電壓</p><p>&l
117、t;b> 調(diào)試1:</b></p><p> 目的:測試61板電路源和地是否有短路。</p><p> 步驟:用萬用表測量J10的兩腳的電阻是否為零。</p><p><b> 調(diào)試2:</b></p><p> 目的:測試61板電源部分器件是否工作正常。</p><p&g
118、t; 對電源部分一些器件引腳的電壓進(jìn)行測試,如果電壓正常,則進(jìn)行下一步的測試,不正常則分析它的原因。</p><p><b> 調(diào)試3:</b></p><p> 目的:測試61板上各器件電源供電是否正常。</p><p> 步驟:測試U1的第7腳電壓——3.3v左右。</p><p> 測試U4的第20腳電壓
119、——3.3v左右。</p><p> 測試J4的第1腳電壓——3.3v左右。</p><p> 測試U2的第7、8腳電壓——4.5v左右。</p><p> 測試J6、J7、J8、J9的+端電壓——4.5v左右。</p><p><b> 2.鍵盤部分:</b></p><p> 目的:
120、測試鍵盤輸入是否正確。</p><p> 條件:U1 U2 U4 芯片座中不安放元件:給61板通電,萬用表選擇電壓檔,利用萬用表的負(fù)極接板子的地,萬用表筆的正端分別檢測接IOA0、IOA1、IOA2。</p><p> 步驟:用萬用表筆的正端放在IOA0上時,按下KEY1鍵,讀取萬用表上的電壓值并記錄,之后用同樣的方法分別檢測KEY2、KEY3電壓值。</p><p
121、><b> 5.2 軟件調(diào)試</b></p><p> 1、下載程序時正確連接下載線及短接冒,以防程序無法正常下載或下載時造成61芯片的損壞;</p><p> 2、進(jìn)入IDE程序時打開file-open查找自己已編成程序;</p><p> 3、點擊Build,進(jìn)行rebuild all</p><p>
122、 4、無錯誤后點擊下載。將程序下載至61芯片。</p><p><b> 5.3 總體聯(lián)調(diào)</b></p><p> 根據(jù)系統(tǒng)的功能現(xiàn)選擇61板作為單片機控制處理部分,利用2位LED作為顯示部分,而按鍵采用61板上自帶的三個按鍵,如下圖5.1所示。</p><p> 首先用兩根排線把61板和LED顯示板連接起來,用下載線連接至電腦上,然
123、后下載程序,當(dāng)61板和LED顯示板程序下載好后,兩個數(shù)碼管燈亮,則進(jìn)行如下操作就會有如下情況:</p><p> 按KEY1開始計時數(shù)碼管顯示從00開始計時到99結(jié)束再從00開始循環(huán);</p><p> 按KEY2 停止計時數(shù)碼管顯示當(dāng)前數(shù)值;</p><p><b> 按KEY3歸零;</b></p><p>&
124、lt;b> 圖5.1 系統(tǒng)框圖</b></p><p> 第六章、結(jié)論分析及體會</p><p><b> 6.1 結(jié)論分析</b></p><p> 本設(shè)計應(yīng)該熟悉凌陽十六位單片機系統(tǒng)板-61板的基本構(gòu)成, 掌握 LED數(shù)碼管原理及使用方法,掌握61板的使用方法,初步掌握 SPCE061A單片機匯編語言一般編程技巧,
125、初步掌握61板系統(tǒng)調(diào)試的一般步驟及方法。設(shè)計結(jié)構(gòu)現(xiàn)實:開機時數(shù)碼管顯示為00,每一秒鐘計數(shù)器自動加一,按KEY1鍵開始計時,按KEY2鍵停止計時并現(xiàn)實當(dāng)前數(shù)值,按KEY3鍵歸零。</p><p> 1.在設(shè)計中我遇到了數(shù)碼管各腳個借口不知道如何連接和對單片機匯編語言不熟悉程序編寫困難等問題。</p><p> 2.我采用的方法是用萬用表逐一測試管腳確定abcdefg腳的編號和通過光盤盒
126、網(wǎng)站中相關(guān)資料進(jìn)行學(xué)習(xí)。</p><p> 3.此設(shè)計的優(yōu)點是思路清晰、連接簡單。缺點是LED引腳確認(rèn)麻煩。</p><p> 4.我建議在LED引腳應(yīng)先標(biāo)志出來,增加單片機軟件程序智能的對進(jìn)制進(jìn)行轉(zhuǎn)換,除去繁冗的進(jìn)制計算</p><p><b> 6.2 設(shè)計體會 </b></p><p> 通過這次課程設(shè)計,
127、我對如何完成一項實際的計劃有了進(jìn)一步的認(rèn)識,對如何加強自己的合作能力有了更進(jìn)一步的思考。通過這次課程設(shè)計,我想下學(xué)期的畢業(yè)設(shè)計會少點困難,以后在工作中也能夠有更多的經(jīng)驗好借鑒。在這段日子里,我實踐、思考、反思、總結(jié),所得收獲都已經(jīng)成為大學(xué)生涯中的寶貴財富?;蛟S大學(xué)生活中的片斷隨著歲月的流逝難免被遺忘,但是這段課程設(shè)計的日子相信仍會是記憶深刻,它作為我們走向社會的第一步,承載了即將面對現(xiàn)實和挑戰(zhàn)的心情,必將難忘。</p>&
128、lt;p> 本次課程設(shè)計對我們很重要,是我們電子系學(xué)生實踐中的重要環(huán)節(jié)。在以前我們學(xué)的都是一些理論知識。這一次的實習(xí)正如老師所講,沒有多少東西要我們?nèi)ハ?,更多的是要我們?nèi)プ?,好多東西看起來十分簡單,看著電路圖都懂,但沒有親自去操作,就不會懂得理論與實踐是有很大區(qū)別的??匆粋€東西簡單,但在實際操作中就是有許多要注意的地方,有些東西也與你的想象不一樣,我們這次的課程設(shè)計就是要我們跨過這道實際和理論之間的鴻溝。</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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 99秒秒表課程設(shè)計
- 99秒秒表課程設(shè)計
- 課程設(shè)計--60秒秒表
- 單片機課程設(shè)計---60秒秒表
- 課程設(shè)計---單片機__60秒秒表
- 基于at89s52單片機的10秒秒表課程設(shè)計
- 99秒馬表課程設(shè)計
- 99秒馬表課程設(shè)計說明書
- eda數(shù)字秒課程設(shè)計
- 課程設(shè)計--基于at89c51的99秒倒計時器設(shè)計
- 課程設(shè)計--基于at89c51的99秒倒計時器設(shè)計
- 00-60秒表單片機課程設(shè)計說明書
- 017、99秒馬表設(shè)計
- 課程設(shè)計--基于AT89C51的99秒倒計時器設(shè)計.doc
- 課程設(shè)計---60秒倒計時
- 24秒計時器課程設(shè)計
- 24秒倒計時課程設(shè)計
- 30秒定時器課程設(shè)計報告
- 課程設(shè)計---籃球30秒計時器
- 秒表課程設(shè)計-- 秒表系統(tǒng)的設(shè)計
評論
0/150
提交評論