汇编音乐乐曲演奏程序.docx
- 文档编号:6088041
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:25
- 大小:159.27KB
汇编音乐乐曲演奏程序.docx
《汇编音乐乐曲演奏程序.docx》由会员分享,可在线阅读,更多相关《汇编音乐乐曲演奏程序.docx(25页珍藏版)》请在冰点文库上搜索。
汇编音乐乐曲演奏程序
目录
1、问题定义2
1.1设计目的2
1.2设计内容2
2、需求分析3
2.1流程图3
2.2通用发声程序设计原理4
3、详细设计6
3.1主要的宏和过程的实现6
3.1.1DISPLAY显示宏6
3.1.2ADDRESS音乐地址宏6
3.1.3MUSIC宏7
3.1.4通用发生程序GENSOUND8
3.1.5WAITF延时程序9
3.1.6CLEAR清屏程序10
3.1.7RETU退出11
3.2主程序实现11
3.2.1数据段定义11
3.2.2堆栈段定义12
3.2.3初始化13
3.2.4程序执行过程13
4、系统调试14
5、收获体会17
6、附录18
7、参考文献25
1、问题定义
1.1设计目的
1.使学生能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。
2.培养学生综合运用所学知识独立完成汇编程序课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
1.2设计内容
要求完成一个音乐程序,即通过按下键盘上某个按键就可以按预先设定的程序播放音乐或者终止程序。
(比如:
按大写字母“A”,唱乐曲“玛丽有只小羔羊”;按大写字母“B”,唱乐曲“太湖船”按大写字母“C”,唱乐曲“两只老虎”;按"Q"鍵,退出。
)
此程序涉及到过程和宏的调用,要求学生掌握关于过程和宏的定义和使用。
(比如:
可以设定播放某一段音乐为一个过程,设定对音乐进行播放的操作为一个宏操作。
)
2、需求分析
2.1流程图
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的PB0、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,61H
ORAL,3
OUT61H,AL
上面的指令用以打开扬声器,如要关闭扬声器时则为:
ANDAL,0FCH
OUT61H,AL
当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表:
TABLEDW493,440,392,349,329,293,261
把相应的频率送到一个寄存器上,通过公式:
计数值=533H×896÷f=1234DCH÷f
算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波。
在把计数值送8253前,必须先把8253进行初始化:
MOVAL,0B6H
OUT43H,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的实例为:
DISPLAYINFO1
DISPLAYINFO2
DISPLAYINFO3
DISPLAYMUSLIST
在此段代码中,程序显示提示作用的字符串和歌曲列表。
DISPLAY宏具体实现如下:
DISPLAYMACROb
LEADX,b
MOVAH,9
INT21H
ENDM
3.1.2ADDRESS音乐地址宏
歌曲包含节拍和频率。
此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP。
当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声。
音乐地址宏实现如下:
ADDRESSMACROA,B
LEASI,A
LEABP,DS:
B
ENDM
3.1.3MUSIC宏
在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。
为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1。
在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束。
若该频率不为-1。
调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声。
发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。
如频率不为0,继续将该音符发声,并循环此过程。
具体实现方法如下:
MUSICPROCNEAR
PUSHDS
SUBAX,AX
PUSHAX
FREG:
MOVDI,[SI]
CMPDI,-1
JEEND_MUS
MOVBX,DS:
[BP]
CALLGENSOUND
ADDSI,2
ADDBP,2
JMPFREG
END_MUS:
RET
MUSICENDP
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,发出声音。
具体实现如下:
GENSOUNDPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAL,0B6H
OUT43H,AL
MOVDX,12H
MOVAX,348ch
DIVDI
OUT42H,AL
MOVAL,AH
OUT42H,AL
INAL,61H
MOVAH,AL
ORAL,3
OUT61H,AL
WAIT1:
MOVCX,3314
callwaitf
DELAY1:
DECBX
JNZWAIT1
MOVAL,AH
OUT61H,AL
POPDI
POPDX
POPCX
POPBX
POPAX
RET
GENSOUNDENDP
该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子程序,就是一个产生Nx15.08微秒时间演示的程序。
调用WAITF子程序时,CX寄存器必须装入15.08微秒的倍数N。
利用WAITF子程序能获得任意的时间延时,而不必在考虑CPU的型号和工作频率。
具体实现如下:
waitfprocnear
pushax
waitf1:
inal,61h
andal,10h
cmpal,ah
jewaitf1
movah,al
loopwaitf1
popax
ret
waitfendp
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出栈。
clearprocnear
pushax
pushbx
pushcx
pushdx
movah,6
moval,0
movch,0
movcl,0
movdh,24
movdl,79
movbh,7
int10h
popdx
popcx
popbx
popax
ret
clearendp
3.1.7RETU退出
当程序要求退出时,主程序会调用RETU进行退出。
RETU程序内容实际为一个BIOS功能调用。
RETU:
MOVAH,4CH
INT21H
3.2主程序实现
3.2.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,392
DW330,294,262,294,4DUP(330)
DW294,294,330,294,262,-l
设置该乐曲的节拍时间表如下:
一般延迟时间取10ms的倍数。
MUSl—TDW6DUP(25*8),50*8
DW2DUP(25*8,25*8,50*8)
DW12DUP(25*8),100*8
3.2.2堆栈段定义
程序定义了一个长度了200的堆栈段,如下:
STACKSEGMENT
DB200DUP('STACK')
STACKENDS
3.2.3初始化
程序初始化使用了BIOS功能调用。
使用0AH号功能设置显示方式。
本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示。
若要求改变显示方式,可以根据0AH功能设置表自行添加。
START:
MOVAX,DATA
MOVDS,AX
MOVaH,0
MOVAL,00
INT10H
3.2.4程序执行过程
详细参见附录中INPUT部分,以及程序流程图。
4、系统调试
将源程序编写后,在pc机上编译、连接、装载。
如图4-1,图4-2。
图4-1准备编译程序
图4-2编译连接正确
待装载成功后,运行程序,运行情况如图4-3,图4-4,图4-5。
图4-3程序初始界面
图4-4程序报错要求重新输入
图4-5播放后退出
5、收获体会
经过一周的磨炼和努力,在老师的耐心指导和同学的热情帮助下,无论从学习上还是从自身角度,我自认都提高的非常迅速,发现了自己的能力和未被挖掘的潜力,认证了自身的坚强与韧力,总结出只有在强压与竞争中才会有意想不到的收获和进步。
这次汇编课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学;从死记硬背的模式中脱离出来,转变为在实践中学习,增强了领悟、创新和推断的能力。
掌握自学的方法,形成工程理论整体模式,使工作、学习、生活都步入系统化流程;思考方式成熟,逻辑性规范、明确。
这些方法的提高是终身受益的,我认为这难得的一周,让我真正懂得了生活和学习的基本规律。
紧张忙碌的课程设计虽然在历经一个周的时间后结束了,完成了课程设计的任务,但是从中发现的问题也是值得去深思的。
我想经过这一个周的课程设计所发现的问题对我们会有很大的启示,在以后的学习中也会大有帮助。
在以后的学习中我会不断的改进学习方法,在实践中学习,不断提高自我,完美自我,全面提高自己。
6、附录
本程序的代码如下:
DATASEGMENT
INFO1DB0DH,0AH,'welcometothisprograme!
$'
INFO2DB0DH,0AH,'therearesomemusic!
$'
INFO3DB0DH,0AH,'pleaseselectwhichonetoplay!
$'
INFO4DB0DH,0AH,'inputerror!
$'
INFO5DB0DH,0AH,'pleaseinputagain!
$'
MUSLISTDB0DH,0AH,'AMUSIC:
Maryhasalittleship'
DB0DH,0AH,'BMUSIC:
theboatonTaihulake'
DB0DH,0AH,'CMUSIC:
twotiger'
DB0DH,0AH,'QEXIT'
db0dh,0ah,'$'
;******************************************音乐一玛丽有只小羊羔
MUS_FREG1DW330,294,262,294,3DUP(330)
DW3DUP(294),330,392,392
DW330,294,262,294,4DUP(330)
DW294,294,330,294,262,-1
MUS_TIME1DW6DUP(25*8),50*8
DW2DUP(25*8,25*8,50*8)
DW12DUP(25*8),100*8
;*******************************************音乐二太湖船
MUS_FREG2DW330,392,330,294,330,392,330,294,330
DW330,392,330,294,262,294,330,392,294
DW262,262,220,196,196,220,262,294,332,262,-1
MUS_TIME2DW3DUP(50),25,25,50,25,25,100
DW2DUP(50,50,25,25),100
DW3DUP(50,25,25),100
;******************************************音乐三两只老虎
MUS_FREG3DW262,294,330,262
DW262,294,330,262
DW330,349,392
DW330,349,392
DW392,440,392,349,330,262
DW392,440,392,349,330,262
DW294,196,262
DW294,196,262,-1
MUS_TIME3DW50,50,100,100,100
DW100,100,50,50,100,100
DW100,100,100,50,50,100
DW100,100,100,100,100,50
DW50,100,100,100,100,100
DATAENDS
;***********************************************************
STACKSEGMENT
DB200DUP('STACK')
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVaH,0
MOVAL,00
INT10H
;**********定义一个宏显示
DISPLAYMACROb
LEADX,b
MOVAH,9
INT21H
ENDM
;**********************音乐地址宏
ADDRESSMACROA,B
LEASI,A
LEABP,DS:
B
ENDM
;***********************
DISPLAYINFO1
DISPLAYINFO2
DISPLAYINFO3
DISPLAYMUSLIST
INPUT:
MOVAH,01H
INT21H
CMPAL,'Q'
JZretu
CMPAL,'A'
JNZB0
ADDRESSMUS_FREG1,MUS_TIME1
CALLMUSIC
JMPEXIT1
B0:
CMPAL,'B'
JNZC0
ADDRESSMUS_FREG2,MUS_TIME2
CALLMUSIC
JMPEXIT1
C0:
CMPAL,'C'
JNZexit
ADDRESSMUS_FREG3,MUS_TIME3
CALLMUSIC
EXIT1:
DISPLAYINFO5
JMPINPUT
EXIT:
callclear
DISPLAYINFO4
DISPLAYINFO5
DISPLAYINFO1
DISPLAYINFO2
DISPLAYINFO3
DISPLAYMUSLIST
jmpinput
RETU:
MOVAH,4CH
INT21H
;******************************************发声
GENSOUNDPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVAL,0B6H
OUT43H,AL
MOVDX,12H
MOVAX,348ch
DIVDI
OUT42H,AL
MOVAL,AH
OUT42H,AL
INAL,61H
MOVAH,AL
ORAL,3
OUT61H,AL
WAIT1:
MOVCX,3314
callwaitf
DELAY1:
DECBX
JNZWAIT1
MOVAL,AH
O
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 音乐 乐曲 演奏 程序