logo资料库

汇编语言课程设计-计算机音乐盒.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
计算机音乐盒
1.音乐盒的功能
3.芯片引脚分配及元件清单
4.设计总结
计算机音乐盒 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)实验结果图:
分享到:
收藏