汇编音乐课程设计报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《汇编语言程序设计》

课程设计报告

题目:音乐发声程序

指导老师:

组长:

成员:

专业:计算机科学与技术

班级:

2011年6月20日

目录

一设计任务 (1)

二设计目的 (1)

三设计思想 (1)

四程序流程图 (3)

五概要设计 (4)

六详细设计 (5)

1.菜单设计 (5)

2.通用发生程序设计 (5)

3.延时程序设计 (6)

4.模拟频谱程序 (6)

5.模拟电子琴程序 (7)

七程序代码 (9)

1.Sound程序代码 (9)

2.Delay程序代码 (10)

3randp程序代码 (10)

4Cleanmp清屏程序代码 (11)

5Mpa模拟电子琴程序代码 (12)

6Mpu模拟频谱程序代码 (14)

7Music总体控制程序代码 (17)

八程序调试 (24)

一设计任务

建立一个菜单,以实现以下功能,根据选择的菜单项执行相应的功能。

(1)编写5首音乐歌曲程序;

(2)设计选择点播5首音乐歌曲演奏窗口;

(3)选择数字1-5演奏相对应的歌曲

(4)选择6进入模拟电子琴程序

(5)结束音乐歌曲的演奏。

二设计目的

通过课程设计,对汇编语言指令的功能能有较深入的理解,并学会用汇编语言编写声音程序,从而使学生认识到计算机低级语言功能的重要性,同时对计算机硬件的工作原理有较深入的认识。

三设计思想

编写主程序,在主程序中用数字标出各个字功能,当用户从键盘输入某个数字时,就去执行相应功能。当用户输入错误数字时有相应的提示。

乐曲是按照一定的高低、长短和强弱关系组成的音调,在一首乐曲中,每个音符的高低和音长,与频率和节拍有关。要实现乐曲的演奏,可通过调用发声程序来达到输出音乐的效果。在程序中,可以设

定两个变量分别用来存储音符的频率值和持续的时间。音符的频率可以通过查阅有关资料获得,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。得到了音频和时间关系,就可以按照乐曲的曲谱将每个音和持续时间定义成两个数据表,然后编写程序依次取出表中的频率和时间值,调用程序发出声音。

可以定义几个频谱数据段,通过调用随机数程序产生随机数,根据产生的随机数来显示相应的频谱模拟音乐播放时的频谱。

另外可以编辑一个小程序来简单模拟电子琴,根据用户的输入调用发声程序来产生对应频率的声音。

四程序流程图

五概要设计

这个音乐程序大致分为五个部分:

1.菜单的设计。菜单可以通过定义一个长字符串,通过调用Dos21

的9号功能键来实现

2.5首音乐歌曲的频率与对应时间的数据表。首先要有乐谱,可以

根据乐谱中每个音符及节拍确定这首歌曲对应的频率与时间表。

3.发声程序,这也是这个程序的核心部分。要产生指定频率的声音,

可将8253的计数器2设置为方式3,根据声音的频率计算出8253计数值并送入8253计数器2即可。使声音持续一段时间,可以通过一个延时程序来实现。延时程序主要通过检测8255A PB4口的变化来实现。

4.模拟频谱程序。这主要通过字符串显示和随机数来实现。首先把

模拟的频谱定义成几个字符串,然后通过随机数程序来生产随机数,根据生成的随机数来显示对应的频谱。

5.模拟电子琴程序。这部分主要通过调用发声程序来实现。通过判

断用户的输入,产生对应音符的声音。

六详细设计

1.菜单设计

通过定义一个字符串来实现。

MENU 1:JUN GANG ZHI YE

2:TONG NIAN

3:RANG WOMEN DANGQI SHUANGJIANG

4:MY HEART WILL GO ON

5:YI YAN WAN NIAN

6:PLAY THE PANIO

7:EXIT

PLEASE CHIOCE THE NUMBER OF MUSIC

2.通用发生程序设计

SOUND为以传递过来的频率和节拍数,发出一个音符的频率的子程序。

关键代码分析:

MOV AL, 0B6H

OUT 43H, AL

43H端口为0B6H,选择计数器2,读/写LSB, MSB , 模式3,计数值为二进制数。

MOV DX,12H

MOV AX,34DCH

DIV DI

按照公式,计数值=12348CH÷f ,商存放在AX中。

OUT 42H, AL

MOV AL, AH

OUT 42H, AL

8253\54的数据总线为8位,而计数值为16位,所以应该分两次传递计数值。

IN AL, 61H

MOV AH, AL

OR AL, 3

OUT 61H, AL

将61H的后两位置1,打开扬声器,使其发声。

WAIT1: CALL DELAY

DEC BX

JNZ W AIT1

用WAITF产生一个10ms的延时,BX是节拍(10ms的倍数)

MOV AL,AH

OUT 61H,AL

恢复寄存器状态

3.延时程序设计

Delay为延时程序产生10ms的延时,入口参数:ah为61H端口之前状态值,出口参数无。

DY: IN AL,61H

AND AL,10H ; 查看61H寄存器的第四位(PB4)

CMP AL,AH ; PB4每15.08微秒触发一次

JE DY

MOV AH,AL

LOOP DY

4.模拟频谱程序

开始阶段想的是根据音符的频率来显示对应高度的频谱,后来考虑的程序的复杂性以及8086汇编的单线程性,仅仅做了个模拟频谱的程序。把几个频谱图形预先定义好,通过调用随机数程序来生成随机数,根据产生的随机数来显示对应频谱,实现频谱的动态变化过程。

频谱图形的定义,通过字符串来实现。

p0 db 3 dup(' '),0eh,3 dup(' '),' ',3 dup(' '),' ',3 dup(' '),' ',3 dup(' '),' ',3 dup(' '),' ',3 dup(' '),0eh,13,10

db 3 dup(' '),0eh,3 dup(' '),0eh,3 dup(' '),' ',3 dup(' '),' ',3 dup(' '),' ',3 dup(' '),0eh,3 dup(' '),0eh,13,10

db 3 dup(' '),0eh,3 dup(' '),0eh,3 dup(' '),0eh,3 dup(' '),' ',3 dup(' '),0eh,3 dup(' '),0eh,3 dup(' '),0eh,13,10

相关文档
最新文档