自动化专业课程设计报告《微机原理及应用课程设计》计算机仿真电子琴班级:自动化09-1姓名:许丹阳学号:0918120123时间:2011年12月19号至12月23号地点:电信实验中心第六实验室指导教师:李向军大连海洋大学信息工程学院自动化研究室大连海洋大学实验报告纸学院(系):专业班级:姓名:学号:题目:计算机仿真电子琴一、课程设计的目的与要求1、课程设计的设计目的本课程的课程设计是自动化专业学生学习完《微机原理及应用》课程后,进行的一次以汇编语言为主,硬件设计为辅的综合训练。本课程设计的目的在于加深对微机原理基本知识的理解,掌握汇编语言程序设计的基本方法;掌握运用微机原理开发系统的基本方法。2、课程设计的要求从课程设计的目的出发,通过设计工作的各个环节,达到以下要求:1、掌握汇编语言程序设计的基本方法以及课程设计所涉及到的基本理论。2、理解硬件电路的工作原理。3、进一步理解各种接口电路的应用,例如8255并行接口,8253定时器等。4、掌握利用PC机扬声器发出不同频率声音的方法。5、自行设计软件流程图,编制程序。6、调试程序使其能正常运行。7、设计完成后,写出设计总结。3、课程设计的性能指标1、在程序运行时使PC即成为一架可弹奏的电子琴。当按下数字键1-8时,依次发出1,2,3,4,5,6,7,I这八个音调。按下CTRL+C或者回车则退出电子琴状态。2、在程序运行时使PC自动按要求提示演奏乐曲。2、课程设计课题的分析2.1主要的宏和过C程的实现2.1.SHOW显示宏为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。将b的地址传到DX。随后调用DOS09号功能调用。将字符串显示到屏幕。调用SHOW的实例为:SHOWINFO1SHOWINFO2SHOWINFO3SHOWMUSLIST在此段代码中,程序显示提示作用的字符串和歌曲列表。SHOW宏具体实现如下:SHOWMACRObLEADX,bMOVAH,9INT21HENDM2.1.2ADDRESS音乐地址宏歌曲包含节拍和频率。此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP。当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声。音乐地址宏实现如下:ADDRESSMACROA,BLEASI,ALEABP,DS:BENDM2.1.3MUSIC宏在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1。在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束。若该频率不为-1。调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声。发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。如频率不为-1,继续将该音符发声,并循环此过程。具体实现方法如下:MUSICPROCNEARPUSHDSSUBAX,AXPUSHAXFREG:MOVDI,[SI]CMPDI,-1JEEND_MUSMOVBX,DS:[BP]CALLGENSOUNDADDSI,2ADDBP,2JMPFREGEND_MUS:RETMUSICENDP2.1.4通用发生程序GENSOUND该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:(1)在8253/54中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值。(2)在8253/54中的42H端口装入一个16位计数值,已建立将要产生的声音频率。(3)把输出端口61H的0、1两位置1,发出声音。具体实现如下:GENSOUNDPROCMOVBX,200PUSHAXPUSHBXPUSHCXPUSHDXPUSHDIMOVAL,0B6HOUT43H,ALMOVDX,12HMOVAX,533H*896DIVDIOUT42H,ALMOVAL,AHOUT42H,ALINAL,61HMOVAH,ALORAL,3OUT61H,ALPUSHAXWAIT1:MOVCX,1200DELA1:INAL,61HANDAL,10HCMPAL,AHJEDELA1MOVAH,ALLOOPDELA1DECBXJNZWAIT1POPAXMOVAL,AHOUT61H,ALPOPDIPOPDXPOPCXPOPBXPOPAXRETGENSOUNDENDP该GENSOUND程序能产生19~65535Hz的声音,这个频率的下限是使除法不产生溢出的最小值。其上限65535是多余的,因为人能听到的声音最高频率为20000Hz。此外一般情况下,GENSOUND程序产生的声音不单单和频率有关,还和CPU有关。CPU工作频率越高,时延越短,产生的声音越急促。为了使程序产生一个与CPU工作频率无关的合适时延,在MUSCI中调用了一个时间延时程序WAITF。2.1.5RETU退出当程序要求退出时,主程序会调用RETU进行退出。RETU程序内容实际为一个BIOS功能调用。RETU:MOVAH,4CHINT21H 2.2主程序实现2.2.1数据段定义数据段分别定义了INFO1、INFO2、INFO3、INFO4、INFO5各字符串分别显示程序运行之初对用户的提示。MUSLIST中显示用户能选择的三首歌曲列表。程序用MUS_FREG、MUS_TIME分别定义了音乐频率和节拍。使得发声程序可以按照理想的要求发出连续的乐曲。节拍和频率定义原理如下:乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。可参考下表:音名CDEFGABC唱名1234567i频率(HZ)262294330349392440492523其中,阶从低音C(262HZ)到高音C(523HZ)。组成乐曲的音符的频率值和持续时间是乐曲程序发声所必需的两组数据,频率可以查上表,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。在4/4拍中,四分音符为一拍,每小节四拍,全音符持续四拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍。如果给全音符分配1秒(100*10ms)的时间,则二分音符持续时间为0.5秒,四分音符持续时间为0.25秒,八分音符持续时间为0.125秒。知道了音调及频率、时间的关系后,可以按照乐曲的乐谱将每个音符的频率和持续时间定义为两个数据表,然后编写程序依次取出表中的频率值和时间值。“玛丽有只小羊羔”的乐谱如下:3212|333—|222—|355—|3212|3333|2232|1——|可设置该乐曲的频率表如下:MUS1_FDW330,294,262,294,3DUP(330)DW3DUP(294),330,392,392DW330,294,262,294,4DUP(330)DW294,294,330,294,262,-l设置该乐曲的节拍时间表如下:一般延迟时间取10ms的倍数。MUSl-TDW6DUP(25*8),50*8DW2DUP(25*8,25*8,50*8)DW12DUP(25*8),100*82.2.2堆栈段定义程序定义了一个长度了200的堆栈段,如下:STACKSEGMENTDB200DUP('STACK')STACKENDS2.2.3初始化程序初始化使用了BIOS功能调用。使用0AH号功能设置显示方式。本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示。若要求改变显示方式,可以根据0AH功能设置表自行添加。START:MOVAX,DATAMOVDS,AXMOVaH,0MOVAL,00INT10H2.2.4程序执行过程详细参见附录中INPUT部分,以及程序流程图。主流程图乐曲演奏子程序工作流程图电子琴子程序工作流程图三、课程设计的结果1、程序代码如下:DATASEGMENTINFO1DB0AH,0DH,'WELCOMEYOUTOCOMEHERE!MYDEARTEACHER$'DB0AH,0DH,'THISISAMUSICPROGRAM!'DB0AH,0DH,'PLEASESELECLTWHICHSONGYOULIKEBEST!'INFO4DB0AH,0DH,'INPUTERROR!$'INFO5DB0AH,0DH,'PLEASEINPUTAGAIN!$'MUSLISTDB0AH,0DH,'========================='DB0AH,0DH,'Press1HuanLeSong'DB0AH,0DH,'Press2TWOTIGERS'DB0AH,0DH,'Press3SCALEPLAY'DB0AH,0DH,'Press4EXIT'DB0AH,0DH,'========================='DB0AH,0DH,'$'MUS_FRQ1DW330,330,350,393,393,350,330,294DW262,262,294,330,330,294,294DW330,330,350,393,393,350,330,294DW262,262,294,330,294,262,262DW294,294,330,262,294,330,350,330,262DW294,330,350,330,262,262,294,393DW330,330,350,393,393,350,330,294DW262,262,294,330,294,262,262,-1MUS_TIM1DW50,50,100,100,100DW100,100,50,50,100,100DW100,100,100,50,50,100DW100,100,100,100,100,50DW50,100,100,100,100,100MUS_FRQ2DW262,294,330,262DW262,294,330,262DW330,349,392DW330,349,392DW392,440,392,349,330,262DW392,440,392,349,330,262DW294,196,262DW294,196,262,-1MUS_TIM2DW200,4DUP(100),200,200,200DW200,4DUP(100),200,200,200DW200,4DUP(100),200DW4DUP(100),200,4DUP(100),400TABLEDW262,294,330,349,392,440,494,525NUMBDB0AH,0DH,'Keyboardnumber1~8keysplaynotesofthescale'DB0AH,0DH,'EnterorCtrl+Ctoexit'DB0AH,0DH,'$'DATAENDSSTACKSEGMENTPARASTACK'STACK'STADB200DUP('STACK')STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODE,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXMOVaH,1MOVAL,00INT10HSHOWMACROBMOVDX,OFFSETBMOVAH,09HINT21HENDMSHOWINFO1LOP:SHOWMUSLISTMOVAH,01HINT21HCMPAL,34HJZRETUCMPAL,31HJNZc0CALLMUSIC1JMPEXIT1C0:CMPAL,32HJNZE0CALLMUSIC2JMPEXIT1E0:CMPAL,33HJNZEXITSHOWNUMBCALLMUSIC3EXIT1:SHOWINFO5JMPLOPEXIT:SHOWINFO4SHOWINFO5JMPLOPRETU:MOVAX,4C00HINT21HMUSIC1PROCLEASI,MUS_FRQ1LEABP,DS:MUS_T