最新音乐演奏汇编语言程序设计.docx
- 文档编号:11319018
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:23
- 大小:129.50KB
最新音乐演奏汇编语言程序设计.docx
《最新音乐演奏汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《最新音乐演奏汇编语言程序设计.docx(23页珍藏版)》请在冰豆网上搜索。
最新音乐演奏汇编语言程序设计
音乐演奏汇编语言程序设计1
前言1
1总体方案论证1
1.1功能分析1
1.2方案设计说明2
1.2.1音乐的代码化2
1.2.2音乐演奏的硬件配合2
1.2.3音乐演奏的软件设计2
2.程序流程图设计及其说明3
2.1主流程图说明3
2.2音乐播放流程图说明3
2.3字符输入及执行操作流程图说明3
3.软件设计关键问题或程序段落的说明6
3.1字符串显示程序6
3.2数据段与外观设计程序6
3.3音乐演奏8
4.程序调试说明、结果记录及分析8
5.课程设计收获及心得体会10
参考文献11
附录12
源程序代码12
音乐演奏汇编语言程序设计
前言
随着科技的高速发展,计算机已经经过了好几代的更新,然而计算机的运行的基本原理依然没有改变的。
而今,我们通过一个学期的学习,已经初步了解了计算机的基本结构和原理,并且已经学会了用汇编语言进行基本的程序编写。
而本次课程设计的主要目的就是巩固所学过的知识,用汇编语言熟练地运用三大结构,进一步掌握一些指令的功能、掌握子程序的定义及调用和INT21H、INT10H中断的使用,同时熟练运用通用寄存器和堆栈来进行编写一个完整的具有某种特定功能的程序。
在本次课程设计中,考察了我们编程的技巧、运用Debug动态调试工具进行程序的调试的能力。
同时,本道设计题目还检查了学生对汇编语言这门课程的基本知识的掌握程度。
只有掌握汇编语言基本编程方法,掌握程序各部分功能及其相互联系、相互作用,并要熟悉基本的音乐知识,才能独立的把程序写出来,才能把程序写好。
1总体方案论证
1.1功能分析
在此次设计中,第一个重点就是音乐播放的控制,要想能按照正常的频率和节拍播放出音乐,就需要合理的设计出给蜂鸣器的频率值和播放的时间。
这样就能比较准确的把音乐按一定的节奏播放出来。
如果我们要想加快播放速度,我们可以改变每一节拍的播放时间,如果我们改变了播放的频率值,那么歌曲也就相应的改变了。
第二个重点就是我们要能够根据键盘上输入的数据,合理的做出相应的应答操作,特别是在演奏过程中,我们还要求实时的检测键盘是否有输入,同时还要不能影响音乐播放的效果,并且由于我们对于键盘的输入并非是外部中断,因此实时的扫描键盘同时播放音乐的实现有一定的难度。
1.2方案设计说明
我们根据上面的功能分析,同时通过查阅相关资料,了解了计算机的内部结构的同时还清楚的理解了DOS中的21H和10H中断的调用,因此我们设计出如下方案:
1.2.1音乐的代码化
我们首先收集了2首简单的歌曲,同时还带有相应的音谱,通过查阅相关的音乐资料,了解了节拍的概念和各音符所对应的频率,而后我们把每一首歌曲都转化成两个数据段,一个是把各个音符翻译成相应的频率值,第二是把相应的节拍转化成对应的时间值,来控制播放每一个音符所对应的时间。
这样我们在播放歌曲时,同时调用频率值和时间值就可以把相应的歌曲播放出来了。
1.2.2音乐演奏的硬件配合
我们了解到在计算机的主板上有8253、8255和蜂鸣器,同时了解到蜂鸣器的驱动是通过8255和8253共同控制的,我们通过对8253的通道2进行写数据来控制蜂鸣器的声音频率,再通过8255来控制播放时间的长短,就通过这样的巧妙配合来达到播放完整音乐的效果。
1.2.3音乐演奏的软件设计
软件设计是本设计的重点,在软件设计中,我们要给8253和8255写数据,同时还要检测键盘输入的值,并根据输入的值,执行相应的代码来控制音乐的播放。
首先我们在一开始先显示音乐菜单,然后调用DOS中21H的07中断来接收键盘上的数据,在此过程中,程序在等待中,直到键盘上有键按下,程序才进行相应的操作。
当键盘输入一个值后,我们首先判断输入的值是否为“e”,如果是,那就退出程序,如果不是,我们再检测输入的数是否在1-2之间,如果是,那就调用相应的播放音乐的程序,否则无动作。
在音乐播放中,我们要实时地扫描键盘是否有值输入,如果用DOS中21H的01中断肯定是不行的,因为执行这个中断程序会等待,无法继续播放音乐。
因此我们采用中断21H中的0bH,这个中断不会等待,只会检查标准输入设备上是否有字符可读。
然后我们通过检测AL中的值是否为0FFH,来判断键盘是否有值输入。
如果键盘上有键输入,那么AL中会返回一个0FFH的值,否则就会返回00H。
如果有,我们再判断这个输入的值是否为“p”,如果是,我们就停止音乐的播放,否则继续播放音乐,由于程序运行非常快,这样我们就不会感觉到音乐有停顿现象。
实现和音乐演奏的同时实时扫描键盘的功能。
当音乐开始播放后,若不输入任何指令,则该歌曲一直循环下去。
在音乐暂停后,按“c”值继续音乐播放,按“e”值退出,按“1”或“2”切歌。
然后我们调用DOS中21H的07中断来接收键盘上的数据,在此过程中,程序在等待中,直到键盘上有键按下,然后我们按输入的数进行相应的操作。
2.程序流程图设计及其说明
在此次设计中,我们包括了三个流程图,一个主流程图和两个子流程图,具体如下所示:
2.1主流程图说明
在主流程图的设计中,我们首先显示输入提示,然后从键盘中输入一个字符,如果那个字符不是1、2或者e,那么就继续等待,否则就要做一些操作了。
如果这个是“e”,那么就结束程序,如果在1-2之间,那么就调用音乐播放程序。
2.2音乐播放流程图说明
在音乐播放流程图中,我们设计执行播放相应的歌曲的操作,同时实时的检测键盘的输入。
如果键盘有输入,就调用字符输入及执行操作程序。
否则就继续播放歌曲。
2.3字符输入及执行操作流程图说明
在这个流程图中,我们设计了它具有输入字符同时检测的功能。
如果我们检测到输入的字符不是“p”,那么就重新返回到音乐播放流程图中,继续播放音乐,否则就暂停播放音乐。
同时等待字符再输入。
如果输入的字符是“c”,那么就继续播放歌曲,如果输入的字符是“e”,那么就退出程序。
图2音乐播放流程图
图1主流程图
图3字符输入及执行操作流程图
是
否
否
是
是
否
3.软件设计关键问题或程序段落的说明
3.1字符串显示程序
dispmacromessage;用来调用显示字符串的宏
movdx,offsetmessage
movah,9
int21h
endm
在这个宏定义中我们调用了一个DOS中21H的09H中断,此中段的功能是在屏幕上显示一串字符。
3.2数据段与外观设计程序
stacksegmentparastack'stack'
db100dup(0)
stackends
datasegment
menu1db'**********songsmenu**********',0ah,0dh,'$'
menu2db'*1.merry*',0ah,0dh,'$'
menu3db'*2.star*',0ah,0dh,'$'
menu4db'******************************',0ah,0dh,'$'
menu5db'p:
pausec:
continuee:
exit',0ah,0dh,'$'
designersdb'designedbytanwenanrenzhipenglinjian',0ah,0dh,'$'
schooldb'WHUTElectricalengineeringandautomation1105',0ah,0dh,'$'
merry_frequencydw330,294,262,294,330,330,330,294,294,294,330,392,392
dw330,294,262,294,330,330,330,330,294,294,330,294,262,0
merry_time
dw10000,10000,10000,10000,10000,10000,50*400,10000,10000,20000,10000,10000,20000
dw10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,40000
star_frequencydw262,262,392,392,440,440,392,349,349,330,330,294,294,262
dw2dup(392,392,349,349,330,330,294)
dw262,262,392,392,440,440,392,349,349,330,330,294,294,262,0
star_timedw3dup(6dup(25*400),50*400,6dup(25*400),50*400)
dataends
codesegment
assumecs:
code,ds:
data,ss:
stack
startmain:
movax,data
movds,ax
movax,3;bios0号调用,设置为80*25彩色
int10h
moval,0;bios6号调用,清屏
movah,6
int10h
movdx,0819h;bios2号调用,设置光标位置
movah,2
int10h
dispmenu1;显示菜单
movdx,0919h
movah,2
int10h
dispmenu2
movdx,0a19h
movah,2
int10h
dispmenu3
movdx,0b19h
movah,2
int10h
dispmenu4
movdx,0c19h
movah,2
int10h
dispmenu5
movdx,0d15h
movah,2
int10h
movah,09;bios9号调用,设置颜色为红色
movbl,0ch
movcx,39
int10h
dispdesigners
movdx,0e11h
movah,2
int10h
movah,09
movbl,0ch
movcx,47
int10h
dispschool
3.3音乐演奏
Moval,0b6h;向计数器写控制字
Out43h,al;方式3、双字节写和二进制计数方式写到控制口
Movdx,12h;设置被除数
Movax,3280h
Divdi;其商ax为预置值
Out42h,al;先送LSB
Moval,ah
Out42h,al;后送MSB
Inal,61h;读端口原值
Movah,al
Oral,3
Out61h,al;接通扬声器
Waitf1:
movcx,100;扬声器开通时间,即为节拍
delay1:
Loopdelay1
在此程序段中,我们首先对8253进行设置,设置成方式3、双字节和二进制计数方式。
然后对8253写入定时数值,使得其输出一定的频率。
然后对8255写入数据,控制蜂鸣器的响时间的长短,来达到播放一首歌的目的。
4.程序调试说明、结果记录及分析
在调试的过程中,通过听取了老师的建议,我们小组在查找资料后,通过讨论在原有的程序上面增加了外观设计,最终显示结果如下图:
图4程序运行图
当输入“1”时,名为“merry”的音乐开始响起,当按下“p”时,音乐停止播放。
此时若键入“c”,继续播放暂停的音乐;若输入“e”则退出程序。
5.课程设计收获及心得体会
本次课程设计采用小组设计的方式,本小组三位同学的任务分工如下:
XXX——主要负责主要功能程序设计与调试以及PPT的制作。
XXX——主要负责外观程序设计和课程设计说明书的完成。
XXX——主要负责音乐代码搜集和课程设计说明书的完成。
通过此次课程设计的上机与理论学习,我们小组成员均感受颇深。
此次课程设计让我们了解到编写程序的复杂性,最起码了解到编写程序时必需要很细心。
为了编写程序方便,所以需要分块分功能实现,对于这一点,我们通过画流程图就能很好地解决问题。
同时也了解到上机操作实践的重要,这样有助于书本知识的系统化,现实化,更有利于自己的查漏补缺。
书本上的知识是死的,能够在现实中运用的知识才是活的。
再者,通过这次课程设计,也促进了我们的同学之间互相学习,通过编写程序,增加了学习的积极性和趣味性。
通过课程实践,巩固加深对课堂教学内容的理解,提高学生运用汇编语言进行程序设计和动态调试程序的能力,培养同学克服困难的毅力和精神,提高学生综合解决问题的能力。
参考文献
[1]温冬蝉,沈美明.IBMPC汇编程序设计.北京:
清华大学出版社,2002.3
[2]齐志儒,高福祥.汇编语言程序设计.北京:
清华大学出版社,2001.1
[3]龚尚福.微型计算机汇编语言程序设计.西安:
西安电子科技大学出版社,2003.7
[4]朱玉龙,任文岚.汇编语言程序设计.北京:
清华大学出版社,2003.8
[5]周佩玲.微机原理与接口技术.北京:
电子工业出版社,2007.6
附录
源程序代码
dispmacromessage;用来调用显示字符串的宏
movdx,offsetmessage
movah,9
int21h
endm
stacksegmentparastack'stack'
db100dup(0)
stackends
datasegment
menu1db'**********songsmenu**********',0ah,0dh,'$'
menu2db'*1.merry*',0ah,0dh,'$'
menu3db'*2.star*',0ah,0dh,'$'
menu4db'******************************',0ah,0dh,'$'
menu5db'p:
pausec:
continuee:
exit',0ah,0dh,'$'
designersdb'designedbyXXXXXXXXX',0ah,0dh,'$'
schooldb'WHUTElectricalengineeringandautomation1105',0ah,0dh,'$'
merry_frequencydw330,294,262,294,330,330,330,294,294,294,330,392,392
dw330,294,262,294,330,330,330,330,294,294,330,294,262,0
merry_time
dw10000,10000,10000,10000,10000,10000,50*400,10000,10000,20000,10000,10000,20000
dw10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,40000
star_frequencydw262,262,392,392,440,440,392,349,349,330,330,294,294,262
dw2dup(392,392,349,349,330,330,294)
dw262,262,392,392,440,440,392,349,349,330,330,294,294,262,0
star_timedw3dup(6dup(25*400),50*400,6dup(25*400),50*400)
dataends
codesegment
assumecs:
code,ds:
data,ss:
stack
startmain:
movax,data
movds,ax
movax,3;bios0号调用,设置为80*25彩色
int10h
moval,0;bios6号调用,清屏
movah,6
int10h
movdx,0819h;bios2号调用,设置光标位置
movah,2
int10h
dispmenu1;显示菜单
movdx,0919h
movah,2
int10h
dispmenu2
movdx,0a19h
movah,2
int10h
dispmenu3
movdx,0b19h
movah,2
int10h
dispmenu4
movdx,0c19h
movah,2
int10h
dispmenu5
movdx,0d15h
movah,2
int10h
movah,09;bios9号调用,设置颜色为红色
movbl,0ch
movcx,39
int10h
dispdesigners
movdx,0e11h
movah,2
int10h
movah,09
movbl,0ch
movcx,47
int10h
dispschool
return:
movah,07h;等待按键选择
int21h
cmpal,'1';选择歌曲1
jzmusic1
cmpal,'2';选择歌曲2
jzmusic2
cmpal,'e';退出
jzexit
jnzreturn
music1:
leasi,merry_frequency;取歌曲1音符
leabp,merry_time;取歌曲2节拍
again1:
movdi,[si]
cmpdi,0;0用于判断是否结束歌曲
jemusic1
movbx,[bp]
callspeaker;调用音乐发声子程序
addsi,2;取下一个音符
addbp,2;取下一个节拍
movah,0bh;扫描键盘,用0bh,不用停止歌曲播放的扫描
int21h
cmpal,0ffh;有按键,调到暂停处理程序
jzkey1
jmpagain1;没有按键,继续播放
exit:
jmpgame_over
music2:
leasi,star_frequency;歌曲2的处理与歌曲1的一样
leabp,star_time
again2:
movdi,[si]
cmpdi,0
jemusic2
movbx,[bp]
callspeaker
addsi,2
addbp,2
movah,0bh
int21h
cmpal,0ffh
jzkey2
jmpagain2
key1:
movah,07h
int21h
cmpal,'p';按键为p,暂停
jzpause1
jnzagain1
pause1:
movah,07h;利用dos的07h调用等待按键来暂停歌曲
int21h
cmpal,'e';按键为e,退出
jzgame_over
cmpal,'c';按键为c,继续
jzagain1
cmpal,'2';按键为2,切歌切到2
jzmusic2
jnzpause1
key2:
movah,07h
int21h
cmpal,'p'
jzpause2
jnzagain2
pause2:
movah,07h
int21h
cmpal,'e'
jzgame_over
cmpal,'1'
jzmusic1
cmpal,'c'
jzagain2
jnzpause2
game_over:
movah,4ch
int21h
;***********************音乐处理子程序*************************
speakerproc
pushax;保护现场
pushbx
pushcx
pushdx
pushdi
moval,0b6h;向计数器写控制字
out43h,al;方式3、双字节写和二进制计数方式写到控制口
movdx,12h;设置被除数
movax,3280h
divdi;其商ax为预置值
out42h,al;先送LSB
moval,ah
out42h,al;后送MSB
inal,61h;读端口原值
movah,al
oral,03h
out61h,al;接通扬声器
wait1:
movcx,100;扬声器开通时间,即为节拍
delay1:
loopdelay1
decbx
jnzwait1
moval,ah;写回61h端口值,关闭扬声器
out61h,al
popdi;恢复现场
popdx
popcx
popbx
popax
ret
speakerendp
codeends
endstartmain9、《老王》教案
杨绛
教学目标:
知识与技能:
整体感知课文内容,了解文章如何刻画人物的形象。
过程与方法:
1、学习自主、合作、探究的学习方式;
2、品读课文,把握课文内容,理解老王的“苦”与“善”。
情感态度与价值观:
从课文中的人物身上,学会善待他人,关注生活中的弱势群体。
教学重点:
1、把握老王的人物形象刻画;理解老王的“苦”与“善”;
2、领会作者思想感情及文章主旨,并让学生领悟到在与人交往中首先要付出爱。
教学难点:
1、体会老王与作者夫妇之间的相互关爱,体察作者的爱心,理解本文的主旨;
2、让学生领悟到在与人交往中首先要付出爱。
教学课时:
1课时
教学用具:
多媒体
教学过程
一、导入新课名言导入
二、知识积累(多媒体出示)
1、作者简介
2、背景介绍
3、检查预习情况
三、整体感知课文
1、老王是一个怎样的人?
(两个方面)
(1-4段)说明老王是一个的人;
(5-22段)说明老王是一个的人。
四、走近老王
速读1—4段,思考:
作者给我们介绍了什么情况?
从这些信息你读到了什么?
(从职业、家人、外貌、居住条件等方面来看)
职业:
蹬三轮车:
谋生手段艰苦
生活艰苦身体:
半瞎子:
生理缺陷
老王是一个苦人居所:
塌败小屋:
居住条件恶劣
姓名:
老王(没名):
地位低微
精神凄苦老光棍:
孤独终老单干户
受恶意攻击被人瞧不起
同学们是否注意到了,我对老王的眼睛是这样猜测的,还介绍了人们对老王的态度。
别人如何对待老王?
1、不愿坐他的车;
2、叫他“老光棍”;
3、恶意的揣测他眼睛瞎掉的原因。
五、品味老王
阅读5—22段,作者回忆了老王一生中的哪几个生活片段?
从这些片段中体现出了老王怎么样的性格特征?
带送冰快,车费减半忠厚老实,不贪钱
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 音乐 演奏 汇编语言 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)