微机原理音乐演奏课程设计.docx

上传人:b****1 文档编号:10435432 上传时间:2023-05-25 格式:DOCX 页数:24 大小:141.33KB
下载 相关 举报
微机原理音乐演奏课程设计.docx_第1页
第1页 / 共24页
微机原理音乐演奏课程设计.docx_第2页
第2页 / 共24页
微机原理音乐演奏课程设计.docx_第3页
第3页 / 共24页
微机原理音乐演奏课程设计.docx_第4页
第4页 / 共24页
微机原理音乐演奏课程设计.docx_第5页
第5页 / 共24页
微机原理音乐演奏课程设计.docx_第6页
第6页 / 共24页
微机原理音乐演奏课程设计.docx_第7页
第7页 / 共24页
微机原理音乐演奏课程设计.docx_第8页
第8页 / 共24页
微机原理音乐演奏课程设计.docx_第9页
第9页 / 共24页
微机原理音乐演奏课程设计.docx_第10页
第10页 / 共24页
微机原理音乐演奏课程设计.docx_第11页
第11页 / 共24页
微机原理音乐演奏课程设计.docx_第12页
第12页 / 共24页
微机原理音乐演奏课程设计.docx_第13页
第13页 / 共24页
微机原理音乐演奏课程设计.docx_第14页
第14页 / 共24页
微机原理音乐演奏课程设计.docx_第15页
第15页 / 共24页
微机原理音乐演奏课程设计.docx_第16页
第16页 / 共24页
微机原理音乐演奏课程设计.docx_第17页
第17页 / 共24页
微机原理音乐演奏课程设计.docx_第18页
第18页 / 共24页
微机原理音乐演奏课程设计.docx_第19页
第19页 / 共24页
微机原理音乐演奏课程设计.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

微机原理音乐演奏课程设计.docx

《微机原理音乐演奏课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理音乐演奏课程设计.docx(24页珍藏版)》请在冰点文库上搜索。

微机原理音乐演奏课程设计.docx

微机原理音乐演奏课程设计

 

郑州航空工业管理学院

微机原理课程设计说明书

 

2012级电气工程及其自动化专业1206971XX班级

 

题目音乐演奏

姓名XXX学号*******XX

指导教师XXX职称博士

 

二О一二年十二月十三日

摘要

大学生动手能力的培养和提高一直是教育工作者探索的课题,《微机原理与接口技术》就是一门实用性很强的课程。

如何让学生在学好基础知识的同时,迅速掌握设计应用技术,其中实验与课程设计环节起着非常重要的作用。

通过此次课程设计,使学生能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。

培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

众所周知,随着科学技术的迅猛发展,计算机在各个领域的应用越来越广泛。

计算机已成为人们生活、学习、工作中必备的工具。

其中,汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。

借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。

本次课程设计的过程重视基础、系统性和使用性相结合,以80X86未处理器为对象,以8253/8254为计数器的核心,通过宏指令和BOIS系统功能的调用,以及运用MASM软件在PC机上来进行调试和运行,从而模拟地来实现“音乐演奏”的目的。

本次课程设计过程中,我们组得到了老师的热情帮助,并且参考了一些大学生电子设计竞赛的一些设计资料和一些书籍,在此谨向我的老师以及其作者表示衷心的感谢。

关键词:

MASM软件、汇编语言

 

一、音乐演奏的基本原理

这次课程设计的设计思想是在熟练掌握汇编程序的设计方法的基础上,利用通用发生程序编写音乐程序.组成音乐的每个音符的频率值和持续时间是音乐程序发声所需要的两个数据,根据音调与频率和时间之间的关系,把要编辑的音乐的每个音符的频率和持续时间进行定义,进而把它们写入通用发声程序,音乐程序就完成。

在编制此音乐演奏程序时,应该知道ROMBIOS中有个BEEP子程序,这能根据BL中组出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。

首先要了解计算机是如何产生声音和乐曲的。

找出相关程序源代码,弄清楚各功能的环节间的联系、联接方法,搞清楚单调与频率和时间的关系,利用计算机控制发声的原理,依照基本的算法思想写程序,测试,更正,扩充功能,修饰细节。

二、设计方案

(一)、设计内容

要求完成一个音乐程序,即通过按下键盘上某个按键就可以按预先设定的程序播放音乐或者终止程序。

当键入大写字母“A”时,唱乐曲“玛丽有只小羔羊”;当键入大写字母“B”,唱乐曲“祝福歌”;当键入大写字母“C”,唱乐曲“两只老虎”;当键入大写字母"Q"鍵,退出。

此程序涉及到过程和宏的调用,要求学生掌握关于过程和宏的定义和使用。

可以设定播放某一段音乐为一个过程,设定对音乐进行播放的操作为一个宏操作。

(二)、主要的宏和过程的实现

1.DISPLAY显示宏

为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。

将b的地址传到DX。

随后调用DOS09号功能调用。

将字符串显示到屏幕。

调用DISPLAY的实例为:

DISPLAYINFO1

DISPLAYINFO2

DISPLAYINFO3

DISPLAYMUSLIST

在此段代码中,程序显示提示作用的字符串和歌曲列表。

DISPLAY宏具体实现如下:

DISPLAYMACROB

LEADX,B

MOVAH,9

INT21H

ENDM

2.音乐地址宏

歌曲包含节拍和频率。

此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入SI将歌曲节拍导入BP。

当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在MUSIC中实现发声。

音乐地址宏实现如下:

ADDRESSMACROA,B

LEASI,A

LEABP,DS:

B

ENDM

3.MUSIC宏

在ADDRESS中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。

为了检测歌曲是否结束,在MUSIC中,首先将SI传递到DI,DI与-1相减,如等于0,则得出该频率定义为-1。

在歌曲频率表定义中将-1定为该歌曲结束标志,此时MUSIC跳出结束。

若该频率不为-1。

调用通用发生程序GENSOUND,将该音符按照频率和节拍表发声。

发声后SI、BP分别加2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。

如频率不为0,继续将该音符发声,并循环此过程。

具体实现方法如下:

MUSICPROCNEAR

PUSHDS

SUBAX,AX

PUSHAX

FREG:

MOVDI,[SI]

CMPDI,-1

JEEND_MUS

MOVBX,DS:

[BP]

CALLGENSOUND

ADDSI,2

ADDBP,2

JMPFREG

END_MUS:

RET

MUSICENDP

4.通用发声程序GENSOUND

该发生程序是在修改BEEP发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序。

该程序包括以下三个步骤:

(1)在8253/54中的43端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值。

(2)在8253/54中的42H端口装入一个16位计数值,已建立将要产生的声音频率。

(3)把输出端口61H的0、1两位置1,发出声音。

具体实现如下:

GENSOUNDPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHDI

MOVAL,0B6H

OUT43H,AL

MOVDX,12H

MOVAX,348CH

DIVDI

OUT42H,AL

MOVAL,AH

OUT42H,AL

INAL,61H

MOVAH,AL

ORAL,3

OUT61H,AL

WAIT1:

MOVCX,3314

CALLWAITF

DELAY1:

DECBX

JNZWAIT1

MOVAL,AH

OUT61H,AL

POPDI

POPDX

POPCX

POPBX

POPAX

RET

GENSOUNDENDP

该GENSOUND程序能产生19~65535Hz的声音,这个频率的下限是使除法不产生溢出的最小值。

其上限65535是多余的,因为人能听到的声音最高频率为20000Hz。

此外一般情况下,GENSOUND程序产生的声音不单单和频率有关,还和CPU有关。

CPU工作频率越高,时延越短,产生的声音越急促。

为了使程序产生一个与CPU工作频率无关的合适时延,在MUSCI中调用了一个时间延时程序WAITF。

5.WAITF延时程序

80x86的各种处理器采取了6~66MHz的工作频率,loop指令的执行时间在这些处理器上也不相同。

为了建立一个与处理器无关的延时,IBM采用了一种利用硬件产生时间延时的方法,即通过监控端口61H和PB4,使PB4每15.08微秒触发一次,一产生一个固定不变的时间基准。

在IBMPCATBIOS的WAITF子程序,就是一个产生Nx15.08微秒时间演示的程序。

调用WAITF子程序时,CX寄存器必须装入15.08微秒的倍数N。

利用WAITF子程序能获得任意的时间延时,而不必在考虑CPU的型号和工作频率。

具体实现如下:

WAITFPROCNEAR

PUSHAX

WAITF1:

INAL,61H

ANDAL,10H

CMPAL,AH

JEWAITF1

MOVAH,AL

LOOPWAITF1

POPAX

RET

WAITFENDP

6.CLEAR清屏程序

当程序初始化或用户输入错误时,程序调用CLEAR清屏程序。

清屏程序将AX、BX、CX、DX先入栈,以保存现场,保证清屏后重新执行不会出现错误。

随后启用BIOS功能调用,将屏幕初始化或上卷。

其中AL=0表示初始化窗口,AL=上卷行数,BH=卷入行属性,CH/CL=左上角行/列号,DH/DL=右上角行/列号。

该程序段表示从左起0行0列到右起24行79列全部清屏。

将屏幕清空后重新将AX、BX、CX、DX出栈。

CLEARPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVAH,6

MOVAL,0

MOVCH,0

MOVCL,0

MOVDH,24

MOVDL,79

MOVBH,7

INT10H

POPDX

POPCX

POPBX

POPAX

RET

CLEARENDP

7.RETU退出

当程序要求退出时,主程序会调用RETU进行退出。

RETU程序内容实际为一个BIOS功能调用。

RETU:

MOVAH,4CH

INT21H

(三)、主程序实现

1.数据段定义

数据段分别定义了INFO1、INFO2、INFO3、INFO4、INFO5各字符串分别显示程序运行之初对用户的提示。

MUSLIST中显示用户能选择的三首歌曲列表。

程序用MUS_FREG、MUS_TIME分别定义了音乐频率和节拍。

使得发声程序可以按照理想的要求发出连续的乐曲。

节拍和频率定义原理如下:

乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。

可参考下表:

音名CDEFGABCDEFGABC

唱名12345671234567i

频率(HZ)131147165175196220247262294330349392440492523

其中,低音阶从低音C(131HZ)到中央C(262HZ),高音阶从中央C(262HZ)到高音C(523HZ)。

组成乐曲的音符的频率值和持续时间是乐曲程序发声所必需的两组数据,频率可以查上表,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。

在4/4拍中,四分音符为一拍,每小节四拍,全音符持续四拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍。

如果给全音符分配1秒(100*10ms)的时间,则二分音符持续时间为0.5秒,四分音符持续时间为0.25秒,八分音符持续时间为0.125秒。

知道了音调及频率、时间的关系后,可以按照乐曲的乐谱将每个音符的频率和持续时间定义为两个数据表,然后编写程序依次取出表中的频率值和时间值。

“玛丽有只小羊羔”的乐谱如下:

3212|333—|222—|355—|3212|3333|2232|1——|

可设置该乐曲的频率表如下:

MUS1_FDW330,294,262,294,3DUP(330)

DW3DUP(294),330,392,392

DW330,294,262,294,4DUP(330)

DW294,294,330,294,262,-l

设置该乐曲的节拍时间表如下:

一般延迟时间取10ms的倍数。

MUSl—TDW6DUP(25*8),50*8

DW2DUP(25*8,25*8,50*8)

DW12DUP(25*8),100*8

2.堆栈段定义

程序定义了一个长度了200的堆栈段,如下:

STACKSEGMENT

DB200DUP('STACK')

STACKENDS

3.初始化

程序初始化使用了BIOS功能调用。

使用0AH号功能设置显示方式。

本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示。

若要求改变显示方式,可以根据0AH功能设置表自行添加。

START:

MOVAX,DATA

MOVDS,AX

MOVAH,0

MOVAL,00

INT10H

(四)、程序的调试运行

将源程序编写后,在PC机上编译、连接、装载。

如图4-1,图4-2。

图4-1准备编译程序

图4-2编译连接正确

待装载成功后,运行程序,运行情况如图4-3,图4-4,图4-5。

图4-3程序初始界面

图4-4程序键入大写字母B

图4-5播放后退出

 

三、软件设计

(一)、主程序流程图

 

(二)、子程序流程图:

 

 

(三)、程序代码

DATASEGMENT

INFO1DB0DH,0AH,'WELCOMEYOUTOCOMMEHERE!

$'

INFO2DB0DH,0AH,'Thisisamusicprogram!

$'

INFO3DB0DH,0AH,'pleaseselectwhichonetoplay!

$'

INFO4DB0DH,0AH,'INPUTERROR!

$'

INFO5DB0DH,0AH,'PIEASEINPUTAGAIN!

$'

MUSLISTDB0DH,0AH,'AMUSIC:

Maryhasalittleship'

DB0DH,0AH,'BMUSIC:

Blessingsong'

DB0DH,0AH,'CMUSIC:

Twotiger'

DB0DH,0AH,'QEXIT'

DB0DH,0AH,'$'

;******************************************音乐一玛丽有只小羊羔

MUS_FREG1DW330,294,262,294,3DUP(330);音乐1的频率节拍1,2小节

DW3DUP(294),330,392,392;3,4小节

DW330,294,262,294,4DUP(330);5,6小节

DW294,294,330,294,262,-1;7,8小节

MUS_TIME1DW6DUP(25*8),50*8;音乐1的时间节拍表1,2小节

DW2DUP(25*8,25*8,50*8);3,4小节

DW12DUP(25*8),100*8;5~8小节

;*******************************************音乐二祝福歌

MUS_FREG2DW262,262,294,262,349

DW330,262,262,294,262

DW392,349,262,262,523

DW440,349,262,262,466

DW466,440,262,392,349,-1

MUS_TIME2DW50,50,100,100,100

DW100,100,50,50,100,100

DW100,100,100,50,50,100

DW100,100,100,100,100,50

DW50,100,100,100,100,100

;******************************************音乐三两只老虎

MUS_FREG3DW262,294,330,262

DW262,294,330,262

DW330,349,392

DW330,349,392

DW392,440,392,349,330,262

DW392,440,392,349,330,262

DW294,196,262

DW294,196,262,-1

MUS_TIME3DW50,50,100,100,100

DW100,100,50,50,100,100

DW100,100,100,50,50,100

DW100,100,100,100,100,50

DW50,100,100,100,100,100

DATAENDS

;***********************************************************

STACKSEGMENT

DB200DUP('STACK');初始化堆栈

STACKENDS

CODESEGMENT

ASSUMEDS:

DATA,SS:

STACK,CS:

CODE

START:

MOVAX,DATA;数据段装入段寄存器DS

MOVDS,AX

MOVAH,0;BIOS功能调用,设置显示方式

MOVAL,00

INT10H

;**********定义一个宏显示

DISPLAYMACROB;定义一个宏

LEADX,B

MOVAH,9;9号doc调用

INT21H

ENDM

;**********************音乐地址宏

ADDRESSMACROA,B

LEASI,A

LEABP,DS:

B

ENDM

;***********************

DISPLAYINFO1

DISPLAYINFO2

DISPLAYINFO3

DISPLAYMUSLIST

INPUT:

MOVAH,01H;键盘输入并回显

INT21H

CMPAL,'Q'

JZRETU;退出

CMPAL,'A'

JNZB0

ADDRESSMUS_FREG1,MUS_TIME1

CALLMUSIC

JMPEXIT1

B0:

CMPAL,'B'

JNZC0

ADDRESSMUS_FREG2,MUS_TIME2

CALLMUSIC

JMPEXIT1

C0:

CMPAL,'C'

JNZEXIT

ADDRESSMUS_FREG3,MUS_TIME3

CALLMUSIC

EXIT1:

DISPLAYINFO5;宏调用

JMPINPUT

EXIT:

CALLCIEAR

DISPLAYINFO4

DISPLAYINFO5

DISPLAYINFO1

DISPLAYINFO2

DISPLAYINFO3

DISPLAYMUSLIST

JMPINPUT

RETU:

MOVAH,4CH;带返回码终止

INT21H

;******************************************发声

GENSOUNDPROCNEAR

PUSHAX;保存将要用到的寄存器

PUSHBX

PUSHCX

PUSHDX

PUSHDI

MOVAL,0B6H;向8253-5/8254-2计数器写入控制字

OUT43H,AL;方式3、双字节写和二进制计数方式写到控制口

MOVDX,12H;设置被除数

MOVAX,348CH

DIVDI;其商(AX)为预置值

OUT42H,AL

MOVAL,AH

OUT42H,AL

INAL,61H;读8255端口B(61H)原值

MOVAH,AL;保存端口原值

ORAL,3

OUT61H,AL;接通扬声器

WAIT1:

MOVCX,3314;在80486/DX2/66中取

CALLWAITF

DELAY1:

DECBX

JNZWAIT1

MOVAL,AH;写回61H口原值,关闭扬声

OUT61H,AL

POPDI;恢复寄存器

POPDX

POPCX

POPBX

POPAX

RET;子程序结束返回

GENSOUNDENDP

;********************************************

WAITFPROCNEAR

PUSHAX

WAITF1:

INAL,61H

ANDAL,10H

CMPAL,AH

JEWAITF1

MOVAH,AL

LOOPWAITF1

POPAX

RET

WAITFENDP

;*********************************************音乐播放

MUSICPROCNEAR

PUSHDS

SUBAX,AX

PUSHAX

FREG:

MOVDI,[SI]

CMPDI,-1

JEEND_MUS

MOVBX,DS:

[BP]

CALLGENSOUND

ADDSI,2

ADDBP,2

JMPFREG

END_MUS:

RET

MUSICENDP

;************************************CLEAR清屏程序

CLEARPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVAH,6;屏幕初始化

MOVAL,0

MOVCH,0;左上角行号为0

MOVCL,0;左上角列号为0

MOVDH,24;右下角行号为24

MOVDL,79;右下角列号为79

MOVBH,7;卷入行属性为7

INT10H;调用显示BIOS

POPDX

POPCX

POPBX

POPAX

RET

CLEARENDP

CODEENDS

ENDSTART

四、结论

本次课程设计已经顺利的结束了,在王老师悉心指导以及我们这组全体成员的共同努力下,圆满完成了本次课程设计的任务,并且达到了预期的效果。

经过一周的磨炼和努力,无论从学习上还是从自身角度,我自认都提高了不少,发现了自己的能力和未被挖掘的潜力,认证了自身的坚强与韧力,总结出只有在强压与竞争中才会有意想不到的收获和进步。

本次课程设计充分体现了团队合作的重要性,在遇到问题时,我们总会第一时间讨论研究,这次汇编课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学,把所学的理论知识真正的运用到实践中学习,增强了领悟、创新和推断的能力。

掌握自学的方法,形成工程理论整体模式,使工作、学习、生活都步入系统化流程。

思考方式成熟,逻辑性规范、明确。

这些方法的提高是终身受益的,我认为这难得的一周,让我真正懂得了生活和学习的基本规律。

总之,我认为我本次课程设计基本达到了要求,所编程序的功能也基本完善,而且程序有友好的

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

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2