2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  課 程 設(shè) 計 說 明 書</p><p>  題 目 </p><p>  姓 名 </p><p>  專 業(yè) </p><p&g

2、t;  班 級 </p><p>  系 (部) </p><p>  指導(dǎo)老師 </p><p><b>  目錄</b></p><p

3、><b>  摘 要1</b></p><p>  1 設(shè)計任務(wù)及要求2</p><p><b>  2 工作原理2</b></p><p>  2.1 8253簡介3</p><p>  2.28255簡介4</p><p><b>  3設(shè)計

4、思路4</b></p><p>  3.1程序功能描述4</p><p>  3.2程序流程圖5</p><p>  3.3DOS/BIOS功能調(diào)用6</p><p>  3.3.1INT 16H(鍵盤I/O中斷)6</p><p>  3.3.2INT 10H(屏幕及顯示器中斷)

5、7</p><p>  3.3.3 INT 21H(DOS系統(tǒng)功能調(diào)用)8</p><p>  4方案比較及論證8</p><p>  5 程序源代碼及注釋8</p><p>  6 運行結(jié)果分析11</p><p>  7 調(diào)試過程記錄12</p><p>  8 課程設(shè)計小結(jié)

6、13</p><p><b>  參考文獻14</b></p><p><b>  附錄15</b></p><p><b>  摘 要</b></p><p>  本文通過8255和8253來實現(xiàn)電子琴模擬,主要可以分成兩部分,分別為輸入部分和發(fā)音部分。輸入部分主要是由

7、8255和8個常開型開關(guān)來完成。發(fā)音部分由CUP通過對定時器8253的通道2進行編程,使其I/O寄存器接收一個控制聲音頻率的16位計數(shù)值,端口61H的最低位控制通道2門控的開斷,以產(chǎn)生特殊的音響。本文用到的是8253的方式3——方波發(fā)生器。</p><p>  在程序設(shè)計中,為了避免過于頻繁的調(diào)用中斷顯示字符串,應(yīng)用了宏定義;還通過子程序調(diào)用,有效的解決了跳轉(zhuǎn)和轉(zhuǎn)移過多的問題;再加上合理的DOS和BIOS功能調(diào)用

8、,以及各種指令的綜合,最終作出了漂亮的電子琴界面,并實現(xiàn)了電子琴演奏高、中、低音,以及播放預(yù)存樂曲的功能。</p><p>  關(guān)鍵詞:電子琴 8253定時器 8255 DOS調(diào)用 宏定義 </p><p><b>  1 設(shè)計任務(wù)及要求</b></p><p>  初始條件:用匯編語言設(shè)計一個電子琴,在屏幕上顯示出來,界面要美觀,功能

9、上模擬現(xiàn)實電子琴功能。</p><p>  要求完成的主要任務(wù):1.實現(xiàn)彈奏功或演奏。其中彈奏:用戶每按一琴鍵彈奏相應(yīng)音符;演奏:按下某鍵后自動彈奏預(yù)存琴譜功能;還可以附加變調(diào)</p><p><b>  2.界面要美觀。</b></p><p><b>  2 工作原理</b></p><p> 

10、 PC機揚聲器電路以及相關(guān)接口電路如圖2-1。</p><p>  圖2-1 PC機揚聲器電路及相關(guān)接口電路</p><p>  通過8255和8253來實現(xiàn)電子琴模擬,主要可以分成兩部分,分別為輸入部分和發(fā)音部分。</p><p>  輸入部分:主要是由8255和8個常開型開關(guān)來完成。 </p><p>  發(fā)音部分:CUP通過對定時器的通

11、道2進行編程,使其I/O寄存器接收一個控制聲音頻率的16位計數(shù)值,端口61H的最低位控制通道2門控的開斷,以產(chǎn)生特殊的音響。 </p><p>  當(dāng)通道2用于發(fā)聲時,采用的是方式3,在方式3下,輸出線為“1”和為“0”的時間各占計數(shù)時間的一半,因而產(chǎn)生一系列間隔均勻的脈沖。從定時器輸出的方波信號,經(jīng)功率放大和濾波后驅(qū)動揚聲器。送到揚聲器的信號還受到了從并行接口芯片8255(端口地址為61H)來的雙重控制,端口6

12、1H的最低位控制通道2的門控開斷,以產(chǎn)生特殊的音頻信號,端口61H的PB1位和定時器的輸出信號同時作為與門的輸入,PB0和PB1位可由程序決定為0還是為1。顯然只有PB0和PB1都是1時,才能使揚聲器發(fā)出聲音??刂埔糸L的時間可以簡單地通過反復(fù)執(zhí)行指令來得到。</p><p>  2.1 8253簡介</p><p>  8253芯片是常用的可編程計數(shù)器,在微機中有著極其重要的作用。常用于

13、事件計數(shù)器,單穩(wěn)態(tài)觸發(fā)器,分頻器,方波發(fā)生器,硬件觸發(fā)的單脈沖發(fā)生器等。計數(shù)器/定時器8253包括3個獨立的16位計數(shù)器通道,而每個計數(shù)器都有6種工作方式,可以按二進制或十進制(BCD碼)進行計數(shù)。本文用到的是8253的方式3——方波發(fā)生器來實現(xiàn)了簡易電子琴的設(shè)計。</p><p>  8253的方式控制字如圖2-2所示。</p><p>  圖2-2 8253的方式控制字</p&g

14、t;<p>  8253的工作方式3——方波發(fā)生器:</p><p><b>  它的特點是:</b></p><p>  (1)輸出為周期性的方波。若計數(shù)值為N,則輸出方波的周期是N個CLK脈沖的寬度。</p><p>  (2)寫入控制字后,輸出將變?yōu)楦唠娖?,?dāng)寫入計數(shù)初值后,就開始計數(shù),輸出仍為高電平;當(dāng)計數(shù)到初值的一半時,

15、輸出變?yōu)榈碗娖?,直至計?shù)到0,輸出又變?yōu)楦唠娖剑匦麻_始計數(shù)。</p><p>  (3)若計數(shù)值為偶數(shù),則輸出對稱方波;如果計數(shù)值為奇數(shù),則前(N+1)/2個CLK脈沖期間輸出為高電平,后(N-1)/2個CLK脈沖期間輸出為低電平。</p><p>  (4)GATE信號能使計數(shù)過程重新開始,GATE=1允許計數(shù),GATE=0禁止計數(shù)。停止后OUT將立即變高電平,當(dāng)GATE再次變高以后,

16、計數(shù)器將自動裝入計數(shù)初值,重新開始計數(shù)。</p><p><b>  8255簡介</b></p><p>  按功能可把8255分為三個邏輯電路部分,即:口電路、總線接口電路和控制邏輯電路。8255共有三個8位口,其中A口和B口是單純的數(shù)據(jù)口,供數(shù)據(jù)I/O使用。而C口則既可以作數(shù)據(jù)口,又可以作控制口使用,用于實現(xiàn)A口和B口的控制功能。</p><

17、p>  8255A的方式控制字如圖2-3所示。</p><p>  圖2-3 8255A的方式控制字</p><p><b>  3設(shè)計思路</b></p><p><b>  程序功能描述</b></p><p>  程序開始,顯示電子琴界面和提示信息,對緩存區(qū)初始化。按鍵掃描,接著調(diào)用發(fā)音

18、子程序把al送緩存區(qū),發(fā)出與按鍵相對應(yīng)頻率的聲音,從而實現(xiàn)計算機鋼琴功能:</p><p>  鍵盤按鍵“q、w、e、r、t、y、u”實現(xiàn)音調(diào)的高音輸入;</p><p>  鍵盤按鍵“a、s、d、f、g、h、j”實現(xiàn)音調(diào)的中音輸入;</p><p>  鍵盤按鍵“z、x、c、v、b、n、m”實現(xiàn)音調(diào)的低音輸入。</p><p>  不停地對

19、Esc鍵進行掃描,當(dāng)Esc鍵按下時,就退出程序;當(dāng)按下p時,播放預(yù)存音樂;當(dāng)檢測到Enter鍵時,退出到計算機鋼琴演奏狀態(tài)。</p><p><b>  程序流程圖</b></p><p>  程序流程圖如圖3-1所示。</p><p>  圖3-1 程序流程圖</p><p>  DOS/BIOS功能調(diào)用</p&

20、gt;<p>  DOS操作系統(tǒng)為程序設(shè)計者提供了可以直接調(diào)用的軟中斷處理程序,每一個中斷處理程序完成一個特定的功能操作。依據(jù)編程需要選擇適當(dāng)?shù)奶幚沓绦?,編程者不需再重新編寫程序,而是使用INT n軟中斷指令。每執(zhí)行一種不同類型碼n的軟中斷指令,就執(zhí)行一個中斷處理程序,其主要功能如下: (1) 磁盤的讀/寫控制。 </p><p>  (2)內(nèi)存管理、文件操作和目錄管理。 (3

21、)基本輸入/輸出(對鍵盤、打印機和顯示器等)控制,另外還有日期、時間管理等。</p><p>  BIOS是固化在只讀存儲器ROM中的一系列輸入/輸出服務(wù)程序,它存放于內(nèi)存的高地址區(qū)域內(nèi),除負(fù)責(zé)處理系統(tǒng)中的全部內(nèi)部中斷外,還提供對主要I/O接口的控制功能,如鍵盤、顯示器、磁盤、打印、日期與時間等。BIOS采用模塊化結(jié)構(gòu),每個功能模塊的入口地址都存于中斷向量表中。對這些中斷調(diào)用是通過軟中斷指令I(lǐng)NT n來實現(xiàn)的,中

22、斷指令中的操作數(shù)n即為中斷類型碼。   BIOS的調(diào)用方法與DOS系統(tǒng)功能調(diào)用方法類似: (1)置功能號于AH中。 (2)置入口參數(shù)。 (3)執(zhí)行INT n 。 (4)分析出口參數(shù)及狀態(tài)。</p><p>  下面介紹程序中將要用到的一下DOS/BIOS功能調(diào)用:</p><p>  INT 16H(鍵盤I/O中斷)</p><p

23、><b>  功能號:00H</b></p><p>  功能:從鍵盤讀入ASCII字符,放在AL中</p><p>  入口參數(shù):AH=00H</p><p><b>  功能號:01H</b></p><p>  功能:測試有無鍵被按下</p><p>  入口參數(shù)

24、:AH=01H</p><p>  INT 10H(屏幕及顯示器中斷)</p><p><b>  功能號:00H</b></p><p>  功能:設(shè)置顯示模式入口參數(shù):AH=00H  AL=顯示模式</p><p><b>  功能號:02H </b></

25、p><p>  功能:用文本坐標(biāo)下設(shè)置光標(biāo)位置 入口參數(shù): AH=02H           BH=顯示頁碼           DH=行(Y坐標(biāo))   

26、0;       DL=列(X坐標(biāo)) </p><p><b>  功能號:09H </b></p><p>  功能:在當(dāng)前光標(biāo)處按指定屬性顯示字符 入口參數(shù):AH=09H          A

27、L=字符          BH=顯示頁碼          BL=屬性(文本模式)或顏色(圖形模式)          CX=重復(fù)輸

28、出字符的次數(shù) </p><p><b>  功能號:0BH </b></p><p>  功能:設(shè)置調(diào)色板、背景色或邊框 入口參數(shù):AH=0BH設(shè)置顏色:BH=00H,BL=顏色選擇調(diào)色板:BH=01H,BL=調(diào)色板(320×200、4種顏色的圖形模式) 。</p><p><b>  功能號:0CH </b&g

29、t;</p><p>  功能:寫圖形象素 入口參數(shù):AH=0CH          AL=象素值          BH=頁碼      

30、0;   (CX、DX)=圖形坐標(biāo)列(X)、行(Y) </p><p>  3.3.3 INT 21H(DOS系統(tǒng)功能調(diào)用)</p><p><b>  功能號:4CH</b></p><p>  功能:退出系統(tǒng),返回DOS</p><p>  入口參數(shù):AH=4CH</p>

31、<p><b>  方案比較及論證</b></p><p>  在程序設(shè)計的過程中,遇到了很多問題,總結(jié)起來有以下幾點:</p><p>  問題1:要顯示的字符串過多,但又不想重復(fù)寫代碼</p><p>  原因:過于頻繁的調(diào)用中斷顯示字符串,導(dǎo)致程序過于龐大和復(fù)雜,可讀性差。</p><p>  解決辦

32、法:解決這種問題的最好方法是直接把顯示部分寫成子過程,但是子過程在遞參數(shù)的時候不方便,所以就用宏定義,宏定義可以很方便的傳遞參數(shù),不僅使得程序美觀好看,而且可讀性好,程序代碼緊湊。</p><p>  問題2:寄存器不夠用</p><p>  原因:使用了太多的寄存器,AX、BX、CX、DX。</p><p>  解決辦法:使用外部變量定義,定義外部變量的方法為:&

33、lt;/p><p>  變量名數(shù)據(jù)類型 ?</p><p>  問題3:跳轉(zhuǎn),轉(zhuǎn)移指令跳出的范圍太大,編譯出現(xiàn)錯誤</p><p>  原因:程序結(jié)構(gòu)過于復(fù)雜,龐大。</p><p>  解決辦法:使用過程,也就是子程序設(shè)計,直接把一個要頻繁要用到的函數(shù)打包成一個子過程,然后用CALL調(diào)用子過程就可以了,這樣就可以避免使用跳轉(zhuǎn)和轉(zhuǎn)移指令了。&l

34、t;/p><p>  5 程序源代碼及注釋</p><p>  主程序如下(宏定義及子程序見附錄):</p><p>  data segment</p><p>  ;------------------------------進度條字符-----------------------</p><p>  st_load

35、db 10 ;起始行</p><p>  db 4 ;起始列</p><p>  db 0bh ;字體顏色<

36、;/p><p>  db 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII'</p><p><b>  db 00</b></p><p>  ;------------------------------字符定義-----------------------</p><p>  sta

37、rt_col db ? ;存儲起始行</p><p>  text db 14 ;起始行</p><p>  db 2

38、 ;起始列</p><p>  db 0fh ;字體顏色</p><p>  db 'piano -- AUTOMATION 0808 ^_^',0ffh,0ffh ;顯示字</p><p>  db '

39、 HAVE A GOOD TIME!',0ffh ;以0ffh來判斷是否換行</p><p>  db ' [-1-2-3-4-5-6-7-]',0ffh</p><p>  db 'H [ q w e r t y u ] p: play',0ffh</p><p>  db 'M

40、 [ a s d f g h j ] enter: stop',0ffh</p><p>  db 'L [ z x c v b n m ] Esc: exit',0ffh</p><p>  db ' 1/2: speed down/up',0ffh</p><p>&l

41、t;b>  db 00</b></p><p>  ;------------------------------白色琴鍵坐標(biāo)-------------------</p><p>  st_lx dw 50,61,72,83,94,105,116 ;起點橫坐標(biāo)</p><p>  dw 1

42、27,138,149,160,171,182,193 </p><p>  dw 204,215,226,237,248,259,270</p><p>  st_y dw 50 ;起點縱坐標(biāo)</p><p>  ed_lx dw

43、 60,71,82,93,104,115,126 ;終點橫坐標(biāo)</p><p>  dw 137,148,159,170,181,192,203 </p><p>  dw 214,225,236,247,258,269,280</p><p>  ed_y dw 90

44、 ;終點縱坐標(biāo)</p><p>  ;------------------------------黑色琴鍵坐標(biāo)--------------------------</p><p>  bt_x dw 57,68,90,101,112 ;起點橫坐標(biāo)<

45、/p><p>  dw 134,145,167,178,189 </p><p>  dw 211,222,244,254,265</p><p>  bt_y dw 50 ;起點縱坐標(biāo)</p><p>  bd_x dw 64,75,97,108,11

46、9 ;終點橫坐標(biāo)</p><p>  dw 141,152,174,185,196</p><p>  dw 218,229,251,262,273</p><p>  bd_y dw 70 ;終點縱坐標(biāo)<

47、/p><p>  ;------------------------------音樂頻率值----------------------------</p><p>  tune dw 220,247,278,294,330,371,416 ;低音</p><p>  dw 441,495,556,589,661,742,8

48、33 ;中音</p><p>  dw 882,990,1112,1178,1322,1484,1655 ;高音</p><p>  soundcolor dw 0 ;音色緩存,用于改變播放或彈奏時琴上音響和琴面上點陣的顏色 </p><p>  key_tune dw 0

49、 ;按鍵狀態(tài)緩存,用于判斷是否有手動按鍵,1為有,0為無</p><p>  keynum dw 1 ;按鍵編號緩存,用于提取對應(yīng)的按鍵位置 </p><p>  delay_time dw 7000 ;延時緩存,用于播放時存入bx中來計數(shù)</p><p>  ;------------自動演奏的歌曲頻率和延時---

50、------《卡農(nóng)》輕快改編版-----------</p><p>  mus_freq dw 1112,990,882,833,742,661,742,833 ;聲音頻率部分</p><p>  dw 882,833,742,661,589,556,589,495</p><p>  dw 882,833,882,441,416

51、,661,556,589,441,882,833,742,833,1113,1322,1484</p><p>  dw 1178,1112,990,1178,1178,1112,882,833,742,661,589,556,495,589,556,495</p><p>  dw 441,495,556,589,661,495,661,589,556,742,661,589,661,5

52、89,556,495</p><p>  dw 441,371,742,833,882,833,742,661,589,556,495,742,661,742,661,589</p><p>  dw 556,1112,990,882,990,882,1112,990,1178</p><p>  dw 1322,1112,1178,1322,1112,1178,1

53、322,661,742,833,882,990,1112,1178</p><p>  dw 1112,882,990,1112,556,589,661,742,661,589,661,556,589,661</p><p>  dw 589,742,661,589,556,495,556,495,441,495,556,589,661,742</p><p>  

54、dw 589,742,661,742,833,882,661,742,833,882,990,1112,1178,1322</p><p>  dw 1112,882,990,1112,990,882,990,833,882,990,1112,990,882,833</p><p>  dw 882,742,833,882,441,495,556,589,556,495,556,882,8

55、33,882</p><p>  dw 742,882,833,742,661,589,661,589,556,589,661,742,833,882</p><p>  dw 742,882,833,882,833,742,833,882,990,882,833,882,742,883</p><p>  dw 1112,556,589,556,495,990,1

56、112,990,882,556,441,742,661,330,294,330</p><p>  dw 371,742,833,742,833,330,294,330,371,742,661,742,833,833,742,833</p><p>  dw 441,882,990,880,833,416,441,416,371,742,661,742,833,416,556,495<

57、;/p><p>  dw 441,882,990,1178,1112,556,661,1112,882,1178,1112,1178,990,661,589,661</p><p>  dw 556,882,833,882,556,661,661,742,883,661</p><p>  dw 556,882,1112,1178,882,1112,1112,990,8

58、82,833</p><p>  dw 742,742,661,742,833,882,1112,990,882,1178</p><p>  dw 1322,1178,1112,990,1112,990,882,833,882,833,742,661,742,661,589,556</p><p>  dw 589,589,495,441</p>&

59、lt;p><b>  dw 441</b></p><p>  dw -1 ;以后以-1來判斷是否結(jié)束</p><p>  ;----------------------------聲音節(jié)拍部分,32為一拍------------------------</p><p

60、>  mus_time dw 16 dup(32),64 dup(8) </p><p>  dw 16,16,32,32,32,16,16,16,16 </p><p>  dw 8 dup(8,4,4,8,4,4,8 dup(4)) </p><p>  dw 64 dup(8)</p><p> 

61、 dw 6 dup(8,4,4,8,8) </p><p>  dw 20 dup(8),32 </p><p><b>  data ends</b></p><p>  ;************************************代碼段*********************************</p>

62、<p>  code segment</p><p>  assume ds:data,cs:code</p><p>  ;-------------------------主程序-----------------------</p><p>  ;---依次調(diào)用:開場效果--初始化--鍵盤掃描--按鍵處理程序-------------</p&g

63、t;<p>  main proc far</p><p><b>  start:</b></p><p>  call show_load ;調(diào)用進度條顯示程序</p><p>  ;---延時20*waitf---- </p><

64、;p><b>  push bx</b></p><p><b>  mov bx,20</b></p><p><b>  del: </b></p><p>  call waitf</p><p><b>  dec bx</b></p

65、><p><b>  jnz del</b></p><p><b>  pop bx</b></p><p>  ;------------重新開始------- </p><p>  restart: ;自動播放音樂時,按‘enter’鍵或音樂完全結(jié)束后會返回

66、這里</p><p>  call init;調(diào)用初始化程序</p><p>  new_scan: ;鍵盤掃描程序沒有檢測到功能鍵被按下時,會返回這里</p><p>  call scan_key ;調(diào)用鍵盤掃描程序,掃描所按下的鍵</p><p>  ;-----------按鍵

67、處理-------</p><p>  call do_key</p><p>  ;----重新掃描---</p><p>  jmp new_scan ;重新掃描有無鍵按下,直到按下esc鍵</p><p><b>  main endp</b></p><p><b>

68、  6 運行結(jié)果分析</b></p><p>  電子琴界面如圖6-1所示。</p><p>  圖6-1 電子琴界面</p><p>  電子琴播放預(yù)存音樂時的界面如圖6-2所示。</p><p>  相比初始界面,播放預(yù)存音樂時,右上角的第一個燈變綠了,上面和左右兩邊的點開始閃爍,且每播放一個音符,界面下方就多了"I"一個符號

69、。</p><p>  圖6-2 電子琴播放預(yù)存音樂的界面</p><p><b>  7 調(diào)試過程記錄</b></p><p>  在程序調(diào)試的過程中,遇到最大的問題就是,寄存器的值變幻無常,容易出錯。</p><p>  原因:程序結(jié)構(gòu)過于復(fù)雜,使用寄存器比較頻繁,以及使用了BIOS中斷程序,這樣會導(dǎo)致其它與之相關(guān)寄

70、存器的值的改變。</p><p>  解決辦法:堆棧是保護環(huán)境的主要工具,一旦用錯,后果將很嚴(yán)重,比如我們在調(diào)試程序的過程中,遇到過這樣的問題:在一個函數(shù)的開始,我先用PUSH把所有寄存器入棧了,在函數(shù)的執(zhí)行中,我又把一個寄存器PUSH到棧中保存,卻忘記了在執(zhí)行POP指令之前把它恢復(fù)出來!這樣就造成了所有的寄存器的值都的生了變化。PUSH了一個變量之后在新的PUSH來臨之前如果又有POP別的變量的語句,一定會出問

71、題!解決的辦法只有一個,把PUSH和POP對上號。</p><p><b>  8 課程設(shè)計小結(jié)</b></p><p>  在本次設(shè)計中,可以說是一次成功的經(jīng)驗。在學(xué)完了《微型原理與接口技術(shù)》這門課的基礎(chǔ)上來搞做這個設(shè)計,使我對這門課的理論知識的理解有很大程度上的加強。微機原理這門課程本身是一門實驗性和工程性很強的專業(yè)技術(shù)課,因此不僅要重視理論教學(xué),更應(yīng)注意實踐技能

72、的培養(yǎng)和訓(xùn)練。課程設(shè)計是這門課程的一個重要環(huán)節(jié),通過課程設(shè)計,鞏固、加深和拓寬了學(xué)習(xí)的理解,使自己的分析、設(shè)計和調(diào)試8086微機系統(tǒng)的能力得到了進一步的提高。</p><p>  通過整整一個星期的摸索和編程,查資料,終于把程序完成了,和小組的成員一起討論問題,分析問題,發(fā)現(xiàn)問題,解決問題,也收獲了不少,我們的編程技術(shù)都有所提高,我們的體會就是:要提高自己的編程能力,你必須親自去體驗、去設(shè)計、編輯、編譯、調(diào)試、運

73、行。每一個程序員都是在失敗、嘗試、失敗、嘗試與收獲中成長起來的。</p><p>  在設(shè)計過程中,對不同方案的構(gòu)思、分析、比較到最后的定案,這些工作,培養(yǎng)了我們的分析問題,解決問題和創(chuàng)新的能力。在方案確定后,在軟件編程方面,對編寫的程序經(jīng)上機實踐和調(diào)試,對存在的問題進行反復(fù)修改,使其達到了最優(yōu)方案。這樣的編程機會在平時是很少有的,所以,在編程方面我們得到了很多的鍛煉,使自己更加熟悉了匯編語言,了解了編程思想,為

74、以后的學(xué)習(xí)以及工作打下了扎實的基礎(chǔ)。</p><p>  我認(rèn)為,在這次的課程設(shè)計中,不但做出了一個符合要求的電子琴,而且為自己積累了一筆有用的財富。</p><p><b>  參考文獻</b></p><p>  [1] 龔尚福.微機原理與接口技術(shù).西安電子科技大學(xué)出版社,2003.8</p><p>  [2] 李

75、芷.微機原理與接口技術(shù).電子工業(yè)出版社,2002 </p><p>  [3] 錢曉捷.匯編語言程序設(shè)計(第二版).電子工業(yè)出版社,2003</p><p>  [4] 宋杰等.微機原理與接口技術(shù)課程設(shè)計.北京 :機械工業(yè)出版社 ,2005</p><p>  [5] 楊立,鄧振杰,荊淑霞等.微型計算機原理與接口技術(shù)(第二版).北京:中國鐵道出版

76、社,2006</p><p>  [6] 小捷. 匯編語言程序設(shè)計. 第2版. 西安:西安電子科技大學(xué)出版社,2003</p><p><b>  附錄</b></p><p>  ;**********************************矩形繪制宏*******************************</p>

77、<p>  draw macro start_x,start_y,end_x,end_y,color</p><p>  local draw_next</p><p>  ;local :避免宏重復(fù)調(diào)用時,標(biāo)號的重復(fù)</p><p>  ;功能:畫填充的矩形</p><p>  ;使用條件:start_x < end_x

78、,start_y < end_y</p><p>  push ax ;堆棧</p><p><b>  push bx</b></p><p><b>  push cx</b></p><p><b&g

79、t;  push dx</b></p><p>  mov ah,0ch ;12號功能,寫像素</p><p>  mov al,color ;取顏色值</p><p>  mov bh,0

80、 ;頁號0</p><p>  mov cx,start_x ;列起始點</p><p>  mov dx,start_y ;行起始點</p><p>  draw

81、_next:</p><p>  int 10h ;畫點</p><p>  inc cx ;畫橫線</p><p>  cmp cx,end_x

82、 ;比較行是否畫完</p><p>  jne draw_next ;畫另一行</p><p>  mov cx, start_x ;另一行的起始點</p><p>  inc dx

83、 ;下一行</p><p>  cmp dx,end_y ;比較列是否畫完</p><p>  jne draw_next ;未完繼續(xù)畫</p><p>  pop

84、 dx ;出棧</p><p><b>  pop cx</b></p><p><b>  pop bx</b></p><p><b>  pop ax</b></p><p><b&

85、gt;  endm</b></p><p>  ;********************************矩形點陣?yán)L制宏****************************</p><p>  draw_point macro start_x,start_y,end_x,end_y,color</p><p>  local draw_nex

86、t</p><p>  ;local :避免宏重復(fù)調(diào)用時,標(biāo)號的重復(fù)</p><p><b>  ;功能:畫矩形點陣</b></p><p>  ;使用條件:start_x < end_x ,start_y < end_y</p><p><b>  push ax</b></p&

87、gt;<p><b>  push bx</b></p><p><b>  push cx</b></p><p><b>  push dx</b></p><p>  mov ah,0ch ;12號功能,寫

88、像素</p><p>  mov al,color ;設(shè)置顏色</p><p>  mov bh,0 ;頁號0</p><p>  mov cx,start_x

89、 ;列起始點</p><p>  mov dx,start_y ;行起始點</p><p>  draw_next:</p><p>  int 10h ;畫點</p><p&g

90、t;<b>  inc cx</b></p><p>  inc cx ;隔一點</p><p>  cmp cx,end_x ;比較行是否畫完</p><p>  jne draw_n

91、ext ;畫另一行</p><p>  mov cx, start_x ;另一行的起始點</p><p><b>  inc dx</b></p><p>  inc dx

92、 ;隔一行</p><p>  cmp dx,end_y ;比較列是否畫完</p><p>  jne draw_next ;未完繼續(xù)畫</p><p><b>

93、;  pop dx</b></p><p><b>  pop cx</b></p><p><b>  pop bx</b></p><p><b>  pop ax</b></p><p><b>  endm</b></p>

94、<p>  ;****************************矩形框繪制宏****************************</p><p>  drawsqre macro start_x,start_y,end_x,end_y,color</p><p>  local row_up,row_down,rank_left,rank_right</p>

95、;<p>  ;--功能:畫矩形框。</p><p><b>  push ax</b></p><p><b>  push bx</b></p><p><b>  push cx</b></p><p><b>  push dx</b>

96、;</p><p><b>  push si</b></p><p>  mov ah,0ch ;12號功能,寫像素</p><p>  mov al,color</p><p><b>  mov bh,0</b><

97、;/p><p>  mov cx,start_x</p><p>  mov dx,start_y</p><p>  row_up: ;畫上邊</p><p><b>  int 10h</b></p><

98、p><b>  inc cx</b></p><p>  cmp cx,end_x</p><p>  jne row_up</p><p>  rank_right: ;畫右邊</p><p><b>  int

99、10h</b></p><p><b>  inc dx</b></p><p>  cmp dx,end_y</p><p>  jne rank_right</p><p>  mov cx, start_x ;下邊起始點</p&g

100、t;<p>  mov si,end_x</p><p><b>  inc si</b></p><p>  row_down: ;畫下邊</p><p><b>  int 10h</b></p>&l

101、t;p><b>  inc cx</b></p><p><b>  cmp cx,si</b></p><p>  jne row_down</p><p>  mov dx,start_y ;左邊起始點</p><p>

102、  mov cx,start_x</p><p>  rank_left: ;畫左邊</p><p><b>  int 10h</b></p><p><b>  inc dx</b></p><p>  

103、cmp dx, end_y</p><p>  jne rank_left</p><p><b>  pop si</b></p><p><b>  pop dx</b></p><p><b>  pop cx</b></p><p><b&

104、gt;  pop bx</b></p><p><b>  pop ax</b></p><p><b>  endm</b></p><p>  ;********************琴鍵處理程序********************</p><p>  do_key proc

105、near</p><p>  ;---顯示按下---</p><p>  push bx ;bx入棧</p><p>  mov bx,keynum ;取按鍵編號緩存值,存入bx</p><

106、p>  call key_down ;在屏幕上顯示按下狀態(tài)</p><p>  ;----按下時琴身點陣顏色改變--純白--</p><p>  draw_point 40,52,44,92,0fh ;調(diào)用矩形點陣宏,繪制音響孔左點陣</p><p>

107、;  draw_point 288,52,292,92,0fh ;調(diào)用矩形點陣宏,繪制音響孔右點陣</p><p>  draw_point 150,34,282,38,0fh ;調(diào)用矩形點陣宏,繪制正面音孔點陣 </p><p>  pop bx

108、 ;bx出棧 </p><p>  ;---發(fā)出聲音---</p><p>  lea bx,tune ;裝入對應(yīng)頻率段地址到bx中</p><p>  push si ;si入棧</p><p>  mo

109、v si,keynum ;取按鍵編號緩存值,存入si</p><p>  mov di,[bx+si] ;取對應(yīng)編號的音符頻率值,存入di</p><p>  call play_hand ;調(diào)用手動發(fā)聲程序</p><p>  pop si

110、 ;出棧</p><p>  ;---顯示彈起---</p><p><b>  push bx</b></p><p>  mov bx,keynum ;在屏幕上顯示彈起狀態(tài)</p><p>  cal

111、l key_up</p><p>  ;----按下時琴身點陣顏色恢復(fù)--灰色--</p><p>  draw_point 40,52,44,92,07h ;調(diào)用矩形點陣宏,繪制音響孔左</p><p>  draw_point 288,52,292,92,07h ;調(diào)用矩形點陣宏,繪制音

112、響孔右</p><p>  draw_point 150,34,282,38,07h ;調(diào)用矩形點陣宏,繪制正面音孔 </p><p><b>  pop bx</b></p><p>  mov key_tune,0 ;恢復(fù)按鍵狀態(tài)緩存,</p&g

113、t;<p><b>  ;-------</b></p><p><b>  ret</b></p><p>  do_key endp</p><p>  ;******************************手動演奏發(fā)聲程序**************************</p>

114、<p>  ;--功能:當(dāng)手動按鍵時,播放相應(yīng)鍵的聲音,只要不放開,就會一直播放。</p><p>  ;--在di中存放發(fā)聲頻率。</p><p>  play_hand proc near</p><p>  ;-----------</p><p><b>  push ax</b></p&g

115、t;<p><b>  push bx</b></p><p><b>  push cx</b></p><p><b>  push dx</b></p><p><b>  push di</b></p><p>  ;--------

116、---</p><p>  mov al,0b6h ;在8253的43端送出一個控制字0b6h(10110110b)</p><p>  out 43h,al ;從而對定時器2初始化,準(zhǔn)備接收計數(shù)初值</p><p>  mov dx,12h ;1.1931Mhz/給定頻率=12348h/給定頻率=計數(shù)初值</p>

117、<p>  mov ax,348ch ;12348h存入DX:AX中,作32位運算,商存入AX,余數(shù)存入DX </p><p>  div di ;di中存放給定頻率</p><p>  out 42h,al </p><p>  in al,61h ;開揚聲器</p><p>

118、;  mov al,ah ;給定時器2寫入AX中存放的計數(shù)初值</p><p>  out 42h,al </p><p>  in al,61h </p><p>  mov ah,al ;把8255輸出端的61h的0、1兩位置1,并把端口狀態(tài)存入ah</p><p>  or a

119、l,3 ;打開揚聲器</p><p>  out 61h,al </p><p>  ;----------------按鍵等待------------</p><p><b>  wait1: </b></p><p>  call waitf;調(diào)用延時</p>

120、;<p>  in al,60h ;讀取鍵盤掃描碼,按下和放開都有相應(yīng)的掃描碼,放開碼=按下碼+80h>80h</p><p>  test al,80h ;al和80h相與,影響標(biāo)志位</p><p>  jz wait1;未放開則繼續(xù)延時</p><p>  mov al,ah;恢復(fù)8255

121、端口61h的狀態(tài),關(guān)揚聲器</p><p>  out 61h,al</p><p>  ;----------------</p><p>  pop di ;恢復(fù)寄存器狀態(tài)</p><p><b>  pop dx </b></p><p><b>  pop

122、cx</b></p><p><b>  pop bx</b></p><p><b>  pop ax</b></p><p>  ;----------</p><p><b>  ret</b></p><p>  play_hand

123、endp</p><p>  ;******************************自動播放發(fā)聲程序**************************</p><p>  ;--功能:自動播放音樂時發(fā)聲。</p><p>  play_auto proc near</p><p>  ;-----------------</p

124、><p>  push ax ;保存寄存器狀態(tài)</p><p><b>  push bx</b></p><p><b>  push cx</b></p><p><b>  push dx</b></p><p><b>

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論