版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 99秒秒表課程設(shè)計
- 基于61板的99秒秒表課程設(shè)計
- 課程設(shè)計--60秒秒表
- 單片機(jī)課程設(shè)計---60秒秒表
- 課程設(shè)計---單片機(jī)__60秒秒表
- 99秒馬表課程設(shè)計
- 基于at89s52單片機(jī)的10秒秒表課程設(shè)計
- 99秒馬表課程設(shè)計說明書
- eda數(shù)字秒課程設(shè)計
- 00-60秒表單片機(jī)課程設(shè)計說明書
- 017、99秒馬表設(shè)計
- 課程設(shè)計---60秒倒計時
- 24秒計時器課程設(shè)計
- 24秒倒計時課程設(shè)計
- 30秒定時器課程設(shè)計報告
- 課程設(shè)計---籃球30秒計時器
- 課程設(shè)計--基于at89c51的99秒倒計時器設(shè)計
- 課程設(shè)計報告“9秒倒計時設(shè)計”
- 課程設(shè)計--基于at89c51的99秒倒計時器設(shè)計
- 數(shù)電課程設(shè)計---30秒計時器
評論
0/150
提交評論