乐曲程序的设计与实现.doc
《乐曲程序的设计与实现.doc》由会员分享,可在线阅读,更多相关《乐曲程序的设计与实现.doc(20页珍藏版)》请在沃文网上搜索。
1、课程名称汇编语言程序设计题 目乐曲程序的设计与实现目 录目录课程设计任务书11 实验内容、目的11.1实验内容11.2 实验目的1 2 设计中使用的关键技术及方法 2 2.1 位触发方式2 2.2 利用定时器产生声音.3 2.3 扬声器驱动方式4 2.4 主要的发生器件5 2.5 乐曲构成6 3 设计方案说明 6 3.1 设计思路6 3.2 程序流程图 7 3.3 关键代码设计实现及分析8 4 调试过程及实验结果分析11 4.1 调试过程 11 4.2 实验结果 12 5 设计心得与改进方案 13 5.1 心得体会 13 5.2 改进方案 13 6 参考文献14 7 附录 源程序 14 本科生
2、课程设计成绩评定表 18 课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位:计算机科学与技术学院 题目: 乐曲程序的设计与实现初始条件:理论:完成了汇编语言程序设计课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了汇编语言程序设计的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。具体的设计任务及要求:1采用位触发方式编写程序,使计算机发出音响并演奏乐曲(例如
3、两只老虎等)。1) 进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。2) 一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,设置乐曲的频率表和节拍时间表;3) 编写程序并调试通过。2了解定时器的工作原理,掌握利用定时器产生声音的方法,使计算机演奏乐曲(例如两只老虎等)。编写程序并调试通过。在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。阅读资料:1)IBMPC汇编语言程序设计实验教程3.1节2)IBMPC汇编语言程序设计(第2版)10.4节,10.5节时间安排:设计安排一周
4、:周1、周2:完成系统分析及设计。周3、周4:完成程序调试,和验收。周5:撰写课程设计报告。指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日武汉理工大学汇编语言程序设计课程设计乐曲程序的设计与实现1实验内容、目的1.1 实验内容 1进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。具体的设计任务及要求:1) 进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。2) 一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,设置乐曲的频率表和节拍时间表;3) 编写程序并调试通过。2了解定时器的工作
5、原理,掌握利用定时器产生声音的方法,使计算机演奏乐曲(例如两只老虎等)。编写程序并调试通过。1.2 实验目的 汇编语言是计算机能够提供给用户使用的最快而又有效的语言,也是能够用计算机所有硬件特性并能直接控制硬件的唯一语言。通过这次实验要求我们:1) 了解通用发生程序。2) 了解与掌握定时、计数、音乐、频率、时间之间的关系。3) 学会用发生程序的设计方法4) 学会用汇编语言编辑音乐程序 通过音乐程序设计熟悉并掌握用汇编语言编程的方法和特点,借此来比较高级语言低级语言的优缺点,以便更好运用各种语言来开发应用软件通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一
6、定规模的汇编语言程序的水平。能用汇编语言熟练的运用三大结构,进一步掌握各个指令的功能,特别是转向指令,能掌握子程序的定义及调用,包括段间及段内调用,以及正确的运用DEBUG指令,进一步理解和掌握程序直接控制I/O方式。2.设计中使用的关键技术及方法ROM BIOS 中有个BEEP子程序,这能根据BL中组出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我们的通用发声程序应能产生任一频率的声音。其次,BEEP产生声音的持续时间(音长)只
7、能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:533H896给定频率=123280H给定频率发声程序包括3个步骤: (1)在8253中的42端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。(2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H895/频率),以建立将要产生的声音频率。(3)把输出端口61H的PB0、PB1两位置1,发出声音。2.1 位触发方式程序直接控制PP
8、I(8255A可编程序外围接口芯片)的输出控制器(I/O端口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲波形经放大后驱动扬声器发出声音。如果控制波形的脉宽和长度就可以产生不同频率和不同音长的声音。扬声器发声通用子程序:通用发生程序CFSOUND:cfsound proc near push dx 保存将要用到的寄存器 push ax in al,61h mov ah,al and al.11111100b 关断定时器通道2的门控 sound:xor al,2 触发61h端口第一位 out 61h,al mov ax,2801 mov b
9、x,50 mul bx div cx (cx)=freq mov dx,ax mov cx,dx (dx)=控制脉宽的计数值 wait: loop wait 延时循环 mov ax,8 mul bx mov bx,ax (bx)=扩大8倍的节拍计数器 dec bx (bx)=脉冲持续的时间jnz soundpop ax 恢复寄存器pop dxmov al,ah 写回61H口原值,关闭扬声out 61h,alret 子程序结束返回 cfsound endp2.2 利用定时器产生声音 利用机器硬件即INTEL8253/8254定时器产生声音的一种方法。 CPU通过对定时器的通道2(端口地址为42H
10、)进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率(Freq)的计数值就可由下式计算出来: 533H*896/Freq=1234DCH/Freq 在送出频率计数值之前,还要给方式寄存器(端口其值为43H)送一个方式值,也称为幻数。这个幻数由8为组成即D7,D6,D5,D4,D3,D2,D1,D0选择计数值的格式,1为BCD码格式,0为二进制格式。D3,D2,D1选择操作模式,它决定了输出脉冲的形状。D5,D4读写指示位。D7,D6选择计数器,确定控制
11、字是对哪一个计数器进行初始化。 利用定时器产生制定频率声音的程序段: Mov al,10110110b 为组合格式:通道2,两字节技术,模式3,二进制码 Out 43h,al 幻数送方式寄存器 Mov dx,12h Mov ax,34dch Div di (di)=Freq Out 42h,al 频率计数值送通道2 Mov al,ah Out 42h,al 控制音长的时间可以简单的通过反复执行循环指令来得到。我们已执行2810次LOOP指令约需要10ms时间,因此使用10ms的倍数值来控制扬声器开关的时间间隔,就可以控制音长。具体实现的指令序列如下: In al,61h Mov ah,al O
12、r al,3 Out 61h,al 接通扬声器 Leng:mov cx,2801 10ms音长的计数器 Delay:loop delay Dec bx (bx)=10ms的倍数值 Jnz leng Mov al,ah Out 61h,al 关闭扬声器2.3 扬声器驱动方式PC机上的大多数I/O都是由主办上的8255可编程序外围接口芯片PPI管理的。PPI包括三个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。由PPI输出寄存器中的0和1两位来控制扬声器的驱动方式。连接到扬声器上的是定时器2.GATE2与端口61
13、H的PBO相连,当PBO=1时,GATE2获得高电平,是定时器2可以在模式3下工作。定时器2的OUT2与端口61H的PBI通过一个与门与扬声器的驱动电路相连。当PBI=1时,允许OUT2的输出信号到达扬声器电路。控制扬声器的代码:In al,16hMov ah,alOr al,00000011bOut 61h,alMov al,ahOut 61h,al2.4 主要的发生器件(可编程时间间隔定时器8251/54)在8253/54定时器内部有3个独立工作的计数器:counter0,counter1,counter2,个计数器都分配有一个端口地址,分别为40H,41H和42H。8253/54内部还有
14、一个公用的控制寄存器,端口地址为43H。端口地址输入到8253/54的CS,AL,AO端,分别对3个计数器和控制器寻址。如图下图所示: 8253/54定时器结构图对8253/54编程时,先要设定控制字,来选择计数器,确定工作模式和计数值的格式。每个计数器由3个引腿和外部联系。CLK为时钟输入端,GATE为门控信号输入端,OUT为技术/定时信号输出端。每个计数器中包含一个16位的计数寄存器,这个计数器是以倒计数的方式计数的,也就是说,从计数初值开始逐次减1,直到减为0为止。同时8253/54三个计数器是分别编程的,对任一个计数器编程时,必须首先将控制字写入控制寄存器。控制字的作用是确定需要使用的
15、计数器,同时确定要求输出的脉冲波形。另外,对8253/54的初始化工作还包括,向选定的计数器送入一个计数初值,因为这个计数值可以是8位的,也可以是16位的,而8253/54的数据总线是8位的,所以要用两条输出指令来写入初值。控制字节由8位组成即D7,D6,D5,D4,D3,D2,D1,D0选择计数值的格式,1为BCD码格式,0为二进制格式。D3,D2,D1选择操作模式,它决定了输出脉冲的形状。D5,D4读写指示位。D7,D6选择计数器,确定控制字是对哪一个计数器进行初始化。对8253/54设置初始值时,一定要符合控制的格式规定,是二进制数还是BCD码表示的数,是只写高(低)字节,还是高低字节都
16、写。控制字一旦做出决定,程序中给出的计数值就要和控制的要求一致。2.5 乐曲构成由于把很多发生程序“结合”就构成理论上的曲子,所以利用计算机控制发生的原理,可以编写演奏乐曲的音调。在一首乐曲中,每个音符的音高和音场与频率和节拍有关。组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定。在4/4(四四拍)中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。如果给全音符的持续时间为0.25s(25*10ms),八分音符的持续时间为0.125(12.5*10ms).音符的频率参考
17、下表编写:1234567低音131147165175196220247中音262294330349392220494高音5245886606987848809843.设计方案说明3.1 设计思路 编写这个乐曲程序可分为四个步骤:1) 定义频率表和时间表 根据音阶表和简谱为演奏的乐曲定义一个频率表FREQ和一个节拍时间表TIME.2) 将两个表的偏移地址放入SI和DI LEA SI,MUS_FREQ LEA BP,DS:MUS_TIME3) 取频率和时间 MOV DI,SI MOV BX,DS:BP 4) 调用SOUND子程序发出音调3.2 程序流程图 主程序流程图 说明:在进入主界面的时候有6
18、个选项,分别是 1: MUSIC1 - MERRY CHRISTMAS 2: MUSIC2 TAIHU 3: MUSIC3 - LITTLE BEE4: PLAY BY KEYBOARD5: PRESS 5 TO QUIT6: CLEAR THE SCREEN 通过选择不同的选项进入其子界面来实现不同的功能。3.3 关键代码设计实现及分析3.3.1 程序段说明1) DATAS为数据段,其中存放在程序中所要显示的提示选择信息,还有乐曲的频率表和节拍表,和键盘控制发声对应的音符表。2) CODES为代码段,由于在整个程序中各个子程序都定义为NEAR,所以只需要有一个代码段,各个子程序的定义及实现都
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 乐曲 程序 设计 实现