计算机音乐盒
1.音乐盒的功能
1)开始界面显示乐曲菜单;
2)按 1、2、3 选择乐曲演奏;
3)按 Q 键退出;
4)乐曲演奏中可以人为中断而演奏其他乐曲或退出;
2.音乐盒设计方案
(1)乐谱中的每个音符具有音高和音长两种属性,按照乐谱将每个音符的
频率和节拍定义成两个数据表,程序从频率表中取出一个音符的频率值以产
生一定音高的声音,同时取出相应的节拍计数值以控制这一频率的声音延长
的时间。
(2)每个音符的频率值经过转换后送入定时器端口,以产生相应频率的脉
冲。
(3)节拍时间表中存放的计数值是音长的 1/10,如 2 拍的音长定为 0.5
秒,对应的计数值应为 50,l 拍的音长是 0.25 秒,对应的计数值应为 25。
然后控制 100p 指令反复执行来取得音符的延长时间。
(4)乐曲演奏完后,同样要完成对 6lH 端口的复位操作以避免死机。
3.芯片引脚分配及元件清单
使用 8254 实现播放。
8254 芯片的 OUT0 管脚控制电子发声单元。
图 2
8254 的内部接口和引脚
4.设计总结
a)音乐的编写
采用如图 6 所示的音符与频率对照表将音符翻译成对应的频率。
b)如何使扬声器发声
图 5 音符与频率对照表
一个音符对应一个频率,将对应一个音符频率的方波通到扬声器上,就可以
发出这个音符的声音。将一段乐曲的音符对应频率的方波依次送到扬声器,就可
以演奏出这段乐曲。利用 8254 的方式 3—“方波发生器”,将相应一种频率的
计数初值写入计数器,就可产生对应频率的方波。
例如输入时钟采用 1MHz,要得到 800Hz 的频率,计数初值即为 1000000÷800。
对于每一个音符的演奏时间,可以通过软件延时来处理。首先确定单位延时时间
程序(根据 CPU 的频率不同而有所变化)。然后确定每个音符演奏需要几个单位
时间,将这个值送入 DL 中,调用延时子程序即可。
c)当一个音乐演奏的时候,如何随时切换到下一首音乐。
采用 16 号中断的 01H 功能,判断用户是否有输入,若有则获取用户的输入,
再根据输入进行相应的演奏。若无则继续当前的演奏。代码如下:
MOV AH,1
INT 16H
JZ
SOUND
JMP INPUT
5.程序设计图纸
接口电路图如图:
图 8
8254 的方式控制字格式
图 9
8254 读出控制字格式
图 10 8254 状态控制字格式
图 11 音乐盒接口电路图
6.源代码
IOY3 EQU 06C0H
MY8254_COUNT0 EQU IOY3+00H
EQU IOY3+06H
MY8254_MODE
;8254计数器0端口地址
;8254控制寄存器端口地址
DATA SEGMENT
sentence1
sentence2
sentence3
DB 0DH,0AH,"- - -MUSIC BOX- - -"
DB 0DH,0AH,"****Input Error****",'$'
DB 0DH,0AH,"---------------------"
DB 0DH,0AH,"--------MENU---------"
DB 0DH,0AH,"NO.1 Answers"
DB 0DH,0AH,"NO.2 Weight of the World"
DB 0DH,0AH,"NO.3 Eorzea de Chocobo"
DB 0DH,0AH,"---------------------"
DB 0DH,0AH,"**********************************"
DB 0DH,0AH,"Please select music:",'$'
MUSIC_ONE DW 661,990,990,882,786,786
DW 742,786,882,882,786,1484,1322
DW 661,990,990,882,786,786
DW 742,786,882,882,1178,882,1049,990
DW 661,990,990,882,786,786
DW 742,786,882,882,786,1484,1322
DW 661,742,786,786,742,661,589
DW 589,661,742,786,589,742,661,0
TIME_ONE
DW 4,4,4,4,4,4
DW 3,3,4,4,4,4,4
DW 4,4,4,4,4,4
DW 3,3,4,4,4,4,4
DW 4,4,4,4,4,4
DW 3,3,4,4,4,4,4
DW 4,4,4,4,4,4,4
DW 4,4,4,4,4,4,4,2
MUSIC_TWO DW 661,990,882,1178,661,990,882,1178
DW 661,990,882,1322,661,990,882,1322
DW 661,990,882,1178,661,990,882,1178
DW 661,990,882,1322,661,990,882,1322
DW 661,660,661,660,661,742,786
DW 661,660,661,660,661,742,786
DW 786,882,991,990,1049,991,990,882,882,0
TIME_TWO
DW 4,4,4,4,4,4,4,4
DW 4,4,4,4,4,4,4,4
DW 4,4,4,4,4,4,4,4
DW 4,4,4,4,4,4,4,4
DW 4,4,4,4,4,4,4
DW 4,4,4,4,4,4,4
DW 4,4,4,4,4,4,4,4,2
MUSIC_THREE DW 882,742,589,495,882,742,589,742,589,742
DW 661,589,589,661,589,525,589,525
DW 589,589,742,441,495,525
DW 882,742,589,495,882,742,589,742,589,742
DW 661,589,589,661,589,525,589,525
DW 589,589,742,882,990,1049,0
TIME_THREE DW 3,2,2,2,2,2,2,3,3,3
DW 3,2,2,2,2,2,2,3
DW 3,2,2,2,2,3
DW 3,2,2,2,2,2,2,3,3,3
DW 3,2,2,2,2,2,2,3
DW 3,2,2,2,2,3,1
DATA ENDS
STACK1 SEGMENT STACK
DW 256 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV DX,MY8254_MODE
MOV AL,36H
OUT DX,AL
;数据段装入段寄存器DS
;初始化8254工作方式
;定时器0、方式3
output MACRO a
LEA DX,a
MOV AH,09h
INT 21H
ENDM
output sentence1
output sentence3
INPUT:
;键盘输入字符并回显
MOV AH,01H
INT 21H
PUSH AX
JMP input_select
;退出
input_select:
POP AX
CMP AL,'Q'
JZ START
CMP AL,'q'
JZ START
CMP AL,'1'
JNZ B0
CALL MUSIC1
CMP AL,'2'
JNZ C0
CALL MUSIC2
B0:
C0:
CMP AL,'3'
JNZ INPUT_FALSE
CALL MUSIC3
INPUT_FALSE: output sentence2 ;宏调用,输入错误,重新输入
MUSIC1 PROC
MOV SI,OFFSET MUSIC_ONE
MOV DI,OFFSET TIME_ONE
JMP PLAY
MUSIC1 ENDP
MUSIC2 PROC
MOV SI,OFFSET MUSIC_TWO
MOV DI,OFFSET TIME_TWO
JMP PLAY
MUSIC2 ENDP
MUSIC3 PROC
MOV SI,OFFSET MUSIC_THREE
MOV DI,OFFSET TIME_THREE
JMP PLAY
MUSIC3 ENDP
;装入频率表起始地址
;装入时间表起始地址
;装入频率表起始地址
;装入时间表起始地址
;装入频率表起始地址
;装入时间表起始地址
PLAY:
MOV AH,1
INT 16H
SOUND
JZ
JMP input
SOUND:
MOV DX,0FH
MOV AX,4240H
DIV WORD PTR [SI]
MOV DX,MY8254_COUNT0
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DL,[DI]
CALL DALLY
ADD SI,2
ADD DI,2
CMP WORD PTR [SI],0
相等,则标志位ZF=1
JE
JMP
END_MUSIC
PLAY
END_MUSIC: JMP START
DALLY PROC
D0:
MOV CX,0010H
MOV AX,0F00H
D1:
D2:
;输入时钟为1MHz,1M=0F4240H
;取出频率值计算计数初值0F4240H / 输出频率
;装入计数初值
;取出演奏时间,调用延时子程序
;定义的值为DW,地址每次+2
;每首歌结尾都为0,用当前频率值与0比较,若
;若ZF=0,跳转
;延时子程序
;循环次数由CX决定
DEC AX
JNZ D2
LOOP D1
DEC DL
JNZ D0
RET
DALLY ENDP
CODE ENDS
END START
7.实验箱连线及结果图
(1)实验箱连线图:
(2)实验结果图: