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