汇编课程设计论文乐曲点播程序Word下载.docx
《汇编课程设计论文乐曲点播程序Word下载.docx》由会员分享,可在线阅读,更多相关《汇编课程设计论文乐曲点播程序Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
就本程序具体而言:
知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表;
然后编写程序依次取出表中的频率值和时间值,调用Do_Music程序发出各种声音。
执行此程序后,选择所要播放的乐曲,程序会快速且有效的通过程序界面所提示的信息选取所要欣赏的乐曲并播放。
关键词:
汇编语言,乐曲点播,频率,时间
Abstract
Thispapermainlydescribesthedesignprocessofamusicdemandingprogram,themainpurposeofthisdesignistoanalysisofspecificissues,throughthedesign,debugging,operationprocedure,inpracticetrainingtoimprovemyself,toincreasetheassemblylanguagecoursecontentunderstanding,exerciseabilityofdiy.Theprogramspecifically:
haveknowntherelationshipbetweenpitchandfrequencyandtime,wecanbeinaccordancewiththemusicscorewilldefinethefrequencyanddurationofeachnoteintotwodatatables;
andthenwritetheprogramtoturnoutthefrequencyandtimevalueinthetable,calltheDo_Musicprogramtosendoutsound.Whenyouexecuteoftheprogram,choosethemusicwhichyouwantplay,theprogramwillthroughtheprogram’sinterfacesuggestsinformation,fastandeffectivelyselectthemusicyouwanttoenjoyandplay.
Keywords:
Assemblylanguage,Musicdemanding,Frequency,Time
目录
1.背景分析及意义1
2.总体设计思想1
3.完成的主要功能4
4.软硬件环境要求5
5.程序流程图6
6.使用说明7
设计总结7
参考文献8
程序清单8
1.背景分析及意义
随着计算机科学技术的不断更新发展,计算机在各个方面的应用已经变得十分广泛,虽然现在其他的编程语言比如C语言,JAVA语言已经部分替代了汇编语言的使用,但作为与计算机进行对话的一门基础语言,仍有相当一部分的软件开发人员与技术人员在程序设计的过程中使用汇编语言。
汇编语言作为计算机控制专业方向学习的必修之课,每个作为本专业的学生,对汇编语言的理解与掌握就显得尤为重要。
汇编语言虽然现在已经比不上C语言的广泛使用,但在实际应用中还是各有各的好处,同时汇编语言是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
因次,对程序的空间和时间有一定特殊要求的话,汇编语言的应用就显的必不可少了,一些直接控制硬件的应用场合,则更是非用汇编语言不可了。
本次课程设计是在学习汇编语言之后与实践相结合的一次综合应用。
通过具体的问题分析、设计、调试、运行程序。
在实际问题中锻炼提高自己,增加了对本门课程内容的理解,锻炼了动手能力。
就这个程序具体而言:
知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表,然后编写程序依次取出表中的频率值和时间值,调用Do_Music程序发出各种声音。
2.总体设计思想
通用发声程序
计算机有两种产生声音的方法,一种方法是通过I/O指令向设备寄存器(端口地址为61H)的第1位交替送1和0,使与第1位相连的扬声器脉冲门产生连续的脉冲电流,驱动扬声器发出声音。
另一种方法是利用8254(系统定时器)中的2号定时器向扬声器发送不同频率的脉冲,使之产生音调高低不同的声音,这种产生声音的方法可使计算机演奏出各种乐曲。
本次课程设计所采用的便是第二种方法。
ROMBIOS中有个BEEP子程序,它能根据BL中给出的时间计数值控制8254定时器使之产生持续时间为1个或几个0.5秒、频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。
为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我们的通用发声程序应能产生任一频率的声音。
其次,BEEP产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。
我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为:
533H×
896÷
给定频率=123280H÷
给定频率
发声程序包括3个步骤:
(1)在8253中的42端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。
(2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H×
896/频率),以建立将要产生的声音频率。
(3)把输出端口61H的PB0、PB1两位置1,发出声音。
对于发音部分。
PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。
PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能。
输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。
由PPI输出寄存器中的0、1两位来选择扬声器的驱动方式。
连接到扬声器上的是定时器2,通过查阅相关资料可以知道,GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作。
定时器2的OUT2与端口61H的PB1通过一个与门与扬声器的驱动电路相连。
当PB1=1时,允许OUT2的输出信号到达扬声器电路。
因此,只有PB0和PB1同时为“1”时,才能驱动扬声器地声。
通过以下指令实现:
INAL,61H
ORAL,3
OUT61H,AL
上面的指令用以打开扬声器,如要关闭扬声器时则为:
ANDAL,0FCH
当从8255中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表:
TABLEDW493,440,392,349,329,293,261
把相应的频率送到一个寄存器上,通过公式:
计数值=533H×
f=12348CH÷
f
算出计数值,再把算得的计数值送给8253,就可产生所要频率的方波。
在把计数值送8253前,必须先把8253进行初始化:
MOVAL,0B6H
OUT43H,AL
使其选用通道2,工作在方式3下。
就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的A口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。
这个方波经驱动放大就可以使扬声器发出相应的声音。
所以8255在这里完成两个任务,它不仅从A口中采集到数据,而且B口的PB1和PB0两个位要控制发声。
8253的主要任务就是产生所要求发声的不同频率的方波。
乐曲的频率与节拍
乐曲是按照一定的高低、长短、强弱组成的音调。
在一首乐曲中,每个音符的音高和音长与频率和节拍有关。
每个音符的频率值和持续时间是乐曲程序发声需要的两个必要数据。
高音阶从中C(263)到高C(523),各个音阶对应的频率如下所示:
DW262---------MC
DW294---------MD
DW330---------ME
DW349---------MF
DW392---------MG
DW440---------HA
DW494---------HB
DW523---------HC
如果知道了乐曲的曲谱,就可以将每个音符的频率和持续时间定义为两个数据表,然后通过调用子程序将表中数据取出,通过扬声器发声。
例如Littlebee频率表和节拍表如下所示:
bee_freqdwmg,me,me,mf,md,md,mc,md,me,mf
dw4dup(mg),me,me,mf,md,md
dwmc,me,mg,mg,3dup(me),5dup(md),me,mf
dw5dup(me),mf,mg
dwmg,me,me,mf,md,md,mc,me,mg,mg,mc
dw0
bee_timedw2dup(25*400,25*400,50*400),4dup(25*400)
dw3dup(25*400,25*400,50*400)
dw3dup(6dup(25*400),50*400)
dw2dup(25*400,25*400,50*400),4dup(25*400),100*400
其中,bee_freq为频率表,bee_time为节拍表,两个表中的数据一一对应,每一组代表着乐曲中的一个音符。
3.完成的主要功能
此程序能实现特定乐曲的选择与播放。
程序运行时按下数字键“1”-“4”分别演奏乐曲1、Littlebee;
4、Maryhadalittlelamb。
当按下数字键“0”时则退出程序。
图1乐曲点播程序运行图
4.软硬件环境要求
软件环境:
汇编软件Masm615,要求包括4个基本程序:
EDIT.COM、MASM.EXE、LINK.EXE、DEBUG.EXE.
硬件环境:
装有DOS系统或32位windowsXP、windows7、windows8操作系统的计算机
5.程序流程图
乐曲点播程序流程图如图2所示:
Y
N
图2乐曲点播程序流程图
6.使用说明
此程序是一个关于乐曲点播的程序。
本程序由显示程序,歌曲选择,歌曲播放,返回等几部分组成。
编写asm文件时在文中定义了所要演奏的4首歌曲的频率表与时间节拍表,这是能够正确播放一首完整乐曲的必要数据。
接下来向计数器写入控制字并且接通扬声器,设置次数循环将节拍转入程序,调用发声程序发声。
此程序通过按键1,2,3,4即可实现1:
Littlebee;
2:
LittleStarlet;
3:
Christmasring;
4:
Maryhadalittlelamb的播放,选择曲目后开始播放。
需要注意的是在乐曲播放的过程中其他按键暂时无效,需等当前曲目播放完毕之后才能进行下一次操作;
按键0选择退出选项退出程序。
设计总结
在为期两周的汇编语言课程设计中,我从许多题目当中选择了乐曲发声程序,在选题到程序实现所期望的功能的过程中,我对汇编语言这门课程有了进一步的认识与了解。
编写程序的时候并不是一帆风顺的,我也遇到了一定的困难,程序出现了一定量的错误难以汇编及连接,后来经过自己查阅了汇编错误说明资料与老师的指导,最终完成了一个小型的乐曲点播程序。
通过本次课程设计,我深深的感受到了因自己专业知识的不足给自己带来的困难,从而进一步的熟悉了汇编语言的结构和使用方法,现在已经基本能独立阅读、编制和调试规模较小的汇编语言程序。
这是一次理论与实践相结合的学习,通过这次学习,使我对汇编语言及其编写工作有了更深一步的认识,加强了我的上机操作能力,增强了我的学习积极性。
汇编语言和C语言同样是关于计算机编程的基础语言,它们各有各自的优点与不足。
汇编语言是一种面向机器的程序设计语言,是和计算机硬件结合最密切的语言,虽然现在程序设计语言的发展速度很快,但汇编语言是用户能够使用的最快和最能发挥硬件功能的唯一的一种计算机语言。
在日后的学习中我要加强汇编语言综合应用程序设计方法的学习,提高汇编语言实际应用能力、增加计算机各方面的知识和运用能力。
学好其他专业课知识,争取能够熟悉并掌握应用计算机的更多功能。
总之,本次课程设计作为自我学习的一个良好开端,指导了我以后整个的学习方向与态度。
我会把这次课程设计作为一个新的起点,再接再厉学习更多的专业知识,为以后的工作作好扎实的基础。
参考文献
[1]沈美明,温冬婵.《IBM—PC汇编语言程序设计(第2版)》.北京:
清华大学出版社,2001年.
[2]李珍香,刘红梅,赵润林.《汇编语言课程设计案例精编》.北京:
中国水利水电出版社,2004年4月.
程序清单
CRequ000DH
LFequ000AH
mcequ262
mdequ294
meequ330
mfequ349
mgequ392
haequ440
hbequ494
hcequ523
;
-----------------------------------------
功能:
显示指定地址(Str_Addr)的字符串
入口:
Str_Addr=字符串地址(要求在数据段)
用法:
OutputStr_Addr
CodeSegment
AssumeCS:
Code,DS:
Code
OutputMACROStr_Addr
pushax
leadx,Str_Addr
movah,9
int21h
popax
EndM
入口参数
SI=声音频率地址
bx=时间节拍地址
Do_MusicProcNear
pushdx
pushcx
pushax
@@Sound:
testwordptr[si],0ffffh
jz@@Return
moval,0b6h;
8253初始化
out43h,al
movdx,12h
movax,533h*896
divwordptr[si]
out42h,al
moval,ah
inal,61h;
驱动扬声器发声
movah,al
oral,3
out61h,al
movcx,[bx]
@@Waitf1:
movcx,28010
@@delay1:
loop@@delay1
popcx
loop@@Waitf1
incsi
incsi
incbx
incbx
moval,ah
jmp@@Sound
@@Return:
popax
popcx
popdx
ret
Do_MusicEndP
音乐菜单
Music_Strdb10dup('
'
),LF,CR
db5dup('
),'
THISAPROGRAMTHATYOUCANCHOOSEASONGONTHELIST:
'
LF,CR
db10dup('
db10dup('
1.Littlebee'
LF,CR;
小蜜蜂
2.LittleStarlet'
小星星
3.Christmasring'
圣诞铃声
4.Maryhadalittlelamb'
玛丽有只小羊羔
0.Exit'
退出程序
db10dup('
),LF,CR
db30dup('
Designer:
ZengYifan'
Class:
Computercontrol11-2'
No:
20'
Pleasechoosethenumberofmusicwhichyouwanttoplay:
$'
提示选择乐曲
Prompt_StrdbLF,CR;
音乐播放前的提示信息
dbLF,CR,'
Nowthemachineisplayingthemusicwhichyouchose,Pleaseenjoy~'
dbLF,CR,0eh,'
...$'
以下为对应各乐曲的频率表和节拍时间表
merry_freqdwme,md,mc,md,3dup(me),3dup(md),me,mg,mg
dwme,md,mc,md,4dup(me),md,md,me,md,mc
dw0
merry_timedw6dup(25*400),50*400
dw2dup(25*400,25*400,50*400),12dup(25*400),100*400
christ_freqdw7dup(me),mg,mc,md,me,4dup(mf)
dw2dup(me),me,md,md,mc,md,mg
dw7dup(me),mg,mc,md,me,4dup(mf)
dw2dup(me),mg,mg,mf,md,mc
dw0
christ_timedw2dup(25*400,25*400,50*400)
dw4dup(25*400),100*400,2dup(25*400,25*400,50*400)
dw4dup(25*400),2dup(50*400)
dw2dup(25*400,25*400,50*400)
dw4dup(25*400),100*400,
dw2dup(25*400,25*400,50*400),4dup(25*400),100*400
star_freqdwmc,mc,mg,mg,ha,ha,mg,mf,mf,me,me,md,md,mc
dw2dup(mg,mg,mf,mf,me,me,md)
dwmc,mc,mg,mg,ha,ha,mg,mf,mf,me,me,md,md,mc
dw0
star_timedw3dup(6dup(25*400),50*400,6dup(25*400),50*400)
乐曲频率和节拍时间地址表
Music_Tabledwbee_freq,bee_time,star_freq,star_time,christ_freq,christ_time,merry_freq,merry_time
Cursor_Tmpdw?
;
音乐菜单光标位置
Start:
pushcs
popds
pushcs
popes
OutputMusic_Str;
显示音乐菜单
xorbx,bx
movah,3;
取光标位置
int10h
movCursor_Tmp,dx;
保存音乐菜单光标位置
Choise_Item:
movdx,Cursor_Tmp;
取音乐菜单光标位置
movah,2;
设置光标位置
@@Read_Chr:
movah,1
cmpal,'
0'
jb@@Read_Chr
4'
ja@@Read_Chr
andal,0fh
testal,0ffh
jzExit_Proc
decal
cbw
shlax,1
movdi,ax
OutputPrompt_Str;
显示音乐播放前的提示信息
movsi,Music_Table[di];
对应的频率值地址
movbx,Mus