还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
2.2通用发声程序设计原理PC机发声系统以8254的2号计数器为核心系统初始化时,2号计数器I作在“方波发生器”方式,初值为二进制数,,写入顺序为先低后高,CLK2为1.193182MHz,当计数初值为533H时,OUT2输出的方波大约为900Hz,经过简单的滤波之后,送至扬声器改变
1.4号计数器的计数初值就可以使扬声器发出不同频率的音响ROMBIOS中有个BEEP子程序这能根据BL中组出的时间计数值控制8254定时器产生持续时间为1个或几个
0.5秒频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我们的通用发声程序应能产生任一频率的声音其次,BEEP产生声音的持续时间(音长)只能是
0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为533H×896÷给定频率=123280H÷给定频率发声程序包括3个步骤
(1)在8253中的42端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值
(2)在8253中的42H端口Timer2装入一个16位的计数值(533H×895/频率),以建立将要产生的声音频率
(3)把输出端口61H的PB
0、PB1两位置1,发出声音对于发音部分PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H由PPI输出寄存器中的
0、1两位来选择扬声器的驱动方式连接到扬声器上的是定时器2,从上图可以看到,GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连当PB1=1时,允许OUT2的输出信号到达扬声器电路因此,只有PB0和PB1同时为“1”时,才能驱动扬声器地声通过以下指令实现INAL,61HORAL,3OUT61H,AL上面的指令用以打开扬声器,如要关闭扬声器时则为ANDAL,0FCHOUT61H,AL当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表TABLEDW493,440,392,349,329,293,261把相应的频率送到一个寄存器上,通过公式计数值=533H×896÷f=1234DCH÷f算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波在把计数值送8253前,必须先把8253进行初始化MOVAL,0B6HOUT43H,AL使其选用通道2,工作在方式3下就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的A口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波这个方波经驱动放大就可以使扬声器发出相应的声音所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声8253的主要任务就是产生所要求发声的不同频率的方波
3、详细设计
3.1主要的宏和过程的实现
3.
1.1DISPLAY显示宏为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏将b的地址传到DX随后调用DOS09号功能调用将字符串显示到屏幕调用DISPLAY的实例为DISPLAYINFO1DISPLAYINFO2DISPLAYINFO3DISPLAYMUSLIST在此段代码中,程序显示提示作用的字符串和歌曲列表DISPLAY宏具体实现如下DISPLAYMACRObLEADXbMOVAH9INT21HENDM
3.
1.2ADDRESS音乐地址宏歌曲包含节拍和频率此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声音乐地址宏实现如下ADDRESSMACROABLEASIALEABPDS:BENDM
3.
1.3MUSIC宏在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束若该频率不为-1调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束如频率不为0,继续将该音符发声,并循环此过程具体实现方法如下MUSICPROCNEARPUSHDSSUBAXAXPUSHAXFREG:MOVDI[SI]CMPDI-1JEEND_MUSMOVBXDS:[BP]CALLGENSOUNDADDSI2ADDBP2JMPFREGEND_MUS:RETMUSICENDP
3.
1.4通用发生程序GENSOUND该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序该程序包括以下三个步骤
(1)在8253/54中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值
(2)在8253/54中的42H端口装入一个16位计数值,已建立将要产生的声音频率
(3)把输出端口61H的
0、1两位置1,发出声音具体实现如下GENSOUNDPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDIMOVAL0B6HOUT43HALMOVDX12HMOVAX348chDIVDIOUT42HALMOVALAHOUT42HALINAL61HMOVAHALORAL3OUT61HALWAIT1:MOVCX3314callwaitfDELAY1:DECBXJNZWAIT1MOVALAHOUT61HALPOPDIPOPDXPOPCXPOPBXPOPAXRETGENSOUNDENDP该GENSOUND程序能产生19~65535Hz的声音,这个频率的下限是使除法不产生溢出的最小值其上限65535是多余的,因为人能听到的声音最高频率为20000Hz此外一般情况下,GENSOUND程序产生的声音不单单和频率有关,还和CPU有关CPU工作频率越高,时延越短,产生的声音越急促为了使程序产生一个与CPU工作频率无关的合适时延,在MUSCI中调用了一个时间延时程序WAITF
3.
1.5WAITF延时程序80x86的各种处理器采取了6~66MHz的工作频率,loop指令的执行时间在这些处理器上也不相同为了建立一个与处理器无关的延时,IBM采用了一种利用硬件产生时间延时的方法,即通过监控端口61H和PB4,使PB4每
15.08微秒触发一次,一产生一个固定不变的时间基准在IBMPCATBIOS的WAITF子程序,就是一个产生Nx
15.08微秒时间演示的程序调用WAITF子程序时,CX寄存器必须装入
15.08微秒的倍数N利用WAITF子程序能获得任意的时间延时,而不必在考虑CPU的型号和工作频率具体实现如下waitfprocnearpushaxwaitf1:inal61handal10hcmpalahjewaitf1movahalloopwaitf1popaxretwaitfendp
3.
1.6CLEAR清屏程序当程序初始化或用户输入错误时,程序调用CLEAR清屏程序清屏程序将AX、BX、CX、DX先入栈,以保存现场,保证清屏后重新执行不会出现错误随后启用BIOS功能调用,将屏幕初始化或上卷其中AL=0表示初始化窗口,AL=上卷行数,BH=卷入行属性,CH/CL=左上角行/列号,DH/DL=右上角行/列号该程序段表示从左起0行0列到右起24行79列全部清屏将屏幕清空后重新将AX、BX、CX、DX出栈clearprocnearpushaxpushbxpushcxpushdxmovah6moval0movch0movcl0movdh24movdl79movbh7int10hpopdxpopcxpopbxpopaxretclearendp
3.
1.7RETU退出当程序要求退出时,主程序会调用RETU进行退出RETU程序内容实际为一个BIOS功能调用RETU:MOVAH4CHINT21H
3.2主程序实现
3.
2.1数据段定义数据段分别定义了INFO
1、INFO
2、INFO
3、INFO
4、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,3DUP330DW3DUP294,330,392,392DW330,294,262,294,4DUP330DW294,294,330,294,262,-l设置该乐曲的节拍时间表如下一般延迟时间取10ms的倍数MUSl—TDW6DUP25*8,50*8DW2DUP25*8,25*8,50*8DW12DUP25*8,100*
83.
2.2堆栈段定义程序定义了一个长度了200的堆栈段,如下STACKSEGMENTDB200DUPSTACKSTACKENDS
3.
2.3初始化程序初始化使用了BIOS功能调用使用0AH号功能设置显示方式本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示若要求改变显示方式,可以根据0AH功能设置表自行添加START:MOVAXDATAMOVDSAXMOVaH0MOVAL00INT10H
3.
2.4程序执行过程详细参见附录中INPUT部分,以及程序流程图图4-4程序报错要求重新输入图4-5播放后退出
5、收获体会经过一周的磨炼和努力,在老师的耐心指导和同学的热情帮助下,无论从学习上还是从自身角度,我自认都提高的非常迅速,发现了自己的能力和未被挖掘的潜力,认证了自身的坚强与韧力,总结出只有在强压与竞争中才会有意想不到的收获和进步这次汇编课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学;从死记硬背的模式中脱离出来,转变为在实践中学习,增强了领悟、创新和推断的能力掌握自学的方法,形成工程理论整体模式,使工作、学习、生活都步入系统化流程;思考方式成熟,逻辑性规范、明确这些方法的提高是终身受益的,我认为这难得的一周,让我真正懂得了生活和学习的基本规律紧张忙碌的课程设计虽然在历经一个周的时间后结束了,完成了课程设计的任务,但是从中发现的问题也是值得去深思的我想经过这一个周的课程设计所发现的问题对我们会有很大的启示,在以后的学习中也会大有帮助在以后的学习中我会不断的改进学习方法,在实践中学习,不断提高自我,完美自我,全面提高自己
6、附录本程序的代码如下DATASEGMENTINFO1DB0DH0AHwelcometothisprograme!$INFO2DB0DH0AHtherearesomemusic!$INFO3DB0DH0AHpleaseselectwhichonetoplay!$INFO4DB0DH0AHinputerror!$INFO5DB0DH0AHpleaseinputagain!$MUSLISTDB0DH0AHAMUSIC:MaryhasalittleshipDB0DH0AHBMUSIC:theboatonTaihulakeDB0DH0AHCMUSIC:twotigerDB0DH0AHQEXITdb0dh0ah$;******************************************音乐一玛丽有只小羊羔MUS_FREG1DW3302942622943DUP330DW3DUP294330392392DW3302942622944DUP330DW294294330294262-1MUS_TIME1DW6DUP25*850*8DW2DUP25*825*850*8DW12DUP25*8100*8;*******************************************音乐二太湖船MUS_FREG2DW330392330294330392330294330DW330392330294262294330392294DW262262220196196220262294332262-1MUS_TIME2DW3DUP502525502525100DW2DUP50502525100DW3DUP502525100;******************************************音乐三两只老虎MUS_FREG3DW262294330262DW262294330262DW330349392DW330349392DW392440392349330262DW392440392349330262DW294196262DW294196262-1MUS_TIME3DW5050100100100DW1001005050100100DW1001001005050100DW10010010010010050DW50100100100100100DATAENDS;***********************************************************STACKSEGMENTDB200DUPSTACKSTACKENDSCODESEGMENTASSUMEDS:DATASS:STACKCS:CODESTART:MOVAXDATAMOVDSAXMOVaH0MOVAL00INT10H;**********定义一个宏显示DISPLAYMACRObLEADXbMOVAH9INT21HENDM;**********************音乐地址宏ADDRESSMACROABLEASIALEABPDS:BENDM;***********************DISPLAYINFO1DISPLAYINFO2DISPLAYINFO3DISPLAYMUSLISTINPUT:MOVAH01HINT21HCMPALQJZretuCMPALAJNZB0ADDRESSMUS_FREG1MUS_TIME1CALLMUSICJMPEXIT1B0:CMPALBJNZC0ADDRESSMUS_FREG2MUS_TIME2CALLMUSICJMPEXIT1C0:CMPALCJNZexitADDRESSMUS_FREG3MUS_TIME3CALLMUSICEXIT1:DISPLAYINFO5JMPINPUTEXIT:callclearDISPLAYINFO4DISPLAYINFO5DISPLAYINFO1DISPLAYINFO2DISPLAYINFO3DISPLAYMUSLISTjmpinputRETU:MOVAH4CHINT21H;******************************************发声GENSOUNDPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDIMOVAL0B6HOUT43HALMOVDX12HMOVAX348chDIVDIOUT42HALMOVALAHOUT42HALINAL61HMOVAHALORAL3OUT61HALWAIT1:MOVCX3314callwaitfDELAY1:DECBXJNZWAIT1MOVALAHOUT61HALPOPDIPOPDXPOPCXPOPBXPOPAXRETGENSOUNDENDP;********************************************waitfprocnearpushaxwaitf1:inal61handal10hcmpalahjewaitf1movahalloopwaitf1popaxretwaitfendp;*********************************************音乐播放MUSICPROCNEARPUSHDSSUBAXAXPUSHAXFREG:MOVDI[SI]CMPDI-1JEEND_MUSMOVBXDS:[BP]CALLGENSOUNDADDSI2ADDBP2JMPFREGEND_MUS:RETMUSICENDP;************************************clear!!!清屏程序clearprocnearpushaxpushbxpushcxpushdxmovah6moval0movch0movcl0movdh24movdl79movbh7int10hpopdxpopcxpopbxpopaxretclearendpCODEENDSENDSTART清屏,提示输入错误,要求重新输入歌曲播放完后,输入Q退出程序。