郑州航空工业管理学院微机原理课程设计说明书2012级电气工程及其自动化专业1206971XX班级题目音乐演奏姓名XXX学号1206971XX指导教师XXX职称博士二О一二年十二月十三日摘要大学生动手能力的培养和提高一直是教育工作者探索的课题,《微机原理与接口技术》就是一门实用性很强的课程。如何让学生在学好基础知识的同时,迅速掌握设计应用技术,其中实验与课程设计环节起着非常重要的作用。通过此次课程设计,使学生能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。众所周知,随着科学技术的迅猛发展,计算机在各个领域的应用越来越广泛。计算机已成为人们生活、学习、工作中必备的工具。其中,汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。本次课程设计的过程重视基础、系统性和使用性相结合,以80X86未处理器为对象,以8253/8254为计数器的核心,通过宏指令和BOIS系统功能的调用,以及运用MASM软件在PC机上来进行调试和运行,从而模拟地来实现“音乐演奏”的目的。本次课程设计过程中,我们组得到了老师的热情帮助,并且参考了一些大学生电子设计竞赛的一些设计资料和一些书籍,在此谨向我的老师以及其作者表示衷心的感谢。关键词:MASM软件、汇编语言一、音乐演奏的基本原理这次课程设计的设计思想是在熟练掌握汇编程序的设计方法的基础上,利用通用发生程序编写音乐程序.组成音乐的每个音符的频率值和持续时间是音乐程序发声所需要的两个数据,根据音调与频率和时间之间的关系,把要编辑的音乐的每个音符的频率和持续时间进行定义,进而把它们写入通用发声程序,音乐程序就完成。在编制此音乐演奏程序时,应该知道ROMBIOS中有个BEEP子程序,这能根据BL中组出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。首先要了解计算机是如何产生声音和乐曲的。找出相关程序源代码,弄清楚各功能的环节间的联系、联接方法,搞清楚单调与频率和时间的关系,利用计算机控制发声的原理,依照基本的算法思想写程序,测试,更正,扩充功能,修饰细节。二、设计方案(一)、设计内容要求完成一个音乐程序,即通过按下键盘上某个按键就可以按预先设定的程序播放音乐或者终止程序。当键入大写字母“A”时,唱乐曲“玛丽有只小羔羊”;当键入大写字母“B”,唱乐曲“祝福歌”;当键入大写字母“C”,唱乐曲“两只老虎”;当键入大写字母Q鍵,退出。此程序涉及到过程和宏的调用,要求学生掌握关于过程和宏的定义和使用。可以设定播放某一段音乐为一个过程,设定对音乐进行播放的操作为一个宏操作。(二)、主要的宏和过程的实现1.DISPLAY显示宏为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。将b的地址传到DX。随后调用DOS09号功能调用。将字符串显示到屏幕。调用DISPLAY的实例为:DISPLAYINFO1DISPLAYINFO2DISPLAYINFO3DISPLAYMUSLIST在此段代码中,程序显示提示作用的字符串和歌曲列表。DISPLAY宏具体实现如下:DISPLAYMACROBLEADX,BMOVAH,9INT21HENDM2.音乐地址宏歌曲包含节拍和频率。此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP。当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声。音乐地址宏实现如下:ADDRESSMACROA,BLEASI,ALEABP,DS:BENDM3.MUSIC宏在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1。在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束。若该频率不为-1。调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声。发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。如频率不为0,继续将该音符发声,并循环此过程。具体实现方法如下:MUSICPROCNEARPUSHDSSUBAX,AXPUSHAXFREG:MOVDI,[SI]CMPDI,-1JEEND_MUSMOVBX,DS:[BP]CALLGENSOUNDADDSI,2ADDBP,2JMPFREGEND_MUS:RETMUSICENDP4.通用发声程序GENSOUND该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:(1)在8253/54中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值。(2)在8253/54中的42H端口装入一个16位计数值,已建立将要产生的声音频率。(3)把输出端口61H的0、1两位置1,发出声音。具体实现如下:GENSOUNDPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDIMOVAL,0B6HOUT43H,ALMOVDX,12HMOVAX,348CHDIVDIOUT42H,ALMOVAL,AHOUT42H,ALINAL,61HMOVAH,ALORAL,3OUT61H,ALWAIT1:MOVCX,3314CALLWAITFDELAY1:DECBXJNZWAIT1MOVAL,AHOUT61H,ALPOPDIPOPDXPOPCXPOPBXPOPAXRETGENSOUNDENDP该GENSOUND程序能产生19~65535Hz的声音,这个频率的下限是使除法不产生溢出的最小值。其上限65535是多余的,因为人能听到的声音最高频率为20000Hz。此外一般情况下,GENSOUND程序产生的声音不单单和频率有关,还和CPU有关。CPU工作频率越高,时延越短,产生的声音越急促。为了使程序产生一个与CPU工作频率无关的合适时延,在MUSCI中调用了一个时间延时程序WAITF。5.WAITF延时程序80x86的各种处理器采取了6~66MHz的工作频率,loop指令的执行时间在这些处理器上也不相同。为了建立一个与处理器无关的延时,IBM采用了一种利用硬件产生时间延时的方法,即通过监控端口61H和PB4,使PB4每15.08微秒触发一次,一产生一个固定不变的时间基准。在IBMPCATBIOS的WAITF子程序,就是一个产生Nx15.08微秒时间演示的程序。调用WAITF子程序时,CX寄存器必须装入15.08微秒的倍数N。利用WAITF子程序能获得任意的时间延时,而不必在考虑CPU的型号和工作频率。具体实现如下:WAITFPROCNEARPUSHAXWAITF1:INAL,61HANDAL,10HCMPAL,AHJEWAITF1MOVAH,ALLOOPWAITF1POPAXRETWAITFENDP6.CLEAR清屏程序当程序初始化或用户输入错误时,程序调用CLEAR清屏程序。清屏程序将AX、BX、CX、DX先入栈,以保存现场,保证清屏后重新执行不会出现错误。随后启用BIOS功能调用,将屏幕初始化或上卷。其中AL=0表示初始化窗口,AL=上卷行数,BH=卷入行属性,CH/CL=左上角行/列号,DH/DL=右上角行/列号。该程序段表示从左起0行0列到右起24行79列全部清屏。将屏幕清空后重新将AX、BX、CX、DX出栈。CLEARPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVAH,6MOVAL,0MOVCH,0MOVCL,0MOVDH,24MOVDL,79MOVBH,7INT10HPOPDXPOPCXPOPBXPOPAXRETCLEARENDP7.RETU退出当程序要求退出时,主程序会调用RETU进行退出。RETU程序内容实际为一个BIOS功能调用。RETU:MOVAH,4CHINT21H(三)、主程序实现1.数据段定义数据段分别定义了INFO1、INFO2、INFO3、INFO4、INFO5各字符串分别显示程序运行之初对用户的提示。MUSLIST中显示用户能选择的三首歌曲列表。程序用MUS_FREG、MUS_TIME分别定义了音乐频率和节拍。使得发声程序可以按照理想的要求发出连续的乐曲。节拍和频率定义原理如下:乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。可参考下表:音名CDEFGABCDEFGABC唱名12345671234567i频率(HZ)131147165175196220247262294330349392440492523其中,低音阶从低音C(131HZ)到中央C(262HZ),高音阶从中央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.堆栈段定义程序定义了一个长度了200的堆栈段,如下:STACKSEGMENTDB200DUP('STACK')STACKENDS3.初始化程序初始化使用了BIOS功能调用。使用0AH号功能设置显示方式。本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示。若要求改变显示方式,可以根据0AH功能设置表自行添加。START:MOVAX,DATAMOVDS,AXMOVAH,0MOVAL,00INT10H(四)、程序的调试运行将源程序编写后,在PC机上编译、连接、装载。如图4-1,图4-2。图4-1准备编译程序图4-2编译连接正确待装载成功后,运行程序,运行情况如图4-3,图4-4,图4-5。图4-3程序初始界面显示歌曲列表,提示用户输入编译正确图4-4程序键入大写字母B图4-5播放后退出歌曲播放完后,输入Q退出程序播放祝福歌曲三、软件设计(一)、主程序流程图开始显示提示信息接收键盘输入是“Q”?是“A”?是“C”?是“B”?退出程序将音乐节拍频率地址导入ADDRESS调用MUSIC,播放音乐显示错误提示调用清屏程序是是是是否否否否图1-1主系统流程图(二)、子程序流程图:(三)、程序代码DATASEGMENTINFO1DB0DH,0AH,'WELCOMEYOUTOCOMMEHERE!$'INFO2DB0DH,0AH,'Thisisamusicprogram!$'INFO3DB0DH,0AH,'pleasese