
| 附件1: | |
| 学 号: | 0120710340419 |
课 程 设 计
| 题 目 | 乐曲程序的设计和实现 |
| 学 院 | 计算机科学与技术 |
| 专 业 | 计算机院 |
| 班 级 | 0704 |
| 姓 名 | 林显超 |
| 指导教师 | 胡家宝 |
| 2010 | 年 | 1 | 月 | 15 | 日 |
学生姓名: 林显超 专业班级: 0704
指导教师: 胡家宝 工作单位:计算机科学与技术学院
题目: 乐曲程序的设计与实现
初始条件:
理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
进一步理解和掌握程序直接控制I/O方式,掌握计算机发声程序的设计。具体的设计任务及要求:
1.采用位触发方式编写程序,使计算机发出音响并奏出《两只老虎》的乐曲。
1)通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。
2)一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;
3)编写程序并调试通过。
2.进一步学习利用定时器产生声音的方法,使计算机奏出乐曲(例如《两只老虎》等)。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》3.1节
2)《IBM—PC汇编语言程序设计(第2版)》10.4节,10.5节
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试,和验收。
周5:撰写课程设计报告。
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
目录
1)设计内容及要求;
2)设计中使用的关键技术和方法;
3)设计方案说明:包括对程序结构的描述和对各功能模块的说明(功能定义、入口参数和出口参数等),详细的算法描述(采用流程图或伪代码),主要数据结构的定义和说明,程序界面的描述;
4)测试及评估;
5)设计心得:包括设计中遇到的问题及思考,对该程序进一步改进扩展的设想;
6)致谢,参考文献(按公开发表的规范书写);
7)附录:源程序清单。
1. 设计内容及要求:
1.1采用位触发方式编写程序,使计算机发出音响并奏出《两只老虎》的乐曲。
1.1.1通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理。
1.1.2一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,给出乐曲的频率表;设二分音符持续时间为0.5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表;
1.1.3编写程序并调试通过。
1.2进一步学习利用定时器产生声音的方法,使计算机奏出乐曲(例如《两只老虎》等)。
2. 设计中使用的关键技术和方法;
2.1使用位触发式输出:直接控制输出端口的PB1交替为1或0,以产生一个脉冲电流,经过放大器后控制扬声器交替地接通与断开,从而催动扬声器的纸盆振动,发出不通音高和音长的声音。
2.2产生的各种各样的频率的声音可以由下列公式计算出来:
1193100%给定频率=12348cH%给定频率
2.3音符的音高和音长与频率和节拍有关,组成每个音符的频率值和持续时间是乐曲程序发声的两个数据,因此要定义两个数据表,一个是音符频率值表,一个是音符持续时间表。
音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定。在4/4拍中,四分音符为1拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。如果给全音符分配1s(100*10ms)的时间,则二分音符的持续时间为0.5s(50*10ms),四分音符的持续时间为0.25s(25*10ms),八分音符的持续时间为0.125s(12.5*10ms)。
2.4定时器内部有3个工作的计数器:counter0,counter1,counter2,每个计数器都分配有一个端口地址,分别为40H,41H,42H,还有一个公共端口43H
3. 设计方案说明:包括对程序结构的描述和对各功能模块的说明(功能定义、入口参数和出口参数等),详细的算法描述(采用流程图或伪代码),主要数据结构的定义和说明,程序界面的描述;
3.1定义段segment
stack_segment segment
dw 512 dup(?)
stack_segment ends
3.2段中包含的音乐频率music_freq和时间music_time
music_freq dw ????
music_time dw ?????
3.3编写发音子程序
gensound proc near
push dx ;保存将要用到的寄存器
mov al,0b6h ;向8253-5/8254-2计数器2写控制字
out 43h,al ;方式3、双字节写和二进制计数方式写到控制口
mov dx,8h ;设置被除数
mov ax,3208h
div cx
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 ;接通扬声器
l3: push dx
push ax
mov dx,8h
mov ax,0f05h
s1: sub ax,1
sbb dx,0
jnz s1
pop ax ;恢复寄存器
pop dx
dec bx ;循环持续BX次
jnz l3
mov al,ah ;写回61H口原值,关闭扬声
out 61h,al
pop dx
ret ;子程序结束返回
gensound endp
;----------------------------------------------------------------------------
3.4编写主程序
code_segment segment
assume cs:code_segment,ds:data_segment,ss:stack_segment
main proc far
start:
mov ax,data_segment
mov ds,ax
mov ax,stack_segment
mov ss,ax
lea dx,messg1 ;输出提示信息1
mov ah,09h
int 21h ;//显示调用
lea dx,messg2 ;输出提示信息2
mov ah,09h
int 21h
lea dx,messg3 ;输出提示信息3
mov ah,09h
int 21h
input: mov ah,01h ;输入字符,比较字母Q,如果是Q,则转入 exit
int 21h
cmp al,'Q'
jz exit ;若输入为q,退出
l0: lea dx,messg4 ;输出提示信息4
mov ah,09h
int 21h ; 显示调用
lea dx,buf_substring;传送DX地址到buf_substring
mov ah,0ah
int 21h
lea si, buf_substring+2 ;传送DX地址到buf_substring+2
mov bl, [si] ;判断次数
cmp bl, 30h
jc error 比较BL,30H ,然后转向error
cmp bl, 3ah 比较
jnc error
mov flag,bl
sub flag,30h
str: mov si,offset music_freq
mov di,offset music_time
l1: mov cx,[si]
cmp cx,-1
je l2
mov bx,[di]
call gensound
add si,2
add di,2
jmp l1
l2:
dec flag
jnz str
jmp exit
error: lea dx,messg5
mov ah,09h
int 21h
jmp l0
exit: mov ah,4ch ;返回dos
int 21h
main endp
4测试及评估;
4.1输入歌曲《两只老虎》的乐谱
1 2 3 1 1 2 3 1 3 4 5 – 3 4 5 –
56 54 3 1 56 54 3 1 1 5 1 – 1 5 1 –
music_freq dw 262,294,330,262
dw 262,294,330,262
dw 330,349,392
dw 330,349,392
dw 392,440,392,349,330,262
dw 392,440,392,349,330,262
dw 294,196,262
dw 294,196,262,-1
music_time dw 800,800,800,800
dw 800,800,800,800
dw 800,800,800
dw 800,800,800
dw 400,400,400,400,800,800
dw 400,400,400,400,800,800
dw 800,800,800
dw 800,800,800
4.2测试结果
WELCOME COME HERE!
IT IS A MUSIC PROGRAM !
SELECT! (Q: EXIT , OTHER KEY: CONTINUE )2
PLEASE INPUT TIMES : 5
输入后,会有两只老虎的曲调出现,当修改曲谱的频率和时间,出现其他声响,列如把持续时间减半,则会出现很快速响起的两只老虎的曲调,如果输入频率改变,则会出现不是两只老虎的曲调
5. 设计心得:包括设计中遇到的问题及思考,对该程序进一步改进扩展的设想;
5.1问题
由于此程序是调用主板上的小喇叭发音的,在一些主板没有喇叭的电脑上运行则会没有声音发出。
5.2改进扩展设想
设计中是使用调用发音子程序来实现发声的,该程序只是能简单的实现乐曲的发音,并没有过多的人性化功能,希望能改进有友好界面,有更多选着调试各种音频和持续时间的功能发音程序。
5.3小结思考
这次实验对扬声器的驱动方式有了很大的认识,也对位触发方式有更多的认识,定时器用来发出声音是我之前一直没有想到过的,经过了这次实验,让我认识到微命令在调用计算机硬件方面的快速并且直接使用方式。既然能运用来发出乐曲声响,也能运动到更多方面去,以后要多加熟悉汇编微命令的使用。
6.致谢,参考文献
6.1《IBM—PC汇编语言程序设计实验教程》实验2.4
6.2《IBM—PC汇编语言程序设计(第2版)》例6.11
6.3www.baidu.com网上资料查询
7.源程序清单
;---------------------------------------------------------------------------
stack_segment segment
dw 512 dup(?)
stack_segment ends
;-----------------------------------------------------------------------------
data_segment segment
string db 2,?,2 dup(?)
messg1 db 'WELCOME COME HERE!','$'
messg2 db 0ah,0dh,'IT IS A MUSIC PROGRAM !','$'
messg3 db 0ah,0dh,'SELECT! (Q: EXIT , OTHER KEY: CONTINUE )','$'
messg4 db 0ah,0dh,'PLEASE INPUT TIMES : ','$'
messg5 db 0DH,0AH,'INPUT ERROR!$'
buf_substring db 10
db ?
db 10 dup(?)
db '$'
music_freq dw 262,294,330,262
dw 262,294,330,262
dw 330,349,392
dw 330,349,392
dw 392,440,392,349,330,262
dw 392,440,392,349,330,262
dw 294,196,262
dw 294,196,262,-1
music_time dw 800,800,800,800
dw 800,800,800,800
dw 800,800,800
dw 800,800,800
dw 400,400,400,400,800,800
dw 400,400,400,400,800,800
dw 800,800,800
dw 800,800,800
flag db ?
data_segment ends
;------------------------------------------------------------
code_segment segment
assume cs:code_segment,ds:data_segment,ss:stack_segment
main proc far
start:
mov ax,data_segment
mov ds,ax
mov ax,stack_segment
mov ss,ax
lea dx,messg1 ;输出提示信息1
mov ah,09h
int 21h
lea dx,messg2
mov ah,09h
int 21h
lea dx,messg3
mov ah,09h
int 21h
input: mov ah,01h
int 21h
cmp al,'Q'
jz exit ;若输入为q,退出
l0: lea dx,messg4
mov ah,09h
int 21h
lea dx,buf_substring
mov ah,0ah
int 21h
lea si, buf_substring+2
mov bl, [si] ;判断次数
cmp bl, 30h
jc error
cmp bl, 3ah
jnc error
mov flag,bl
sub flag,30h
str: mov si,offset music_freq
mov di,offset music_time
l1: mov cx,[si]
cmp cx,-1
je l2
mov bx,[di]
call gensound
add si,2
add di,2
jmp l1
l2:
dec flag
jnz str
jmp exit
error: lea dx,messg5
mov ah,09h
int 21h
jmp l0
exit: mov ah,4ch ;返回dos
int 21h
main endp
;---------------------------------------------------------------------
gensound proc near
push dx ;保存将要用到的寄存器
mov al,0b6h ;向8253-5/8254-2计数器2写控制字
out 43h,al ;方式3、双字节写和二进制计数方式写到控制口
mov dx,8h ;设置被除数
mov ax,3208h
div cx
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 ;接通扬声器
l3: push dx
push ax
mov dx,8h
mov ax,0f05h
s1: dec ax
sbb dx,0
jnz s1
pop ax ;恢复寄存器
pop dx
dec bx ;循环持续BX次
jnz l3
mov al,ah ;写回61H口原值,关闭扬声
out 61h,al
pop dx
ret ;子程序结束返回
gensound endp
;----------------------------------------------------------------------------
code_segment ends
;-------------------------------------------------------------------------------
end start
本科生课程设计成绩评定表
班级:0704 姓名:林显超 学号:0120710340419
| 序号 | 评分项目 | 满分 | 实得分 |
| 1 | 学习态度认真、遵守纪律 | 10 | |
| 2 | 设计分析合理性 | 10 | |
| 3 | 设计方案正确性、可行性、创造性 | 20 | |
| 4 | 设计结果正确性 | 40 | |
| 5 | 设计报告的规范性 | 10 | |
| 6 | 设计验收 | 10 | |
| 总得分/等级 | |||
| 评语: | |||
及格(60-69分)、60分以下为不及格
指导教师签名:
200 年 月 日
