微原理与接口技术课程设计音乐盒.docx
- 文档编号:29245876
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:22
- 大小:119.20KB
微原理与接口技术课程设计音乐盒.docx
《微原理与接口技术课程设计音乐盒.docx》由会员分享,可在线阅读,更多相关《微原理与接口技术课程设计音乐盒.docx(22页珍藏版)》请在冰豆网上搜索。
微原理与接口技术课程设计音乐盒
微机原理与接口技术
课程设计报告
学院:
班级:
姓名:
指导老师:
时间:
一、课程名称及设计组成员——————————————3
二、课程内容及要求—————————————————3
三、方案、系统硬件组成框图以及工作原理说明——————3
1、方案——————————————————————3
2、工作原理————————————————————3
3、系统硬件组成框图————————————————4
四、程序功能描述及程序流程——————————————4
1、程序功能描述——————————————————4
2、程序流程————————————————————4
五、程序源代码及注释—————————————————6
六、DOS功能调用,文件列表清单————————————14
七、程序调试出现的问题、原因及排除——————————15
八、收获和体会————————————————————16
九、参考文献—————————————————————17
一、课题名称及设计组成员
(1)课程名称:
计算机音乐播放系统设计
(2)设计组成员:
二、课程内容及要求
课程内容:
设计一个汇编语言程序,实现计算机音乐播放系统。
实现功能如下:
(1)制作一个菜单,使用菜单条选择功能,让用户选择演奏的乐曲,不少于5首。
(2)用定时器方式演奏《梁祝》实现音乐演奏。
(3)提示使用ESC键或者ENTER键可以退出当前过程或返回DOS
(4)使用控制变量可以控制不同的效果以及要求,如播放速度,间隔等。
(5)界面美观,程序结构化程度高,模块结构合理。
三、方案、系统硬件组成框图以及工作原理说明
1、方案
基于PC计算机时钟晶振为1.1931816MHz,利用电脑中的蜂鸣器发出声音。
各音阶标称频率值:
音符:
1234567
(重低音)
对应频率:
(Hz)131147165175196220247
(低音)
对应频率:
(Hz)262294330349392440494
(中音)
对应频率:
(Hz)523587659698784880988
(高音)
对应频率:
(Hz)1046117513181397156817601975
2、工作原理说明
软件设计是本设计的重点,在软件设计中,要给8253和8255写数据,同时还要检测键盘输入的值,并根据输入的值,执行相应的代码来控制音乐的播放。
首先在一开始先显示音乐菜单,然后调用DOS中21H的01中断来接收键盘上的数据,在此过程中,程序在等待中,直到键盘上有键按下,程序才进行相应的操作。
当键盘输入一个值后,首先判断输入的值是否为“0”,如果是,那就退出程序,如果不是,再检测输入的数是否在1-4之间,如果是,那就调用相应的播放音乐的程序,否则我们重新提上,让其输入0-4之间的数值。
在音乐播放中,要实时的扫描键盘是否有值输入,如果用DOS中21H的01中断肯定是不行的,因为执行这个中断程序会等待,无法继续播放音乐。
因此采用中断21H中的0bH,这个中断不会等待,只会检查标准输入设备上是否有字符可读。
然后通过检测AL中的值是否为0FFH,来判断键盘是否有值输入。
如果键盘上有键输入,那么AL中会返回一个0FFH的值,否则就会返回00H。
如果有,再判断这个输入的值是否为“p”,如果是,就停止音乐的播放,否则继续播放音乐,由于程序运行非常快,这样就不会感觉到音乐有停顿现象。
实现和音乐演奏的同时实时扫描键盘的功能。
当音乐播放完后,调用JMP命令跳回到主菜单,再次让操作者选择播放哪一首歌或是选择退出。
在音乐暂停后,显示输入提示:
如果按“s”值继续音乐播放。
然后调用DOS中21H的01中断来接收键盘上的数据,在此过程中,程序在等待中,直到键盘上有键按下,然后我们按输入的数进行相应的操作,如果都不是,怎继续输入,知道输入正确的为止。
在这个设计中,最终要返回主菜单,然后通过按“Esc”等键退出。
3、硬件组成框图
PC机相关电路以及相关接口电路如下:
四、程序功能描述及程序流程
1、程序功能描述
计算机播放器系统:
显示入口菜单;
共5首待选择音乐:
1、北京欢迎你2、春天花会开3、欢乐颂4、但愿人长久
5、情非得已
播放功能:
音乐播放中途暂停、快进、放慢、单曲循环、列表循环、退出播放器
2、程序流程
主流程:
开始————显示音乐菜单————提示输入选择————判断输入是否为0,若是则退出程序————若否则判断是否在数字范围内————若是则调用音乐播放程序
音乐播放流程:
按键中断流程:
输入————判断输入所选择的功能————进入各功能子程序————根据各程序功能返回主程序
五、程序源代码及注释
DATASSEGMENT
SHOWDB0AH,0DH
DB'***************************************',0AH,0DH
DB'thisisamusicprogram!
pleaseselect!
',0AH,0DH
DB'***************************************',0AH,0DH
DB0AH,0DH
DB'Inthispart,youcanpressbelowkeystoenjoymusic:
',0AH,0DH
DB'1.beijinghuanyingni',0AH,0DH
DB'2.chuntianhuahuikai',0AH,0DH
DB'3.huanlesong',0AH,0DH
DB'4.danyuanrenchangjiu',0AH,0DH
DB'5.qingfeideyi',0AH,0DH
DB'Youcanpress',60H,'Esc',27H,'or',60H,'Enter',27H,'toexit.',0AH,0DH
DB0AH,0DH
DB'Duringthesongyoucanpressbelowkeystosetthespeedandplaybackmode:
',0AH,0DH
DB'u->Faster',0AH,0DH
DB'd->Slower',0AH,0DH
DB'p->Pause',0AH,0DH
DB's->Start',0AH,0DH
DB'q->Quit',0AH,0DH,'$'
WAIT_MDB0AH,0DH
DB'musicing','...',0AH,0DH,'$'
ERROR_ODB0AH,0DH,'Yourorderiserror,pleaseentertherightone:
$'
QDB0AH,0DH,'Thesongisover,youcanchooseasongagain.$'
PDB0AH,0DH,'Havearest,youcanpressstostartthesongagain.$'
SDB0AH,0DH,'Youhasstartthesongagain.',0AH,0DH,'$'
UDB0AH,0DH,'Youhavemadethebeatshorter.',0AH,0DH,'$'
DDB0AH,0DH,'Youhavemadethebeatlonger.',0AH,0DH,'$'
OVERDB0AH,0DH,'***************************************$'
DB0AH,0DH,'thisisamusicprogram!
pleaseselect!
$'
DB0AH,0DH,'***************************************$'
;****************************北京欢迎你*****************************
TONES_1DW659,2DUP(659,784,659,587,659,587,659,659,587,440,523,659,587,587,523,440,523,587,659,784,587,659,880,784,440,587,523)
DW587,523,440,523,587,659,784,587,659,880,784,784,659,587,659,587,523,784,880,587,440,659,587,587,523,-1
BEAT_1DW7DUP(25*200),50*200,5DUP(25*200),25*600,13DUP(25*200),25*600,6DUP(25*200),50*200,5DUP(25*200),25*600,13DUP(25*200),25*600
DW12DUP(25*200),50*400,6DUP(25*200),50*200,4DUP(25*200),50*200
;**************************春天花会开******************************
TONES_2DW392,392,392,392,440,392,330,294,262,262,262,220,294
DW392,392,392,392,330,494,220,262,262,262,330,294,330,440,220,262,-1
BEAT_2DW25*200,3DUP(25*200,50*200,25*200,50*200,50*200,50*400)
DW25*200,50*200,25*200,50*200,50*200,50*200,50*200,4DUP(25*200)
;****************************欢乐颂*****************************
TONES_3DW330,330,330,349,392,392,349,330,294,262,262,294,330,330,294,294
DW330,330,349,392,392,349,330,294,262,262,294,330,294,262,262,-1
BEAT_3DW13DUP(50*200),25*600,2DUP(25*200)
DW12DUP(50*200),25*600,2DUP(25*200)
;**************************但愿人长久******************************
TONES_4DW262,262,262,220,196,220,262,262,262,220,196,220,294
DW330,262,220,330,262,220,294,262,220,349,349,220,262,294,294,196,247,220,247,262,-1
BEAT_4DW100,2DUP(50*200,25*200,25*200,25*600,25*200,50*400)
DW2DUP(50*200,25*200,25*200),25*600,25*200,50*400,50*200,50*200,25*200,25*600,50*400,50*200,50*200,25*200,50*200,25*200,50*400
;***************************情非得已*****************************
TONES_5DW592,592,523,587,659,587,587
DW4DUP(523),784,784,659,784,3DUP(659),587,659,698,659,659
DW659,587,523,523,440,440,523,587
DW4DUP(392),440,523,523,440,659,523,523,587,587,523,523,-1
BEAT_5DW12DUP(25*200),50*600,6DUP(25*200),50*200,25*200,25*200,50*600
DW6DUP(25*200),50*200,25*200,25*200,50*600,12DUP(25*200),50*600
BEATDW?
EXIT_BOXDB?
SIDIDW4DUP(?
)
DATASENDS
;数据段定义
STACKSSEGMENT
STACKSENDS
;堆栈段定义
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
MAINPROCFAR
MOVAX,DATAS
MOVDS,AX
LEASI,SHOW
CALLDISPLAY;显示菜单列表
CALLINPUT
DONE:
LEASI,OVER
CALLDISPLAY;显示结束菜单
MAINENDP
;************显示菜单列表*************
DISPLAYPROCNEAR
MOVDX,SI
MOVAH,09H
INT21H
RET
DISPLAYENDP
INPUTPROCFAR
PUSHAX
LEABX,BEAT
MOV[BX],28010
LEABX,EXIT_BOX
MOV[BX],0
MOVAH,01H
INT21H;输入字符
CMPAL,0DH
JZEXIT
CMPAL,1BH
JZEXIT
CMPAL,'1';判断输入选择歌曲1,2,3,4,5
JZSONG_1
CMPAL,'2'
JZSONG_2
CMPAL,'3'
JZSONG_3
CMPAL,'4'
JZSONG_4
CMPAL,'5'
JZSONG_5
JMPINPUT
SONG_1:
LEASI,WAIT_M;提示音乐播放中
CALLDISPLAY
LEASI,TONES_1
LEADI,BEAT_1;导入相应乐谱,音节存放地址
MOVSIDI,SI
MOVSIDI+2,DI;用SIDI记录存放地址
CALLPLAY_MUSIC;开启音乐播放程序
JMPINPUT
SONG_2:
LEASI,WAIT_M;提示音乐播放中
CALLDISPLAY
LEASI,TONES_2
LEADI,BEAT_2;导入相应乐谱,音节存放地址
MOVSIDI,SI
MOVSIDI+2,DI;用SIDI记录存放地址
CALLPLAY_MUSIC;开启音乐播放程序
JMPINPUT
SONG_3:
LEASI,WAIT_M;提示音乐播放中
CALLDISPLAY
LEASI,TONES_3
LEADI,BEAT_3;导入相应乐谱,音节存放地址
MOVSIDI,SI
MOVSIDI+2,DI;用SIDI记录存放地址
CALLPLAY_MUSIC;开启音乐播放程序
JMPINPUT
SONG_4:
LEASI,WAIT_M;提示音乐播放中
CALLDISPLAY
LEASI,TONES_4
LEADI,BEAT_4;导入相应乐谱,音节存放地址
MOVSIDI,SI
MOVSIDI+2,DI;用SIDI记录存放地址
CALLPLAY_MUSIC;开启音乐播放程序
JMPINPUT
SONG_5:
LEASI,WAIT_M;提示音乐播放中
CALLDISPLAY
LEASI,TONES_5
LEADI,BEAT_5;导入相应乐谱,音节存放地址
MOVSIDI,SI
MOVSIDI+2,DI;用SIDI记录存放地址
CALLPLAY_MUSIC;开启音乐播放程序
JMPINPUT
EXIT:
POPAX;栈顶内容取出并存到目的操作数中,同时修正堆栈指针
MOVAH,4CH
INT21H;返回DOS系统
RET
INPUTENDP
;**************音乐播放子函数***************
PLAY_MUSICPROCFAR
AGAIN:
CMP[SI],0FFFFH;判断一段音乐是否结束
JZCIRCLE;若结束,则单曲循环
CALLKEY_C;按键中断运行
LEABX,EXIT_BOX
CMPBYTEPTR[BX],3
JZERROR
CMPBYTEPTR[BX],2
JZRETURN
CMPBYTEPTR[BX],1
JZAGAIN
CMPBYTEPTR[BX],0
JZNEXT
ERROR:
;错误控制
PUSHSI
LEASI,ERROR_O
CALLDISPLAY
POPSI
JMPRETURN
NEXT:
MOVAL,0B6H;计数器的控制字要写入控制寄存器
OUT43H,AL;输入控制字寄存器,选用方式2,工作在方式三
MOVDX,12H;把给定频率的高八位送给DX
MOVAX,3280H;把给定频率的低八位送给AX
DIVWORDPTR[SI];SI的内容为给定的频率,放入
OUT42H,AL;低八位写入计数器二
MOVAL,AH;将高八位内容送到AL
OUT42H,AL;用两次计数器通道2用于发声
CALLSPK_ON;启动蜂鸣器
MOVCX,[DI]
BEAT_M:
;节拍控制
PUSHCX
LEABX,BEAT
MOVCX,[BX]
DELAY_M:
;延时控制
LOOPDELAY_M
POPCX
LOOPBEAT_M
INCSI
INCSI
INCDI
INCDI
CALLSPK_OFF;关闭蜂鸣器
JMPAGAIN
CIRCLE:
MOVSI,SIDI
MOVDI,SIDI+2;将其地址送回SI、DI
JMPPLAY_MUSIC
RETURN:
RET;返回系统
PLAY_MUSICENDP
;***************按键中断子函数*************
KEY_CPROCFAR
PUSHAX
MOVAH,0BH
INT21H
XORAH,AH
CMPAL,0FFH
JZOK
JMPOUT_K
OK:
MOVAH,01H
INT21H;输入
XORAH,AH
CMPAL,0DH
JZQUIT
XORAH,AH
CMPAL,1BH
JZQUIT
XORAH,AH
CMPAL,'q';判断输入选择功能
JZQUIT
XORAH,AH
CMPAL,'u'
JZUP
XORAH,AH
CMPAL,'d'
JZDOWN
XORAH,AH
CMPAL,'p'
JZPAUSE
XORAH,AH
CMPAL,'s'
JZSTART_K
JMPERROR_W
START_K:
;暂停后开始
LEABX,EXIT_BOX
MOV[BX],0
PUSHSI
LEASI,S
CALLDISPLAY
POPSI
JMPOUT_K
PAUSE:
;暂停
LEABX,EXIT_BOX
MOV[BX],1
PUSHSI
LEASI,P
CALLDISPLAY
POPSI
JMPOUT_K
QUIT:
;退出程序
LEABX,EXIT_BOX
MOV[BX],2
PUSHSI
LEASI,Q
CALLDISPLAY
POPSI
JMPOUT_K
DOWN:
;减速
LEABX,BEAT
MOVAX,[BX]
ADDAX,1000
MOV[BX],AX
PUSHSI
LEASI,D
CALLDISPLAY
POPSI
JMPOUT_K
UP:
;加速
LEABX,BEAT
MOVAX,[BX]
SUBAX,1000
MOV[BX],AX
PUSHSI
LEASI,U
CALLDISPLAY
POPSI
JMPOUT_K
ERROR_W:
;程序出错
LEABX,EXIT_BOX
MOV[BX],3
JMPOUT_K
OUT_K:
POPAX;恢复AX的值
RET
KEY_CENDP
;**************开蜂鸣器子函数***************
SPK_ONPROCNEAR
PUSHAX;保存ax的值
INAL,61H;获取61h端口的当前值
ORAL,03H;把61h端口低二位置1,即打开蜂鸣器
OUT61H,AL;输出数据到61h端口
POPAX;恢复ax的值
RET
SPK_ONENDP
;**************关蜂鸣器子函数***************
SPK_OFFPROCNEAR
PUSHAX;保存ax的值
INAL,61H;获取61h端口的当前值
ANDAL,0FCH;把61h端口低二位置0,即关闭蜂鸣器
OUT61H,AL;输出数据到61h端口
POPAX;恢复ax的值
RET
SPK_OFFENDP
CODESENDS
ENDMAIN
六、DOS功能调用,文件列表清单
要涉及一些dos的系统功能的调用,系统功能调用是DOS为用户提供的常用子程序(80多个),可在汇编语言程序中直接调用。
这些子程序的主要功能包括:
(1)设备管理(如键盘、显示器、打印机、磁盘等的管理)
(2)文件管理和目录操作(我们的系统主要要涉及的)
(3)其他管理(如内存、时间、日期等管理)
这些子程序给用户编程带来很大方便,用户不必了解有关的设备、电路、接口等方面的问题,只需直接调用即可。
2、调用方法
DOS功能调用的子程序已按顺序编号——功能号(00H~68H),其调用方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 原理 接口 技术 课程设计 音乐盒
![提示](https://static.bdocx.com/images/bang_tan.gif)