微机原理音乐演奏课程设计.docx
《微机原理音乐演奏课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理音乐演奏课程设计.docx(24页珍藏版)》请在冰点文库上搜索。
![微机原理音乐演奏课程设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/25/c87da515-d6bc-428e-abec-06b4eda575b3/c87da515-d6bc-428e-abec-06b4eda575b31.gif)
微机原理音乐演奏课程设计
郑州航空工业管理学院
微机原理课程设计说明书
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
四、结论
本次课程设计已经顺利的结束了,在王老师悉心指导以及我们这组全体成员的共同努力下,圆满完成了本次课程设计的任务,并且达到了预期的效果。
经过一周的磨炼和努力,无论从学习上还是从自身角度,我自认都提高了不少,发现了自己的能力和未被挖掘的潜力,认证了自身的坚强与韧力,总结出只有在强压与竞争中才会有意想不到的收获和进步。
本次课程设计充分体现了团队合作的重要性,在遇到问题时,我们总会第一时间讨论研究,这次汇编课程设计为我们提供了与众不同的学习方法和学习机会,让我们从传统的被动授学转变为主动求学,把所学的理论知识真正的运用到实践中学习,增强了领悟、创新和推断的能力。
掌握自学的方法,形成工程理论整体模式,使工作、学习、生活都步入系统化流程。
思考方式成熟,逻辑性规范、明确。
这些方法的提高是终身受益的,我认为这难得的一周,让我真正懂得了生活和学习的基本规律。
总之,我认为我本次课程设计基本达到了要求,所编程序的功能也基本完善,而且程序有友好的