匯編實驗-音樂播放程序_第1頁
匯編實驗-音樂播放程序_第2頁
匯編實驗-音樂播放程序_第3頁
匯編實驗-音樂播放程序_第4頁
匯編實驗-音樂播放程序_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三節(jié)音樂播放程序TOC\o"1-2"\h\z\u1硬件編程21.1硬件開發(fā)的通用思路21.28253的功能與作用21.38253工作原理31.48253編程方法42音樂程序編寫62.1揚聲器驅(qū)動原理62.2音符頻率確實定62.3定時器8253編程72.4并口8255A編程73實驗步驟104Turboc2的安裝與使用114.1turboc2的安裝114.2集成環(huán)境介紹114.3turboc2的配置134.4根本編程操作141硬件編程1.1硬件開發(fā)的通用思路 在學(xué)習(xí)的過程中,往往表達一個人的學(xué)習(xí)能力,并不是一個人在某一方面具體知識和技能掌握的如何,而是他是否掌握了有效的學(xué)習(xí)方法,是否能夠建立起一個夯實的知識框架。 在本次實驗中,通過大家學(xué)習(xí)本次實驗,完成實驗任務(wù)只是一個淺層次的目的,更重要的目的,也是通過實驗,讓大家親身體驗下硬件編程,掌握硬件編程的方法。 其實不光是在硬件開發(fā)上,對于其他的任何事物和問題,解決問題的方法也是一樣的。以下我們以8253定時器的開發(fā),來簡要介紹下我們的學(xué)習(xí)思路和方法,也可作為本小節(jié)內(nèi)容組織的一個縮影。是什么?是什么?為什么?怎么做?8253的功能和作用8253的工作原理如何編程控制8253圖1.11.28253的功能與作用 8253是可編程的定時器與計數(shù)器。為外設(shè)與CPU之間或外設(shè)與外設(shè)之間配合工作時,提供有效的時間配合條件。 8253有三個獨立的16位計數(shù)器。 每個計數(shù)器均可按二進制或者BCD碼計數(shù)。 各個計數(shù)器有6種不同的工作方式。1.38253工作原理8253內(nèi)部結(jié)構(gòu)圖1.28253內(nèi)部結(jié)構(gòu)框圖8253內(nèi)部有六個模塊,結(jié)構(gòu)框圖如圖1.2所示。數(shù)據(jù)總線緩沖器:數(shù)據(jù)總線緩沖器:數(shù)據(jù)總線緩沖器通過引腳D0~D7與系統(tǒng)數(shù)據(jù)總線的D0~D7相連,來實現(xiàn)CPU和8253的數(shù)據(jù)傳輸?shù)?。?shù)據(jù)包括8253的計數(shù)值,和工作方式命令字。傳輸?shù)姆绞綖樽x和寫。讀寫控制邏輯:讀寫控制邏輯:讀寫控制邏輯由CPU發(fā)出的讀寫控制信號和地址信號,選擇讀出或?qū)懭氲拇娣牌?,并確定數(shù)據(jù)傳輸?shù)姆较颍鹤x/寫??刂谱执娣牌鳎嚎刂谱执娣牌鳎嚎刂谱执娣牌鹘邮誄PU發(fā)來的控制字??刂谱钟糜谠O(shè)定8253的硬件狀態(tài),如計數(shù)器的選擇與工作方式等。計數(shù)器n:計數(shù)器n:計數(shù)器是8253中真正的“勞動者”,8253的計數(shù)和定時功能是由計數(shù)器實際執(zhí)行完成的。8253內(nèi)部有3個獨立的計數(shù)器。對于每一個獨立的計數(shù)器,其都有三個引腳:CLKn、GATEn、OUTn。也可以簡單的將這三個引腳的關(guān)系理解為輸入〔CLKn〕、輸出〔OUTn〕和控制〔GATEn〕。8253計數(shù)原理計數(shù)器的輸入為CLK時鐘信號,為計數(shù)器工作提供計數(shù)的基準參考。在8253工作時,每輸入一個時鐘信號CLK,便使定時或計數(shù)值減1。當(dāng)計數(shù)器工作時,定時或計數(shù)值減為0時,就在OUT線上輸出OUT信號,以指示定時或計數(shù)已到。GATE門選通信號用于控制計數(shù)器工作,主要用來禁止、允許或開始計數(shù)。1.48253編程方法端口與存放器圖1.38253讀寫操作及端口地址8253的讀寫操作主要是由控制邏輯模塊來實現(xiàn)的,A0、A1地址信號用來選擇計數(shù)器,而由圖。1.3可以看出,更確切的說A0、A1地址信號的作用是在選擇端口。端口其實就是存放器,端口地址就是存放器的地址。當(dāng)我們寫數(shù)據(jù)到某個端口時,總要有個存儲單元來接收存儲我們的數(shù)據(jù)吧,否那么數(shù)據(jù)還沒被送給CPU就不見了。當(dāng)我們讀取某個端口,那么一定也有一個存儲單元存儲著我們想要的數(shù)據(jù)吧,否那么我們的數(shù)據(jù)從哪里來呢?這樣應(yīng)該好理解吧,所以端口其實就是存放器。讀寫信號控制著數(shù)據(jù)的流向,數(shù)據(jù)是輸入還是輸出。這里大家可能會有疑問了。那我在編程控制8253的時候,讀寫信號、地址信號是不是都要我在編程的時候直接進行設(shè)定呢?答案是否認的。其實我們在編程的時候要方便的多。硬件接口中每個端口都有特定的功能,編程時通過讀寫相應(yīng)端口來對硬件接口進行控制和數(shù)據(jù)傳輸。8253端口:8253端口:40H——計數(shù)器0數(shù)據(jù)口。 寫該端口,可設(shè)置計數(shù)器1的初值。讀同之。41H——計數(shù)器1數(shù)據(jù)口。 42H——計數(shù)器2數(shù)據(jù)口43H——8253控制口 寫該端口,選定計數(shù)器及其工作方式等。當(dāng)我們要設(shè)置8253的工作狀態(tài)時,我們要將工作方式命令字寫入43H端口即可,當(dāng)我們要對計數(shù)器2設(shè)置計數(shù)初值時,將計數(shù)初值寫入42H端口即可。讀寫操作由匯編指令I(lǐng)N、OUT來完成,C語言中由inportb〔〕和outportb()函數(shù)完成。因此,在我們編程時,我們只需要使用端口IO命令或函數(shù),指定要操作的端口號即可。至于硬件級別的引腳信號怎么做的都是由CPU在執(zhí)行代碼時,CPU發(fā)出的,那是CPU的事。8253編程任何一個硬件設(shè)備在正常使用之前都需要進行初始化。當(dāng)芯片剛加電時,硬件的工作狀態(tài)都是混亂的,因此,第一步總是要初始化硬件,初始化完成后,就可以控制硬件完成功能任務(wù)。圖1.48253工作方式命令字格式由8253命令字可以看出,命令字主要控制著8253的計數(shù)器選擇、讀寫格式、工作方式和計數(shù)碼制。通過向8253的控制端口寫入工作方式命令字,實現(xiàn)對8253工作狀態(tài)的控制,主要用于8253的初始化。代碼1.1代碼1.1選擇計數(shù)器2,工作方式3,計數(shù)初值533〔2個字節(jié)〕,采用二進制計數(shù)。選擇計數(shù)器2,工作方式3,計數(shù)初值533〔2個字節(jié)〕,采用二進制計數(shù)。#define TIMER2_INIT 0xb6 //命令字#define TIMER2_INIT 0xb6 //命令字#define INIT_DATA 0x533 //計數(shù)初值#define PORT_T2 0x42 //計數(shù)器2數(shù)據(jù)口#define PORT_CTRL 0x43 //8253控制口 union //共用體暫存計數(shù)初值 { unsignedintdivisor; unsignedchard[2]; }tone; tone.divisor=INIT_DATA; outportb(CTRL_T,INIT_T2); //向控制端口寫入工作方式命令字,初始化 outportb(PORT_T2,tone.d[0]); //寫入計數(shù)初值的低字節(jié) outportb(PORT_T2,tone.d[1]); //寫入計數(shù)初值的高字節(jié)#include<dos.h>#include<dos.h>函數(shù)名:

inportb功能:返回從指定硬件端口讀入的一個8位二進制〔一個字節(jié)〕。用法:int

inportb(intport);函數(shù)名:

outportb功能:輸出字節(jié)到硬件端口中用法:

voidoutportb(intport,charbyte);2音樂程序編寫2.1揚聲器驅(qū)動原理圖2.1揚聲器硬件原理圖在PC機中,8253的通道2與計算機的揚聲器相連,由通道2工作于方式3產(chǎn)生一定頻率的方波信號去驅(qū)動揚聲器按一定頻率發(fā)聲。其中8253是否工作取決于其片選信號GATE2,輸出的頻率大小受控于編程時寫入的計數(shù)初值。其原理如圖2.1所示。8253的端口地址為40H~43H。從圖中可見,系統(tǒng)使用并行I/O接口8255A中PB端口的最低兩位用作兩個開關(guān),來控制該發(fā)聲驅(qū)動系統(tǒng):PB0作為8253通道2的門控信號GATE2,控制通道2定時計數(shù)的啟停;PB1與通道2的OUT2信號相與后去控制揚聲器接通與斷開。PC中8255A的端口地址為60H~63H??梢姡箵P聲器發(fā)聲,PB0置1,通道2才能工作;PB1置1,OUT2上產(chǎn)生的一定頻率的方波信號才能通過與門送到驅(qū)動器,從而使揚聲器發(fā)聲。 在明白了如何通過驅(qū)動揚聲器的原理后,我們應(yīng)該明白,實現(xiàn)本次實驗,關(guān)鍵點就在與兩個方面了:一是如何控制8253定時器,使其輸出音頻波形;二是如何控制8255A,使其起到控制開關(guān)的作用。接下來我們來深入探討。2.2音符頻率確實定樂曲是按照一定的上下、長短和強弱關(guān)系組成的音調(diào)。在一首樂曲中,每個音符的音高與頻率有關(guān)。組成樂曲的每個音符的頻率值是樂曲程序發(fā)聲所需要的數(shù)據(jù)。音符的頻率根據(jù)不同的音樂是不同的,可以預(yù)先查知,但實際送入計數(shù)器的是輸入頻率1.193MHz(1193180)與音符頻率相除的值。8度音:8度音:1234567i1300Hz1462.5Hz1625Hz1733Hz1950Hz2166.7Hz2437.5Hz2600Hz918 816 734 689612550489469音符頻率表音符頻率初值例如我們計算揚聲器發(fā)出音符1時的計數(shù)初值,音符1的頻率為1300Hz,那么計數(shù)初值就為1193180/1300,各個音符的頻率以及相關(guān)8253的計數(shù)初值在上表中。2.3定時器8253編程定時器8253主要實現(xiàn)音樂頻率的產(chǎn)生。在8253的三個獨立的計數(shù)器中,計數(shù)器2用于控制揚聲器,兩外兩個計數(shù)器分別用于控制系統(tǒng)軟時鐘和動態(tài)存儲器刷新。在音樂播放程序中,首先要初始化8253,使計數(shù)器2工作在方式3,隨后對計數(shù)器2賦初值,它就根據(jù)系統(tǒng)時鐘對初始值進行減1計數(shù),當(dāng)計數(shù)值到0時,定時器就向揚聲器發(fā)出一個脈沖,同時重新從初始值開始減計數(shù)??傊〞r器能根據(jù)要求的頻率向揚聲器發(fā)出脈沖,于是揚聲器就產(chǎn)生指定頻率的聲音。定時器的輸入頻率固定為1193180,計數(shù)初值決定了向揚聲器發(fā)出脈沖的時間間隔,他們之間的關(guān)系如下公式計算:頻率=1193180/計數(shù)初值計數(shù)初值=1193180/頻率其中各個音符的頻率,可參考2.2小節(jié)中的音符頻率表,表中給出了各個音符的頻率,以及相應(yīng)的計數(shù)器的初值。定時器8253的編程可參考代碼1.1。2.4并口8255A編程聲音的停頓以及開關(guān)是由8255A來實現(xiàn)的。8255A是通用可編程并口芯片。片內(nèi)有3個8位并行I/O口,分別稱為PA口、PB口和PC口,可以通過編程對8255A輸入不同的指令改變I/O口的工作方式。在音樂播放程序中,并口8255A中的PB口中d0和d1兩位控制著定時器8253的GATE2和揚聲器,其作用相當(dāng)于一個開關(guān)。只有當(dāng)d0為1時,8253的計數(shù)器2才允許計數(shù),因此d0作為8253工作與否的開關(guān);同時d1位控制著8253的計數(shù)器2的OUT信號是否能夠順利送達揚聲器,因此,當(dāng)音樂播放的時候,PB口的d0、d1位要置1。代碼2.1代碼2.1 unsignedcharvalue;value=inportb(PORT_PB); //取出8255A的PB口狀態(tài) outportb(PORT_PB,(value|0x03)); //將PB口的低2位值1 u_delay(ms); //延時子函數(shù),控制音符的節(jié)拍 outportb(PORT_PB,value); //恢復(fù)PB口狀態(tài),即關(guān)閉在代碼2.1中,定義了一個unsignedchar型變量value,用于讀取8255APB口的狀態(tài),隨后將value與0x3相與寫入PB口,等待一個延時,這個延時控制著一個音符發(fā)聲的時長,即節(jié)拍。隨后將value值再寫入PB口。這樣就防止了對PB口中其他位產(chǎn)生影響。在代碼2.1中,有個延時子程序u_delay(),這個延時主要是控制每個音符發(fā)聲的長短,從而實現(xiàn)整個音樂的節(jié)拍。該延時子程序的實現(xiàn)與CPU主頻無關(guān),能夠到達不依賴于硬件主頻的準確延時。有興趣同學(xué)可以分析下該延時程序,代碼如下:代碼2.2代碼2.2voidu_delay(unsignedintms){ structtimetimep; floattime0,time1; gettime(&timep); time0=timep.ti_hour*3600+timep.ti_min*60+timep.ti_sec+timep.ti_hund*1.00/100; do { gettime(&timep); time1=timep.ti_hour*3600+timep.ti_min*60+timep.ti_sec+timep.ti_hund*1.00/100; if(time1<time0) { time1+=86400; } }while(time1-time0<ms*1.00/1000);}2.5音樂程序流程圖〔參考music.asm源碼〕讀取音符頻率讀取音符頻率開始音樂結(jié)束?調(diào)用SOUND子程序結(jié)束圖2.2主程序music.asm流程圖NY設(shè)置8253狀態(tài)和分頻初值設(shè)置8253狀態(tài)和分頻初值讀入8255A的PB口狀態(tài)8255A的PB口D0和D1置1延時恢復(fù)8255A的PB口狀態(tài)保護現(xiàn)場返回圖2.3SOUND子程序流程圖保護現(xiàn)場3實驗步驟〔匯編代碼music.asm為例〕a.編輯匯編源程序music.asm

b.將文件music.asm放入masm5.0目錄下

c.計算機重啟進入MAXDOS

d.輸入命令ntfsdos加載NTFS分區(qū)

e.進入masm.5.0目錄

f.匯編:輸入命令masmmusic.asm

g.鏈接:輸入命令linkmusic

h執(zhí)行:輸入命令music〔C語言為例〕a.在dos環(huán)境下,進入turboc2目錄,輸入命令tc啟動turboc2。b.編輯C語言源代碼〔或者用其他C代碼編輯器編輯后,在turboc2中加載〕。c.編譯C源程序,生成可執(zhí)行程序。d.假設(shè)編譯有錯,根據(jù)turboc提示,查錯修改。亦可使用調(diào)試功能查錯。e.重啟進入MAXDOS,輸入命令ntfsdos加載NTFS分區(qū)f.進入可執(zhí)行文件所在文件夾,輸入可執(zhí)行文件的文件名,執(zhí)行程序4Turboc2的安裝與使用4.1turboc2的安裝同學(xué)們得到turboc2的壓縮包后,可以直接解壓即可使用。本人將turboc2解壓在了F分區(qū)下,因此以此路徑為例進行講解。如果你turboc2解壓的位置與我的不同,請注意相關(guān)路徑,以你實際路徑為準。圖4.1在圖4.1中,顯示了進入turboc2安裝目錄的情況,可以看到turboc2目錄下有兩個文件夾INCLUDE和LIB。在使用turboc2之前,我們需要先設(shè)置turboc2的頭文件和庫文件的路徑,設(shè)置方法稍后會介紹。4.2集成環(huán)境介紹進入dos環(huán)境進入dos環(huán)境f:cdturboc2tc圖4.2輸入tc命令,就開始執(zhí)行turboc2的集成開發(fā)環(huán)境。圖下列圖所示:編輯區(qū)編輯區(qū)圖4.3如圖4.3所示,集成環(huán)境有四個區(qū)域組成:主菜單、編輯區(qū)、信息窗口、狀態(tài)行。主菜單包括File、Edit、Run、Compile、Options、Debug、Break/watch子菜單。編輯區(qū)用來編輯文件的,也是turboc2的主窗口,在次窗口可以輸入、編輯和調(diào)試C語言文件。在編輯狀態(tài)下,閃爍的“_”為光標,表示當(dāng)前輸入文字將出現(xiàn)的位置。信息窗口在編譯、調(diào)試程序的時候會顯示出相關(guān)的信息。在編譯/連接時輸出編譯/連接的結(jié)果,在程序調(diào)試中,此窗口又稱為跟蹤窗口,用于顯示跟蹤表達式或變量的當(dāng)前值。編輯窗口和信息窗口的切換通過功能鍵F6實現(xiàn)。狀態(tài)行即圖4.3紅線處,為用戶提供最根本的幫助信息,以及當(dāng)前鍵盤狀態(tài)。在turboc2的集成環(huán)境中,是不能用鼠標的,只能使用鍵盤。在圖4.3中,可以看到主菜單File的背景色為黑色,按下回車,即可展開File下的子菜單。如圖4.4圖4.4在File的子菜單中,可以使用鍵盤上下方向鍵來選擇子選項。退到主菜單可按“ESC”鍵,也可使用“F10”快捷鍵切到主菜單。 在不同的子菜單中切換,可以在主菜單下使用左右方向鍵,黑色背景即為當(dāng)前操作的子菜單。也可以使用“Alt”快捷鍵,如我想進入Compile子菜單,可以使用“Alt+C”即可,在主菜單中每個子菜單的首字母都是大寫紅色,Alt和各個子菜單的首字母組合都可進入相應(yīng)的子菜單。如圖4.5所示。圖4.5 如果要退出turboc2集成環(huán)境,可以進入File子菜單中,選擇Quit即可,也可使用“Alt+X”快捷鍵。4.3turboc2的配置在4.1小節(jié)我們提到需要配置turboc2的一些路徑,這里我們來完成這個任務(wù)。進入turboc2集成環(huán)境,切到Options子菜單,選擇Directories選項。如圖4.6所示:圖4.6進入Directories后如圖4.7所示:圖4.7如圖4.7顯示,有四個工程,如果你的安裝路徑和我的不同,請做相應(yīng)的修改。Includedirectories:頭文件的路徑,如圖4.1所示,設(shè)為turboc2目錄下的INCLUDE文件夾。Librarydirectories:庫文件路徑,設(shè)為turboc2目錄下LIB文件夾。Outputdirectories:輸出文件夾,即用來存放編譯程序時的生成文件,包括目標文件和可執(zhí)行文件等。由于turboc2目錄下文件太多,為了方便程序管理,我在turboc2目錄下新建了一個Project文件夾,來存放源程序和編譯生成的程序。TurboCdirectory:該路徑為turboc2的安裝目錄即可。到此,turboc2環(huán)境就可以正常使用了。4.4根本編程操作創(chuàng)立一個C源文件在每次啟動turboc2后,系統(tǒng)會自動創(chuàng)立名為NONAME.C的新文件。在編輯窗口輸入程序代碼,并保存,就可以創(chuàng)立一個C源文件。另外,在File菜單下“New”選項也可創(chuàng)立一個新文件。如圖4.8所示:圖4.8程序文本輸入在插入點處輸入文檔的內(nèi)容。如果當(dāng)前的編輯狀態(tài)為Insert〔插入〕,輸入程序文本后,插入點自動向后移動。如果當(dāng)前的編輯狀態(tài)為改寫,輸入程序文本后,當(dāng)前輸入的文本會顯示在窗口中,并自動覆蓋插入點后的文本,直到停止輸入。插入和改寫狀態(tài)切換是通過按Insert功能鍵來實現(xiàn)的,在編輯窗口上的提示行中有“Insert”信息時表示當(dāng)前的狀態(tài)為插入狀態(tài),否那么為改寫狀態(tài)。在

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論