微原理与接口技术课程设计音乐盒.docx

上传人:b****5 文档编号:29245876 上传时间:2023-07-21 格式:DOCX 页数:22 大小:119.20KB
下载 相关 举报
微原理与接口技术课程设计音乐盒.docx_第1页
第1页 / 共22页
微原理与接口技术课程设计音乐盒.docx_第2页
第2页 / 共22页
微原理与接口技术课程设计音乐盒.docx_第3页
第3页 / 共22页
微原理与接口技术课程设计音乐盒.docx_第4页
第4页 / 共22页
微原理与接口技术课程设计音乐盒.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

微原理与接口技术课程设计音乐盒.docx

《微原理与接口技术课程设计音乐盒.docx》由会员分享,可在线阅读,更多相关《微原理与接口技术课程设计音乐盒.docx(22页珍藏版)》请在冰豆网上搜索。

微原理与接口技术课程设计音乐盒.docx

微原理与接口技术课程设计音乐盒

 

微机原理与接口技术

课程设计报告

 

学院:

班级:

姓名:

指导老师:

时间:

一、课程名称及设计组成员——————————————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),其调用方

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1