汇编课程设计乐曲演奏程序武汉理工大学(共26页).doc
《汇编课程设计乐曲演奏程序武汉理工大学(共26页).doc》由会员分享,可在线阅读,更多相关《汇编课程设计乐曲演奏程序武汉理工大学(共26页).doc(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上学 号: 12课 程 设 计课程名称汇编语言程序设计题 目乐曲演奏程序学 院计算机科学与技术学院专 业计算机科学与技术班 级1001班姓 名XXX指导教师XXX2012年06月27日专心-专注-专业课程设计任务书学生姓名: XXX 专业班级: 计科1001班 指导教师: XXX 工作单位:计算机科学与技术学院 题目: 乐曲演奏程序初始条件:理论:完成了汇编语言程序设计课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。实践:完成了汇编语言程序设计的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。要求完
2、成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)理解键盘接口的工作原理,掌握BIOS键盘I/O功能,掌握复杂内存数据结构的定义和管理方法。具体的设计任务及要求:1) 采用位触发方式编写程序,使计算机发出音响并演奏乐曲;2) 要求在屏幕上用键盘选择歌曲;3) 程序采用子程序结构,结构清晰;4) 友好清晰的用户界面,能识别输入错误并控制错误的修改。在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。阅读资料:1)IBMPC汇编语言程序设计实验教程实验2.42)IBMPC汇编语言程序设计(第2版)例6.11时间安排:设计安排一周:周1
3、、周2:完成系统分析及设计。周3、周4:完成程序调试,和验收。周5:撰写课程设计报告。指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日乐曲程序的设计与实现1实验原理1.1 音调与频率和时间的关系 利用计算机控制发声的原理,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。组成乐曲的每个音符的频率值和持续时间是乐曲程序发声需要的两个数据。但实际上卷入计数器的输入频率与音符频率相除的值,通用发声程序的前半部分就是完成这个计算,并将计数值送入计数器2的功能。音符的持续时间是根据乐曲的速度及音箱的节拍数来确定的。
4、1.2 乐曲的频率和节拍 乐曲是按照一定的高低、长短、强弱组成的音调。在一首乐曲中,每个音符的音高和音长和频率和节拍有关。每个音符的频率值和持续时间是乐曲程序发声需要的两个必要数据。高音阶从中C(263)到高C(523), 各个音阶对应的频率如下所示:DW 263 - C DW 294 - D DW 330 - E DW 349 - F DW 392 - G DW 440 - A DW 494 - B DW 523 - C如果知道了乐曲的曲谱,就可以将每个音符的频率和持续时间定义为两个数据表,然后通过调用子程序将表中数据取出,通过扬声器发声。例如MERRY CHRISTMAS频率表和节拍表如下
5、所示:CHST_F dw 7 dup(330),392,262,294,330,4 dup(349),2 dup(330),330,294,294,262,294,392 dw 7 dup(330),392,262,294,330,4 dup(349),2 dup(330),392,392,349,294,262,0 CHST_T dw 2 dup(25,25,50),4 dup(25),100,2 dup(25,25,50) dw 4 dup(25),2 dup(50),2 dup(25,25,50) dw 4 dup(25),100,2 dup(25,25,50),4 dup(25),10
6、0其中,CHST_F为频率表,CHST_T为节拍表,两个表中的数据一一对应,每一组代表着乐曲中的一个音符,频率表中以0作为结束的标志。1.3 实验要求1进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。具体的设计任务及要求:1) 进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。2) 一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,设置乐曲的频率表和节拍时间表;3) 编写程序并调试通过。2了解定时器的工作原理,掌握利用定时器产生声音的方法,使计算机演奏乐曲(例如两只老虎等)。编写程序并调试通过。1.
7、4 通用发声程序的设计原理PC机发声系统以8254的2号计数器为核心。系统初始化时,2号计数器I作在“方波发生器”方式,初值为二进制数,写入顺序为先低后高,CLK2为1MHz,当计数初值为533H时,OUT2输出的方波大约为900Hz,经过简单的滤波之后,送至扬声器。改变1.4号计数器的计数初值就可以使扬声器发出不同频率的音响。ROM BIOS 中有个BEEP子程序,这能根据BL中组出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我
8、们的通用发声程序应能产生任一频率的声音。其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:533H896给定频率=H给定频率发声程序包括3个步骤: (1)在8253中的42端口送一个控制字0B6H(B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。 (2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H895/频率),以建立将要产生的声音频率。 (3)把输出端口61H的PB0、P
9、B1两位置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时,
10、允许OUT2的输出信号到达扬声器电路。因此,只有PB0和PB1同时为“1”时,才能驱动扬声器地声。通过以下指令实现: IN AL,61H OR AL,3 OUT 61H,AL 上面的指令用以打开扬声器,如要关闭扬声器时则为: AND AL,0FCH OUT 61H,AL 当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表: TABLE DW 493,440,392,349,329,293,261 把相应的频率送到一个寄存器上,通过公式: 计数值=533H896 f=1234DCH f 算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波。在把计数
11、值送8253前,必须先把8253进行初始化: MOV AL,0B6H OUT 43H,AL 使其选用通道2,工作在方式3下。 就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的A口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。这个方波经驱动放大就可以使扬声器发出相应的声音。 所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声。8253的主要任务就是产生
12、所要求发声的不同频率的方波。2.1 设计实现及功能了解了乐曲演奏的原理,就可以开始设计方案。 首先,明确整个程序的结构及各个程序段的结构和功能,然后设计流程图。按照要求,程序需要完成的功能如下所示:1. 程序需要通过定时器原理完成播放乐曲的功能,这是最基本的功能。2. 在程序中添加一个键盘发声功能,即通过按键盘上不同的按键来发出不同频率的音符。3. 程序应该有判断用户输入是否符合规定,如果输入不正确,应该有所提示。4. 在用户输入较多的情况下,选择界面会显得较为凌乱,所以添加一个清屏功能显得很有必要。5. 在主界面选择不同的选项时,应该跳转到不同的子界面,结束之后再返回主选择界面。2.2 流程
13、图开始显示提示信息接收键盘输入是“Q”?是“A”?是“C”?是“B”?退出程序将音乐节拍频率地址导入ADDRESS调用MUSIC,播放音乐显示错误提示调用清屏程序是是是是否否否否 说明:在进入主界面的时候有6个选项,分别是 1: MUSIC1 - MERRY CHRISTMAS 2: MUSIC2 TAIHU 3: MUSIC3 - LITTLE BEE4: PLAY BY KEYBOARD5: PRESS 5 TO QUIT6: CLEAR THE SCREEN 通过选择不同的选项进入其子界面来实现不同的功能。2.3 关键代码设计实现及分析2.3.1 程序段说明1) DATAS为数据段,其中
14、存放在程序中所要显示的提示选择信息,还有乐曲的频率表和节拍表,和键盘控制发声对应的音符表。2) CODES为代码段,由于在整个程序中各个子程序都定义为NEAR,所以只需要有一个代码段,各个子程序的定义及实现都放在其中。2.3.2 PLAY_MUSIC 乐曲演奏程序的实现及分析 “PLAY_MUSIC”为播放音乐的子程序,完成的功能是通过SI(频率表的偏移地址) BP(节拍表的偏移地址)(通过主程序传递过来的参数)找到对应的频率(DI)、节拍(BX),再以DI、BX为参数调用SOUNDF子程序来发出声音。关键代码:FREQ: MOV DI, SI CMP DI, 0 JE END_MUSIC M
15、OV BX, DS:BP CALL SOUNDF ; 以DI(频率) BX(节拍)为参数,调用SOUNDF ADD SI, 2 ADD BP, 2JMP FREQ SI, BP是频率表和节拍表的偏移地址,通过寄存器间接寻址方式找到数据段中定义数据,传递给BX和DI,然后调用SOUNDF发出一个频率为DI,节拍数为BX的声音注意: 在频率表中应该设置一个结束标志,“CMP DI, 0”,在这里以0作为结束标志。 2.3.3 SOUNDF通用发声程序的实现及分析 SOUNDF”为以传递过来的频率和节拍数,发出一个音符的频率的子程序。关键代码分析: MOV AL, 0B6H OUT 43H, AL
16、置43H端口为0B6H,选择计数器2,读/写LSB, MSB , 模式3,计数值为二进制数。 MOV DX, 12H MOV AX, 348CHDIV DI 按照公式,计数值=12348CH f ,商存放在AX中。 OUT 42H, AL MOV AL, AH OUT 42H, AL825354的数据总线为8位,而计数值为16位,所以应该分两次传递计数值。 IN AL, 61H MOV AH, AL OR AL, 3 OUT 61H, AL将61H的后两位置1,打开扬声器,使其发声。WAIT1: CALL WAITF DEC BX JNZ WAIT1 用WAITF产生一个10ms的延时,BX是
17、节拍(10ms的倍数)。 MOV AL, AH OUT 61H, AL 恢复寄存器状态2.3.4 WAITF延迟程序的实现及分析 “WAITF”为通过监控端口61H的PB4固定不变的触发时间来产生延迟时间的子程序。关键代码分析: MOV CX, 663WAITF1: IN AL, 61H AND AL, 10H ; 查看61H寄存器的第四位(PB4) CMP AL, AH JE WAITF ; PB4每15.08秒触发一次 MOV AH, AL ; LOOP WAITF1 10ms / 15.08us = 663,所以先置CX为663,每次通过调用WAITF都会产生一个10ms的延迟。2.3.
18、5 KEYBOARD键盘发声程序的实现及分析“KEYBOARD”子程序,通过按不同的按键(1 8)来产生不同频率的音符。关键代码分析:PLAY_BY_KB: MOV AH, 7 INT 21H CMP AL, 0DHJE QT MOV BX, OFFSET TABLE CMP AL, 1 JB PLAY_BY_KB CMP AL, 8JA PLAY_BY_KB 输入按键,回车退出,如果不是1 8的话跳转到开始重新输入。 AND AX, 0FH ; 清空AH SHL AX, 1 SUB AX, 2找到索引地址,是DW型的,所以需要乘2,而且是从0开始,应该减去2 MOV SI, AX MOV D
19、I, BXSI MOV BX, 10CALL SOUNDF 通过索引从符号表里面找到对应的频率,调用SOUNDF发出声音。3.1主要的宏和过程的实现3.1.1DISPLAY显示宏为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。将b的地址传到DX。随后调用DOS09号功能调用。将字符串显示到屏幕。调用DISPLAY的实例为: DISPLAY INFO1 DISPLAY INFO2 DISPLAY INFO3 DISPLAY MUSLIST在此段代码中,程序显示提示作用的字符串和歌曲列表。DISPLAY宏具体实现如下:DISPLAY MACRO b LEA DX,b MOV AH,9
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 课程设计 乐曲 演奏 程序 武汉理工大学 26
限制150内