汇编 音乐乐曲演奏程序.docx

上传人:b****4 文档编号:12289809 上传时间:2023-04-17 格式:DOCX 页数:26 大小:159.74KB
下载 相关 举报
汇编 音乐乐曲演奏程序.docx_第1页
第1页 / 共26页
汇编 音乐乐曲演奏程序.docx_第2页
第2页 / 共26页
汇编 音乐乐曲演奏程序.docx_第3页
第3页 / 共26页
汇编 音乐乐曲演奏程序.docx_第4页
第4页 / 共26页
汇编 音乐乐曲演奏程序.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

汇编 音乐乐曲演奏程序.docx

《汇编 音乐乐曲演奏程序.docx》由会员分享,可在线阅读,更多相关《汇编 音乐乐曲演奏程序.docx(26页珍藏版)》请在冰豆网上搜索。

汇编 音乐乐曲演奏程序.docx

汇编音乐乐曲演奏程序

目录

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1