《键盘钢琴汇编语言课程设计.doc》由会员分享,可在线阅读,更多相关《键盘钢琴汇编语言课程设计.doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date键盘钢琴汇编语言课程设计学 号:前 言汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有
2、很大一部分是面向汇编器的伪指令,已经类同于高级语言。而此次的微机原理与接口技术(基于16位机)的课程设计正是利用这个学期所学的汇编语言来设计一个键盘钢琴的应用程序,要求该汇编语言程序能实现键盘钢琴的功能,就是在键盘上按下自定义的按键之后,可以从主板的蜂鸣器上发出一定频率的音调,而这些音调的频率都是相应音阶的特征频率,故发出的声正好就是音乐的各个音阶声调。通过这个应用程序,按照音乐的谱子连续地按下相应按键,就可以像钢琴那样发出音乐来,但是局限于扬声器的原因,所发出的音乐没有真正的钢琴那样美妙。但是现在的一些键盘钢琴的软件已经能驱动声卡,来获得更好更逼真的钢琴音乐效果了。中文摘要采用16 位微处理
3、器 8086 CPU 以及86 系列微型计算机的指令系统; 软件设计平台为多功能微型计算机实验软件MFS 中的微机原理实验集成环境MF2KP,仿真设计平台为Proteus 软件。 设计汇编语言程序,实现键盘钢琴功能,具体功能要求如下: (1)在键盘上自定义若干键对应钢琴键; (2)单击钢琴键,计算机发出相应音阶,发声时间自定义;(3)单击”ESC”键退出程序。 关键字: 16位微处理器 集成环境 汇编语言 键盘钢琴 目 录1 设计意义及要求11.1 设计意义11.2 设计要求12 总体方案论证22.1按键与音调频率值的对应22.2 扬声器的驱动分析42.3 发声时间53 程序设计63.1 主程
4、序设计及其流程图63.2 子程序设计及其流程图73.2.1 计算频率值的子程序FIFRE73.2.2 发声子程序SOUND83.2.3延时子程序DELAY94 结果分析104.1 程序调试与改进104.2 结果记录及分析11心得与体会12参考文献13致 谢14附录 程序代码15-1 设计意义及要求1.1 设计意义键盘钢琴,电脑键盘代替钢琴键演奏钢琴乐曲。最原始、也是最流行的版本,音符以ABCDEGF为编排。让不懂音乐的网友可以快速上手,其体积小,简单方便、易传播,因此在网上普及率最高。键盘钢琴让人可以在闲暇时刻,可以小小地娱乐一下,增加生活的乐趣。由于一架钢琴过于昂贵,对于一般的普通工薪阶层的
5、人来说,还是很难接触到钢琴的,而键盘钢琴的出现正好让那些业余爱好者,既满足的对钢琴音乐艺术的追求,也更廉价和便捷。对于初学音乐的人来说,这样的键盘钢琴软件更是训练的好助手,可以帮助你迅速熟悉各音阶音调和旋律节奏。因此,这样的软件也很多版本,有专业版,也有简单的Flash版,当然也有此次课设要求设计的简陋版。专业版能提供多种乐器音色、录放功能、音符显示。不太好的地方是键盘要按下去才发音,没有延时,弹起来不太就手。Flash版音色也比较好,提供了多键位,也可以自定义键位。1.2 设计要求设计汇编语言程序,实现键盘钢琴功能,具体要完成的设计任务如下:(1) 在键盘上自定义若干键对应着钢琴键;(2)
6、单击钢琴键,计算机发出相应的音阶,发声时间自定义;(3) 单击“ESC”键退出程序音阶与频率的对应关系如下所示:音符45671234567频率/Hz1751962202472622943303493924404945235876592 总体方案论证2.1按键与音调频率值的对应设计此汇编语言程序,要实现键盘钢琴,首先是按键的自定义设计,因为题中要求设计的按键音调音阶有十四个,但是从网上查资料得知,各音阶与其相应频率有如表1-1所示的关系。表1-1 音阶与频率的对应关系 单位:HzA11022044088017603520B12324749498819753950C1312625231046209
7、34186D147294587117523494698E165330659131826375277F175349698139727945587G196392784156831366271从表中可知:高低音之间有着大约两倍的关系,这样就很方便数据的储存了,只需要将其中一个音度的频率值存储下了,再进行二倍关系的换算即可得到倍低音、低音、中音、高音、倍高音五种音度的音调频率值。因为题目中主要是对低、中、高音的要求,在这里就以低音为基准存储数据值和换算其他音调频率值,由表1-1中得知低音音符1 2 3 4 5 6 7的音调频率分别为131、147、165、175、196、220、247。其中,中音各音
8、调的频率是相应低音音调频率的两倍, 高音各音调频率是低音的四倍的。又因为低音的频率值最大为247,正好小于一个无符字节数值的最大值255,因此,只需要在程序的数据区内安排七个字节来存放频率数据,即:FREQ DB 131,147,165,175,196,220,247这样,不仅节省了存储空间,而且降低了存储数据的复杂程度。考虑到字母键盘一共也只用26个,就不对所有音调都进行字母键盘的按键定义了,只补齐题目中所缺的高音和低音,共21个音阶。则可以按如下表1-2中的对应关系,设置21个按键分别对应着低、中、高三种音度的各音调的频率值。由于字母所对应的ASCII码并不是连续的,因此在这里就将其的AS
9、CII码存储到数据区,然后根据变址寻址的方式音度音名1234567低音频率/Hz自定义按键131147165175196220247QWERTYU中音频率/Hz自定义按键131*2147*2165*2175*2196*2220*2247*2ASDFGHJ高音频率/Hz自定义按键131*4147*4165*4175*4196*4220*4247*4ZXCVBNM表1-2 音阶频率与自定义按键的对应表对字母按键的ASCII码进行地址编码,可以将字母的ASCII码的按表1-2的顺序存放,即:KEYS DB QWERTYU , ASDFGHJ , ZXCVBNM这样看来,就是将这些ASCII码值分出三
10、类,分别为低音类、中音类、高音类。根据输入KEY的ASCII码值利用一个21次的LOOP循环就可以找到对应的偏移地址,再将所得的偏移地址减去首地址的偏移地址得到该KEY的地址相对值,再把该相对值与6和13大小判断偏移地址的所属类别(小于等于6为低音类,大于6小于等于13为中音类,大于13为高音类)。知道KEY的所属类别,就知道基准频率值应该乘以多大的倍数才是该KEY的真正的频率值,低音类倍数为1,中音类倍数为2,高音类倍数为4。接下来还要确定是哪个基准频率值,由于已经知道所属类别,如果是低音类则就是地址相对值,如果是中音类,则地址相对值要减去7,显然高音类则减去14,就得到了一个0至6的编码,
11、再由换码指令XLAT对频率数据FREQ进行换码,可以很快得到该KEY的对应的基准频率值。最后是将得到的基准频率值乘以得到的类别倍数,就得到最后想要的输入KEY的音调频率值。举例如下:输入按键KEY的ASCII码值为“D”,其ASCII码是44H,在一个21次的LOOP循环下,可以得到数据位44H的偏移地址DI,在将该偏移地址DI-首地址的偏移地址KEYS=偏移地址的相对值9。因为6913属于中音类,基准频率值的倍数为2。因为属于中音类KEY“D”编码为9-7=2,在换码可以知道,“D”对应的基准频率值为165,故最后得到“D”的频率值为165*2=330Hz。因此,用此算法得到各个按键的频率值
12、是可行的。不仅节省了存储空间,而且降低了存储数据的复杂程度,在程序编写上可以将这一段写成子程序,更加使得程序简洁明了。2.2 扬声器的驱动分析该程序主要是驱动电脑主板上的扬声器,根据音阶音调不同的频率值,来是扬声器发出不同的声音,从而产生想弹钢琴一样的感觉,当然音质是不能相提并论的。(在这里需要说明的是,现在大多数笔记本主板上已没有这个扬声器,但是台式机大多还是有的,在台式机上的效果更好点。)在电路上如下图2-1所示:8255(PB1)图2-1 8253的电路连接图在PC/XT/AT家族中,计时器芯片的3个通道都用其专门的功能,通道2是用来控制计算机的扬声器的声音频率的。通道2用于产生频率信号
13、,故工作方式在方式3,计数值为6A4H=1190,方波输出频率为1.19MHz/1190=1KHz,此信号决定了扬声器的声调,而通道2的控制字则为0B6H,1.19M约等于十六进制12348CH。由图1-1可知8253的通道2计数由8255A的PB0控制,当PB0输出为高电平的时候,是门GATE2为高电平。此时,8253的通道2允许计数,故通道2的输出方波受PB0控制,从而控制扬声器的音调高低。通道2的输出能否对扬声器产生持续控制还取决于8255A的PB1。当PB1为“0”时,OUT2不能通过“与门”;反之则可通过“与门”控制扬声器。所以,扬声器发音时间的长短取决于8255A的PB1信号。另外
14、,CPU通过8255A的C口,得知5283通道2的状态和扬声器驱动器的状态。由上可知,需要扬声器正常发声,需要8253和8255A的协同工作,而8253的控制字在网上查的为43H,则同过下面的程序来初始化8253MOV AL,0B6HOUT 43H,AL 而通道2的端口地址为42H,由于N值一般计算得出都大于255,故需要一个字的写入,而又因为 8253只有八位数据线,故字的写入需要两次,一般将N值直接给AX然后通过下面的程序即可完成。OUT 42H,ALMOV AL,AH OUT 42H,AL而8255A能控制8253和扬声器,但是只要PB0和PB1同时为高调平,扬声器就为开,则对8255A
15、的控制就是在对扬声器的控制,在网上得知8255A的B口地址为61H,则可以通过下面的程序实现扬声器的开与关。IN AL,61HOR AL,3 ;可以保证PB0和PB1同时为高调平OUT 61H,AL ;打开扬声器 MOV AL,AHAND AL,0FCH ;可以保证PB0和PB1同时为低调平OUT 61H,AL ;关闭扬声器2.3 发声时间因为只要通过8255A将扬声器打开而不关闭,那么只要8253正常工作,扬声器就会一直发声,需要发声时间多长,只需要写一个延时子程序即可,利用LOOP和跳转指令就可以得到一个双循环程序,在根据指令时间依次乘以LOOP循环的次和跳转指令的跳转次数就可以得到想要的
16、延时时间。子程序循环完毕在将扬声器关闭即可。延时子程序时间的长短就是发声时间的长短。3 程序设计3.1 主程序设计及其流程图开始数据初始化(输入KEYS,音符频率FREQ等)显示提示信息输入按键KEY显示请输入正确key 发声子程序SOUND判断输入:KEY是否为ESC?否 结束提示语KEYS首地址给BX 返回DOS循环次数CX=21 结束 计算KEY所对应频率值的子程序FIFRE 判断KEY和BX 是否相等 ? 否 BX=BX+1 否 LOOP判断CX 是否为零 ? 是 图3-1 主程序的流程图如图3-1,主程序的主要任务:1) 如果输入的KEY为“ESC”时,直接跳转至退出EXIT处;2)
17、 找出输入按键KEY的偏移地址,若不是正确按键,则显示提醒语句并重新输入KEY;3) 将得到的KEY偏移地址送入子程序FIFRE计算得出频率值,接着再将频率值给子程序SOUND并发出音调,完成之后,跳转至输入口INPUT。3.2 子程序设计及其流程图3.2.1 计算频率值的子程序FIFRE 开始 设置倍数标志DL=1 计算DI相对于KEYS的值并给DI小于等于 将DI与6 相比 大于 DI=DI-7且DL=DL+1 将DI与6 小于等于 相比DI=DI-7且DL=DL+2 将DI给AX后进行换码,相乘DL得到AX值给BX 图3-2 子程序FIFER流程图 结束计算输入值所对应频率值的子程序FI
18、FRE的主要任务:将偏移地址DI减去首地址的偏移地址KEYS得到该KEY的地址相对值,再把该相对值与6和13大小判断偏移地址的所属类别,小于等于6为低音类,基准值倍数DL=1,大于6小于等于13为中音类,基准值倍数DL=2,大于13为高音类,基准值倍数DL为4。最后的DL为基准频率值赋给AL,与基准值倍数DL相乘,得到频率值AX,再将AX最后赋给BX。最后子程序FIFER结束时,BX即为输入KEY的音调频率值。3.2.2 发声子程序SOUND 开始向8253的43H写入控制字0B6H给DX、AX分别赋值12H、348CHDIV BX得到计数初值AX=N分两次向通道2端口42H写入计数初值N 打
19、开扬声器延时子程序DELAY关闭扬声器结束图3-3 子程序SOUND流程图子程序FIFER流程图如图3-3所示,其主要任务是完成发声,在该子程序中,分两次向通道2端口42H写入计数初值N的程序语句为:OUT 42H,ALMOV AL,AH OUT 42H,AL打开和关闭扬声器的程序为:IN AL,61HOR AL,3 ;可以保证PB0和PB1同时为高调平OUT 61H,AL ;打开扬声器 MOV AL,AHAND AL,0FCH ;可以保证PB0和PB1同时为低调平OUT 61H,AL ;关闭扬声器 开始入栈保护BX和CX3.2.3延时子程序DELAY BX=4000 CX=0FFFH 否 C
20、X=0? 是 BX=BX-1 BX=0? 恢复BX和CX图3-4 延时子程序DELAY 结束4 结果分析4.1 程序调试与改进按上面的思路和流程图写好程序后,对程序进行调试:1) 一开始在输入显示这里,使用的是DOS的1号单字符输入,会产生“回显”,但对于键盘钢琴来说,这一点没有必要,于是改进后使用7号无“回显”的单字符输入。之前,一直想把音符也显示出来,按的什么显示相应的音符,成功实现之后,在进行第一次答辩时,研究生学长认为此举没有很大的必要性,可以不显示相应的音符,经过思考之后也表示赞同,如图4-1和4-2是不同程序的界面显示,调试后看起来更简洁明了; 图4-1 改进之前的程序界面 图4-
21、2 改进之后的程序界面 2)在第一次答辩时,由于对题目认识得不够深入,只对任务书中要求的音符进行了,编写,在答辩时,在学长的指导下,回来查资料后知道了音符与频率的一般规律,于是改进方案,将高、低音补齐,得到更多的音调选择;3)在算法上的改进,之前是算法是只根据数据区地址的关系进行推算所有频率值的地址,这样既浪费存储空间,又不能很好实现算法,没有可变性,在得知音符的2倍关系之后,再次思考得出上面的新算法,新算法较之前的,不但减少了存储空间,算法也变得简单易懂。4.2 结果记录及分析调试之后,运行结果和课题的设计要求完全相符合。1) 开始运行程序,能看到如下图4-3所示的“Welcome to P
22、iano of Keyboard”程序运行开始提示语,紧接着出现的是如图4-4所示的操作提示语,图4-3 程序运行开始提示语图4-4 程序操作提示语2)分别按键盘上的按键Q、W、E、R、T、Y、U 得到低音声的各音调, 分别按键盘上的按键A 、S、D、F、G、H、J 得到中音声的各音调;分别按键盘上的按键Z、X、C、V、B、N、M 得到高音声的各音调。 3)单击“ESC”可以退出程序,并显示退出提示语,如图4-5所示;图4-5 程序退出时显示提示语心得与体会经过一周的汇编课程设计,我在其中经历了很大的困难,可是也感受到了巨大的幸福。当我面对一个难题,从一筹莫展到逐渐清晰明朗,到最后成功的完成任
23、务。只要亲身经历过,才能感受其中的泪水和快乐。更重要的是我们对汇编有了进一步的理解。有了实际运用的体会,只是更加的融会贯通了,不管是从知识上还是从思维逻辑方式上,我们都有了很大的进步。还有就是深切感受到了课本以外的世界独立接受新知识,独立面对新问题的能力,面对挑战不气馁,积极的去面对,战胜它。让自己变得充实起来。以及感谢老师给我们这次课程设计的机会,知识来源于实践,应用于实践。总之这次的课程设计使我受益匪浅。在以后的日子里我们要本着一切从应用出发的度去学习。同样要珍惜以后的实践学习。参考文献1周佩玲,彭虎,傅忠谦.微机原理与接口技术(基于16位机).电子工业出版社,2005.2周佩玲,吴耿峰,
24、万炳奎编.十六位微型计算机原理接口及其应用.中国科学技术大 学出版社,1995.3周明德.微型计算机系统原理及应用(第四版)习题集与实验指导书.清华大学出版社,2002.4戴梅萼.微型计算机技术及应用(第三版).清华大学出版社,2003.5孙德文.微型计算机技术.高等教育出版社,2001. 6 王爽.汇编语言.清华大学出版社(第二版),2008致 谢一周的汇编语言课程设计结束了,我的收获很大。通过课程设计的编程和对编程过程中遇到的问题的思考,有效的提高了我对汇编的认识和理解,切实的提高了我的编程能力,补全了我的不足。通过这次课程设计,我巩固所了学过的知识,能用汇编语言熟练地运用顺序、选择、循环
25、三大结构,进一步掌握了各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及正确地运用DEBUG指令。在整个程序的编写中,调试占了很大部分的时间。要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟练的掌握debug命令,这对程序的调试是非常重要的。通过这次实际动手能力的培养,我进一步熟悉了汇编语言的结构和使用方法,基本达到了能独立阅读、编制和调试 另外,就是我对这门课内容的学习感受。要学好这门课,我认为应该做到以下三点:1) 课本上应该记住的东西一定要记住,记不住就没法做题,(例如指令,寻址方式等等)若记住你做题就会做,看程序也就能看懂,记不住见了它就会对它不知所措,一脸茫
26、然。2)预习很重要,这一点不仅适用于这一科的学习,确切的说它适用于任何一科,有的同学这一点作的不好,上课只知道竖着两个耳朵傻傻的听老师讲课,也不注意动动脑子随时思考,延续以前填鸭式的学习方式,想让老师讲给所有的东西,殊不知很多东西还要自己从书本获得。这就难免出现听不懂的情况,这好比让一个不懂外语的人听外语录音,在他的心里,听外语就像听天书一般,所以说你要学一点新东西,前提是你对它要有一点了解,不然的话你所作的一切只不过是在浪费时间,浪费金钱,浪费生命。3)理论与实践相结合,不懂的地方应勤问老师勤问同学,直到把它搞懂为止。附录 程序代码DATA SEGMENT KEYS DB QWERTYU,A
27、SDFGHJ,ZXCVBNM FREQ DB 131,147,165,175,196,220,247 WELC DB Welcome to Piano of Keyboard,0DH,0AH,0DH,0AH, EXPL DB Explanation:, 0DH,0AH,Key:QWERTYU-Low Notes 1 2 3 4 5 6 7,0DH,0AH,Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7,0DH,0AH,Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7,0DH,0AH, Please Note Your Caps Lock T
28、runed On, 0DH,0AH ESCQ DB 0DH,0AH,Please play:,0DH,0AH,(You can Type ESC to exit),0DH,0AH,0DH,0AH,$ LAST DB 0DH,0AH,Welcome again!,$ REMI DB Reminder:Please play the Key:QWERTYU-ASDFGHJ-ZXCVBNM,0DH,0AH,$DATA ENDSCODE SEGMENTASSUME CS:CODE DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化数据区 LEA DX,WELC MOV
29、AH,9 INT 21H ;显示提示语句 INPUT: MOV AH,7 INT 21H ;不回显输入键盘的KEY CMP AL,1BH ;判断输入KEY是否为“ESC” JZ EXIT ;若输入KEY为“ESC”则跳转到退出EXIT LEA DI,KEYS MOV CX,21 FIND: CMP AL,DI JZ SING ;找到KEY相对应的偏移地址DI则跳转至SING INC DI LOOP FIND ;根据输入KEY的ASCII码找到相对应的偏移地址 LEA DX,REMI MOV AH,9 INT 21H ;输入的KEY不正确,显示提醒请输入正确的KEY JMP INPUT ;不是正
30、确的输入KEY,则跳转至INPUT SING: CALL FIFRE ;进入计算KEY所对应频率值的子程序 CALL SOUND ;进入根据频率值发出音调的子程序 JMP I NPUT ;发声完毕后跳转至INPUT EXIT: LEA DX,LAST MOV AH,9 INT 21H ;显示退出时的字幕 MOV AX,4C00H INT 21H ;返回DOS FIFRE PROC ;计算KEY所对应频率值的子程序 MOV DL,1 ;标记频率基准值的倍数值 LEA BX,KEYS SUB DI,BX ;计算偏移地址相对与首地址的值 CMP DI,6 JNA SOU ;属于低音直接跳转至SOU
31、SUB DI,7 ;属于中音,将偏移地址减7 ADD DL,1 ;标记倍数值加倍为2 CMP DI,6 JNA SOU ;属于中音,跳转至SOU SUB DI,7 ;属于高音,将偏移地址再减7 ADD DL,2 ;标记倍数值再加倍为4 SOU: MOV AX,DI ;将被换码给AL LEA BX,FREQ XLAT MUL DL ;频率基准值乘以倍数得到KEY所对应的频率值 MOV BX,AX RETFIFRE ENDP SOUND PROC ;根据频率值发出音调的子程序 MOV AL,0B6H OUT 43H,AL ;向8253的43H写入控制字 MOV DX,12H MOV AX,348C
32、H DIV BX ;计算计数初值N OUT 42H,AL MOV AL,AH OUT 42H,AL ;向通道2端口42H写入计数初值N IN AL,61H OR AL,3 OUT 61H,AL ;打开扬声器 CALL DELAY ;进入延时子程序 IN AL,61H AND AL,0FCH OUT 61H,AL ;关闭扬声器 RETSOUND ENDP DELAY PROC ;延时时间子程序 PUSH BX PUSH CX MOV BX,4000 DY1: MOV CX,0FFFH DY0: LOOP DY0 DEC BX JNZ DY1 ;利用LOOP循环和跳转指令进行双循环 POP CX
33、POP BX RET DELAY ENDP CODE ENDS END START DATA SEGMENT KEYS DB QWERTYU,ASDFGHJ,ZXCVBNM FREQ DB 131,147,165,175,196,220,247 WELC DB Welcome to Piano of Keyboard,0DH,0AH,0DH,0AH, EXPL DB Explanation:, 0DH,0AH,Key:QWERTYU-Low Notes 1 2 3 4 5 6 7,0DH,0AH,Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7,0DH,0AH,Ke
34、y:ZXCVBNM-High Notes 1 2 3 4 5 6 7,0DH,0AH, Please Note Your Caps Lock Truned On, 0DH,0AH ESCQ DB 0DH,0AH,Please play:,0DH,0AH,(You can Type ESC to exit),0DH,0AH,0DH,0AH,$ LAST DB 0DH,0AH,Welcome again!,$ REMI DB Reminder:Please play the Key:QWERTYU-ASDFGHJ-ZXCVBNM,0DH,0AH,$DATA ENDSCODE SEGMENTASSUME CS:CODE DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化数据区 LEA DX,WELC MOV AH,9 INT 21H ;显示提示语句 INPUT: MOV AH,7 INT 21H ;不回显输入键盘的KEY CMP AL,1BH ;判断输入KEY是否为“ESC” JZ EXIT ;若输入KEY为“ESC”则跳转到退出EXIT LEA DI,KEYS MOV CX,21 FIND: CMP AL,DI JZ SING