专业课程设计报告书
专业课程设计报告书
课程名称: 微机原理与接口技术
设计名称: 音乐发生器
学生姓名:专 业:班 别:
学 号:
指导老师:
日 期:
目录
1. 项目概述 ....................................................................................................................................................................... 1
2. 设计要求 ....................................................................................................................................................................... 1
3. 系统设计 ....................................................................................................................................................................... 2
4. 硬件设计 ....................................................................................................................................................................... 3
4.1电路图 ...................................................................................................................................................................... 3
4.2元件清单 .................................................................................................................................................................. 3
5. 软件设计 ....................................................................................................................................................................... 4
5.1程序流程图 .............................................................................................................................................................. 4
(1)主程序流程图 .......................................................................................................................................................... 4
5.2 程序清单 ................................................................................................................................................................. 5
程序调试 ............................................................................................................................................................................ 9
6. 小结 ............................................................................................................................................................................. 10
参考文献 .......................................................................................................................................................................... 10
1. 项目概述
汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。借助于汇编程序,计算机本身可以自动地把 汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。
掌握一些程序设计的基本方法,要指导主程序,子程序以及推栈段的使用,了解通用发声程序。了解与掌握定时、计数、音乐、频率、时间之间的关系,学会用发声程序的设计方法,学会用汇编语言编辑音乐程序。
2. 设计要求
(1)需要的基本知识与技能。
具备汇编语言设计、编写、调试和运行程序的方法和技巧。在PC 机上运行汇编程序需要经过以下几个阶段:
编辑源程序。利用文本编辑工具编辑源程序,生成一个汇编语言的纯文本文件。文件的扩展名为.ASM
汇编源程序。用汇编器汇编源程序生成目标代码文件,目标代码文件的扩展名是.OBJ ,汇编器还可以生成列表文件和交叉参考文件。汇编器相当于高级语言中的编译器。汇编语言按照汇编语言的语法检查源程序,如果源程序语法有错误,汇编器就不生成目标代码文件,这时,必须重新编辑源程序,修改语法错误。当发现源程序有的行含有不确定因素,汇编器会给出警告信,但按却省处理方法生成目标代码文件。此时,可以重新编辑源程序,消去不确定因素。
连接目标程序。利用连接器连接目标代码程序和库函数代码生成可执行程序文件。一般单个模块的连接可以顺利地生成可执行程序文件。当多个模块连接,或者库函数连接时,如果在目标代码中找不到所需的连接信息,连接器就会发生错误提示信息,而不是生成可执行文件。这时,这就要重新编辑源程序,并汇编程序。
调试可执行程序。程序的动态调试是在形成可执行文件后,针对可执行程序进行的。DEBUG 是简单的动态调试工具,利用调试工具动态的调试程序,找出程序中的问题,那么就要重新编辑,汇编源程序。
(2)尚未掌握的知识点。
有时在程序中定义了较多的 宏,或者可以把自己编译中常用的宏定义建立一个独立的文件,这个只包含若干定义宏文件的文件可称为宏库,通常用扩展名MAC 或INC 来表示。当应用程序中需要用到宏库中的宏定义时,只需要用语句说明。
有时汇编语言程序需要连续重复地完成相同或者几乎完全相同的一组代码,这时,可使用重复汇编。汇编程序把重复模块代码重复几次,每次重复把重复块中的哑元用自变量表中的一项取代,下一次取代一次,重复次数由自变量表中的自变量个数来确定。条件汇编中,汇编程序能够根据条件把一段源程序或者把它排去在外,这里用到条件伪操作。条件伪操作可以用在宏定义体内,也可以用在宏定义体外,并且可以嵌套任意次。
模块化程序设计方法是按照各部分程序所实现的不同功能把程序划分成为多个模板。各个模板在明确各自的功能和相互间的约定后,就可以编制和调试程序,最后把它们连接起来形成一个大程序,子程序结构是模块化程序设计的基础。子程序相当于高级语言中的过程和函数。在一个程序的不同部分,往往就要用到类似的程序段,这写程序段的功能个结构形式都相同,只是有的变量赋值不同,此时就可以把这些程序写成子程序形式,以便需要时调拥它。
计算机中有一个可编程时间间隔定时器8253/54,它能根据程序提供的计数值和工作模式,产生各种计数/定时脉冲,提供给系统的各个部分使用。先要设定控制字,以选择计数器,确定工作模式和计数的值。每个计数器由3个外引腿与外部联系,在对任一个计数妻编
程时,首先将控制字节写入控制寄存器。控制字的作用是告诉8253/54选择那一个计数器工作,要求输入什么样的脉冲波形。另外对其初始化工作好包括,向选定计数器送一个初值。PC 机上的大多数I/O都是主板的8255的可编程外围接口芯便管理的,PPI 包括三个8位寄存器,两个用于输入功能,一个用于输出功能。利用CPU 产生延迟时间是最常用的方法,但是对于不同的计算机,它们产生的延迟时间都是不一样的。
组成乐曲的每个音符的频率和持续时间是乐曲程序发声所需要的两个数据。音符的持续时间是根据乐曲的速度及每个音符的节拍来确定的。在4/4中,四分音符为一拍,每小节四拍,全音符持续四拍,四分音符持续一拍,八分音符持续半拍等。
3. 系统设计
这次课程设计的设计思想是在熟练掌握汇编程序的设计方法的基础上,利用通用发生程序编写音乐程序.组成音乐的每个音符的频率值和持续时间是音乐程序发声所需要的两个数据,根据音调与频率和时间之间的关系,把要编辑的音乐的每个音符的频率和持续时间定义成两个数据表,进而把它们写入通用发声程序,音乐程序就完成。
在编制此音乐演奏程序时,应该知道ROM BIOS 中有个BEEP 子程序, 这能根据BL 中组出的时间计数值控制8254定时器, 产生持续时间为1个或几个0.5秒, 频率为896HZ 的声音,我们可以利用并修改BEEP ,使其产生任一频率的声音。首先要了解计算机是如何产生声音和乐曲的。找出相关程序源代码,弄清楚各功能的环节间的联系、联接方法,搞清楚单调与频率和时间的关系,利用计算机控制发声的原理,依照基本的算法思想写程序,测试,更正,扩充功能,修饰细节。
本次设计在具体设计过程中的整体设计思路如下:
该程序主要分成
① 根据音阶表和简谱为演奏的乐曲定义一个频率表mus_freq和一个时间表mus_time。 ②分别将两个表的偏移地址放入SI 和BP 。
lea si, mus_freq
lea bp, ds:mus_time
③从表中取出音符的频率放入DI ,取出音符的持续时间(实际上是10ms 的倍数)放入BX 。 mov di, [si]
mov bx, ds:[bp]
频率表中最后一个数据-1作为乐曲的结束符,也可用其他的特殊值来代替。
④调用通用发声子程序SOUNDF 发出音调。
这个程序比较简单,如果想演奏另一个乐曲,只需把mus_freq和mus_time两个表中的数据换成另一个乐曲的频率和节拍时间就可以了。该算法的整体思路是在这个设计中用到了BEEP 通用发声程序,我们利用对BEEP 程序的修改让它产生任何一种频率的声音,也可以让声音的持续时间更容易被调整 在编译的过程中,用到了子程序调用,分别根据输入调用music1,music2,music3程序还要调用子程序gensound 发出音调, 主要特点是程序简单明了, 有良好的交互界面。程序的主要功能是给用户提供三首已经写好的短曲,根据用户的选择演奏乐曲,演奏完一首乐曲后跳回起始状态,如此循环,直到用户输入结束的信息为止。
本程序设计过程的整体设计思路是通过定义数据段, 堆栈段和代码段实现程序的各种要求。其中堆栈段是为乐曲的音调及频率的数据分配空间;数据段是记录程序运行过程中所需的信息,包括字符信息,单调数据,音频数据;代码段则是程序算法部分, 通过对各数据的调用,实现音乐演奏功能。找出相关程序源代码,弄清楚各功能的环节间的联系、联接方法,搞清楚单调与频率和时间的关系,写出其中的一个音乐文件的代码,理解其在总程序中的作用。依照基本的算法思想写程序,测试,更正,扩充功能,修饰细节。
⑤系统的主要功能:给用户提供三首已经写好的短曲,根据用户的选
择演奏乐曲,演奏完一首乐曲后跳回起始状态,如此循环,直到用户输入结束的信息为止。
4. 硬件设计
4.1电路图
4.2元件清单
5.1程序流程图
(1)主程序流程图
图1 主程序流程图
(2)Music 子程序流程图
图2 Music 子程序流程图
程序清单如下:
;数据段
DATA SEGMENT PARA 'DATA'
INFO1 DB 0DH,0AH,'WELCOME YOU TO COME HERE!$'
INFO2 DB 0DH,0AH,'this is a music program!$'
INFO3 DB 0DH,0AH,'please select!$'
INFO4 DB 0DH,0AH,'INPUT ERROR!$'
INFO5 DB 0DH,0AH,'PLEASE INPUT AGAIN!$'
MUSLIST DB 0DH,0AH,'A MUSIC1'
DB 0DH,0AH,'B MUSIC2'
DB 0DH,0AH,'C MUSIC3'
DB 0DH,0AH,'Q EXIT'
db 0dh,0ah,'$'
MUS_FREG1 DW 330,294,262,294,3 DUP (330) ;音乐1的频率表1,2小节 DW 3 DUP (294),330,392,392 ;3,4小节
DW 330,294,262,294,4 DUP (330) ;5,6小节
DW 294,294,330,294,262,-1 ;7,8小节
MUS_TIME1 DW 6 DUP (25*8),50*8 ;音乐1的时间节拍表1,2小节 DW 2 DUP (25*8,25*8,50*8) ;3,4小节
DW 12 DUP (25*8),100*8 ;5~8小节
MUS_FREG2 DW 330,392,330,294,330,392,330,294,330
DW 330,392,330,294,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,332,262,-1
MUS_TIME2 DW 3 DUP(50),25,25,50,25,25,100
DW 2 DUP(50,50,25,25),100
DW 3 DUP(50,25,25),100
MUS_FREG3 DW 262,262,294,262,349
DW 330,262,262,294,262
DW 392,349,262,262,523
DW 440,349,262,262,466
DW 466,440,262,392,349,-1
MUS_TIME3 DW 50,50,100,100,100
DW 100,100,50,50,100,100
DW 100,100,100,50,50,100
DW 100,100,100,100,100,50
DW 50,100,100,100,100,100
DATA ENDS
;堆栈段
STACK SEGMENT PARA STACK 'STACK'
DB 200 DUP ('STACK') ;初始化堆栈
STACK ENDS
;代码段
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
MAIN PROC FAR
MOV AX,DATA ;数据段装入段寄存器DS
MOV DS,AX
MOV aH, 0 ;BIOS 功能调用,设置显示方式
MOV AL,4
INT 10H ;十号doc 中断??
MOV AH,0BH ;0B 号doc 调用??
MOV BH,0
MOV BL,4
INT 10H
MOV AH,0BH
MOV BH,01H
MOV BL,00
INT 10H
SHOW MACRO b ;定义一个宏
LEA DX,b
MOV AH,9 ;9号doc 调用??
INT 21H
ENDM
show INFO1
show INFO2
show INFO3
show MUSLIST
INPUT: MOV AH,01H ;键盘输入并回显
INT 21H
CMP AL,'Q'
JZ retu ;退出
CMP AL,'A'
JNZ B0
CALL MUSIC1
JMP EXIT1
B0: CMP AL,'B'
JNZ C0
CALL MUSIC2
JMP EXIT1
C0: CMP AL,'C'
JNZ exit
CALL MUSIC3
EXIT1: show INFO5 ;宏调用
JMP INPUT
EXIT:
call clear
show INFO4
show INFO5
show INFO1
show INFO2
show INFO3
show MUSLIST
jmp input
RETU: MOV AH,4CH ;带返回码终止
INT 21H
MAIN ENDP
MUSIC1 PROC NEAR
PUSH DS
SUB AX,AX ;AX 清零
PUSH AX
LEA SI,MUS_FREG1
LEA BP,DS:MUS_TIME1
FREG1: MOV DI,[SI]
CMP DI,-1 ;音符的频率是否结束
JE END_MUS1 ;若是则返回
MOV DX,DS:[BP] ;取出音符的持续时间放入BX
MOV BX,1400
CALL GENSOUND ;调用GENSOUND 子程序发出音调 ADD SI,2
ADD BP,2
JMP FREG1
END_MUS1:
RET
MUSIC1 ENDP
GENSOUND PROC NEAR
PUSH AX ;保存将要用到的寄存器
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H ;向8253-5/8254-2计数器写入控制字
OUT 43H,AL ;方式3、双字节写和二进制计数方式写到控制口 MOV DX,12H ;设置被除数
MOV AX,533H*896
DIV DI ;其商(AX )为预置值
OUT 42H,AL ;先送LSB
MOV AL,AH
OUT 42H,AL ;后送MSB
IN AL,61H ;读8255端口B (61H )原值
MOV AH,AL ;保存端口原值
OR AL,3
OUT 61H,AL ;接通扬声器
WAIT1: MOV CX,8FF0H ;在80486/DX2/66中取 DELAY1: LOOP DELAY1
DEC BX
JNZ WAIT1
MOV AL,AH ;写回61H 口原值,关闭扬声 OUT 61H,AL
POP DI ;恢复寄存器
POP DX
POP CX
POP BX
POP AX
RET ;子程序结束返回
GENSOUND ENDP
MUSIC2 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG2
LEA BP,DS:MUS_TIME2
FREG2: MOV DI,[SI]
CMP DI,-1
JE END_MUS2
MOV DX,DS:[BP]
MOV BX,1400
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS2:
RET
MUSIC2 ENDP
MUSIC3 PROC NEAR
PUSH DS
SUB AX,AX
PUSH AX
LEA SI,MUS_FREG3
LEA BP,DS:MUS_TIME3
FREG3: MOV DI,[SI]
CMP DI,-1
JE END_MUS3
MOV DX,DS:[BP]
MOV BX,1400
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREG1
END_MUS3:
RET
MUSIC3 ENDP
clear proc near ;清屏子程序
push ax
push bx
push cx
push dx
mov ah,6 ;屏幕初始化或上卷
mov al,0
mov ch,0 ;左上角行号为0
mov cl,0 ;左上角列号为0
mov dh,24 ;右下角行号为24
mov dl,79 ;右下角列号为79
mov bh,7 ;卷入行属性为7
int 10h ;调用显示BIOS
pop dx
pop cx
pop bx
pop ax
ret
clear endp
CODE ENDS
END MAIN
5.3程序调试
1. 编辑源程序, 假定源文件名为YINYUE.ASM 。
2. 汇编源程序YINYUE.ASM 。调用宏汇编程序MASM 对源文件YINYUE.ASM 进行汇编,
生成目标文件YINYUE.OBJ 。若汇编无错误, 则进入第三步。
3. 用连接命令LINK 连接目标程序文件YINYUE.OBJ 。若连接成功, 则进入下一步。
4. 运行可执行文件YINYUE.EXE 。
5.DEBUG 调试的具体步骤:
DEBUG 命令均为一个字母,其后可以跟一个或多个参数。命令中参数之间必须用分界符号隔开。命令和参数可以用大写或小写混合的方式输入,每个命令以回车键作结束符。
在执行命令过程中,可以按CTRL+BREAK来终止一个命令的执行,然后返回到DEBUG 提示符下。
这里我用到了(显示内存单元内容的)D 命令和(跟踪命令)T 命令。
在dos 的提示符下,键入命令:
c:\debug typegame
在debug 程序调入后,将出现提示符,此时就可用debug 命令来调试程序。
6. 小结
设计中遇到的问题
在此次课程设计的过程中,我遇到了很多的问题,主要有以下一些:
(1) 在编程初期首先遇到的是结构化程序的结构很重要,刚开编的时候没有写流程图和算法,结果程序可读性很差,也很难查错,从中了解到写程序需要一步步来,不能操之过急。
(2) 在编程中时常出现逻辑错误。因为这个错误在编译中不会被发现,所以很难找出,要对程序一步一步的检查才行,可以用对子程序稍加修改后单独运行来查错。这体现我经历的程序不够多,需要在这方面加把劲。
(3)在编写音乐的时候,不懂的节拍的把握。后来上网查资料和老师的帮助,才对音乐的节拍有所了解,最后终于解决了这问题。
问题的解决方法
此次课程设计中遇到了很多问题, 在指导老师的帮助下, 加上我自己的努力及同学朋友的全力帮助下, 我的这些问题都已得到完满的解决。如节拍的问题,我通过和同学讨论、网上查资料,最终解决了这个问题。
设计后的感想和收获
通过一学期的汇编语言的学习,我对汇编的认识有了更深理解,切实的提高了我的编程能力通过这次课程设计,我对学过的知识有了更深层次的运用,能用汇编语言熟练地运用顺序、选择、循环三大结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG 指令。在整个程序的编写中,调试占了很大部分的时间。要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug 命令,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试一定规模的汇编语言程序的水平
总之, 我认为我本次课程设计基本达到了要求, 所编程序的功能也基本完善, 而且程序有友好的交互界面和可扩充性, 就是说可以在数据段中定义音乐的频率表和时间节拍表, 然后在代码段中修改一下即可或者如果想演奏另一个乐曲,只需把mus_freq和mus_time两个表中的数据换成另一个乐曲的频率和节拍时间就可以了。当然本程序也存在一定不足, 就是不能在运行程序后只要你输入任一首音乐的频率表和时间表确认后就可以演奏此音乐。
参考文献
[1] 郑人杰、殷人昆、陶永雷, 《实用软件工程》,清华大学出版社,2001年9月
[2] 沈美明、温冬蝉, 《IBM-PC 汇编语言程序设计》第2版,清华大学出版社,2001年8月
[3] 沈美明、温冬蝉, 《IBM-PC 汇编语言程序设计例题习题集》,清华大学出版社,2001年8月
[4] 陆忠华等, 《汇编语言程序设计》,科学出版社 ,2000年9月
[5] 迟成文、王保秀, 《汇编语言程序设计》,中国科学技术大学出版社,2003年8月
[6] 宋锦河, 《汇编语言程序设计》,中国水利水电出版社,2003年9月
[7] 杨季文, 《80X86汇编语言程序设计教程》,清华大学出版社,2001年9月