键盘钢琴汇编语言程序设计—微机原理课程设计.docx
键盘钢琴汇编语言程序设计微机原理课程设计 学号:xxxxxxxxxxx 课程设计 题目键盘钢琴汇编语言程序设计 学院自动化学院 专业自动化专业 班级xxxxxxxx 姓名xxxxxx 指导教师xxxxxx 2022 年01 月12 日 ? 3 ? 2 ? 1课程设计任务书 学生姓名: xxxx 专业班级: xxxxxxx 指导教师: xxxx 工作单位: xxxxxx 题 目: 键 盘 钢 琴 汇 编 语 言 程 序 设 计 初始条件: 采用16 位微处理器 8086 CPU 以及86 系列微型计算机的指令系统; 软件设计平台为多功能微型计算机实验软件MFS 中的微机原理实验集成环境MF2KP ,仿 真设计平台为Proteus 软件。 要求完成的主要任务: 设计汇编语言程序,实现键盘钢琴功能,具体功能要求如下: (1)在键盘上自定义若干键对应钢琴键; (2)单击钢琴键,计算机发出相应音阶,发声时间自定义; (3)单击”ESC”键退出程序。 音阶与频率的对应关系如下表所示: 音符 4 5 6 7 1 2 3 4 5 6 7 频率/Hz 175 196 220 247 262 294 330 349 392 440 494 523 587 659 根据功能要求绘制程序流程图、编写完整的汇编语言程序并上机调试: 撰写课程设计说明书。课程设计说明书的撰写格式如下: (1)设计说明书包括封面、任务书(指导老师提供)、正文、参考文献(3 5 篇)、附录(程序清单,要求有注释)、成绩评定表(指导老师提供)。 (2)说明书正文包含总体方案论证(功能分析、系统连接图设计或算法说明);程序流程图设计及其说明、软件设计关键问题说明;程序调试说明、结果记录及分析;课程设计收获及心得体会。 (3)同一选题若为合作完成,设计说明书中需注明本人承担的设计部分。 时间安排: (本次课程设计时间:2022 年1 月4 日-13 日,历时一周半) 周次 具体时间 设计内容 第 一 周 1月4日 指导老师就课程设计内容、设计要求、设计进度安排、评分标准等作具体介绍。强调课程设计期间纪律要求。学生确定选题,明确设计内容及要求。 1月5日 根据选题查阅资料,完成方案的初步设计,包括系统原理及算法。 1月6日 绘制系统硬件接线图(接口应用设计题必须)以及程序流程图。 第 二 周 1月9日 学生根据程序流程图,编写程序代码。 1月10日 仿真调试、修改。 1月11日 学生结合程序流程图解释说明设计思路与算法;指导老师检查程序运行效果,并就结果进行评分。 1月12日 学生撰写课程设计说明书。 1月13日 上交课程设计说明书,以及答辩。 指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日 目录 引言 (1) 1 设计意义及要求 (2) 1.1设计意义 (2) 1.2设计要求 (2) 2 总体方案论证 (3) 2.1按键与音调频率值的对应 (3) 2.2扬声器的驱动分析 (5) 2.3发声时间 (6) 3 程序设计 (7) 3.1主程序设计及其流程图 (7) 3.2子程序设计及其流程图 (8) 3.2.1 计算频率值的子程序FIFRE (8) 3.2.2 发声子程序SOUND (9) 3.2.3 延时子程序DELAY (10) 4 结果分析 (11) 4.1程序调试与改进 (11) 4.2结果记录及分析 (12) 心得与体会 (13) 参考文献 (14) 附录程序代码 (15) 引言 汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。 高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。而此次的微机原理与接口技术(基于16位机)的课程设计正是利用这个学期所学的汇编语言来设计一个键盘钢琴的应用程序,要求该汇编语言程序能实现键盘钢琴的功能,就是在键盘上按下自定义的按键之后,可以从主板的蜂鸣器上发出一定频率的音调,而这些音调的频率都是相应音阶的特征频率,故发出的声正好就是音乐的各个音阶声调。 通过这个应用程序,按照音乐的谱子连续地按下相应按键,就可以像钢琴那样发出音乐来,但是局限于扬声器的原因,所发出的音乐没有真正的钢琴那样美妙。但是现在的一些键盘钢琴的软件已经能驱动声卡,来获得更好更逼真的钢琴音乐效果了。 ? 3 ? 2? 11 设计意义及要求 1.1 设计意义 键盘钢琴,电脑键盘代替钢琴键演奏钢琴乐曲。最原始、也是最流行的版本,音符以ABCDEGF 为编排。让不懂音乐的网友可以快速上手,其体积小,简单方便、易传播,因此在网上普及率最高。 键盘钢琴让人可以在闲暇时刻,可以小小地娱乐一下,增加生活的乐趣。由于一架钢琴过于昂贵,对于一般的普通工薪阶层的人来说,还是很难接触到钢琴的,而键盘钢琴的出现正好让那些业余爱好者,既满足的对钢琴音乐艺术的追求,也更廉价和便捷。对于初学音乐的人来说,这样的键盘钢琴软件更是训练的好助手,可以帮助你迅速熟悉各音阶音调和旋律节奏。因此,这样的软件也很多版本,有专业版,也有简单的Flash 版,当然也有此次课设要求设计的简陋版。专业版能提供多种乐器音色、录放功能、音符显示。不太好的地方是键盘要按下去才发音,没有延时,弹起来不太就手。Flash 版音色也比较好,提供了多键位,也可以自定义键位。 1.2 设计要求 设计汇编语言程序,实现键盘钢琴功能,具体要完成的设计任务如下: (1) 在键盘上自定义若干键对应着钢琴键; (2) 单击钢琴键,计算机发出相应的音阶,发声时间自定义; (3) 单击“ESC ”键退出程序 音阶与频率的对应关系如下所示: 音符 4 5 6 7 1 2 3 4 5 6 7 频率/Hz 175 196 220 247 262 294 330 349 392 440 494 523 587 659 2 总体方案论证 2.1按键与音调频率值的对应 设计此汇编语言程序,要实现键盘钢琴,首先是按键的自定义设计,因为题中要求设计的按键音调音阶有十四个,但是从网上查资料得知,各音阶与其相应频率有如表1-1所示的关系。 表1-1 音阶与频率的对应关系 单位:Hz 从表中可知:高低音之间有着大约两倍的关系,这样就很方便数据的储存了,只需要将其中一个音度的频率值存储下了,再进行二倍关系的换算即可得到倍低音、低音、中音、高音、倍高音五种音度的音调频率值。 因为题目中主要是对低、中、高音的要求,在这里就以低音为基准存储数据值和换算其他音调频率值,由表1-1中得知低音音符1 2 3 4 5 6 7的音调频率分别为131、147、165、175、196、220、247。其中,中音各音调的频率是相应低音音调频率的两倍, 高音各音调频率是低音的四倍的。又因为低音的频率值最大为247,正好小于一个无符字节数值的最大值255,因此,只需要在程序的数据区内安排七个字节来存放频率数据,即: FREQ DB 131,147,165,175,196,220,247 这样,不仅节省了存储空间,而且降低了存储数据的复杂程度。 考虑到字母键盘一共也只用26个,就不对所有音调都进行字母键盘的按键定义了,只补齐题目中所缺的高音和低音,共21个音阶。则可以按如下表1-2中的对应关系,设置21个按键分别对应着低、中、高三种音度的各音调的频率值。由于字母所对应的ASCII 码并不是连续的,因此在这里就将其的ASCII 码存储到数据区,然后根据变址寻址的方式 A 110 220 440 880 1760 3520 B 123 247 494 988 1975 3950 C 131 262 523 1046 2093 4186 D 147 294 587 1175 2349 4698 E 165 330 659 1318 2637 5277 F 175 349 698 1397 2794 5587 G 196 392 784 1568 3136 6271 表1-2 音阶频率与自定义按键的对应表 对字母按键的ASCII 码进行地址编码,可以将字母的ASCII 码的按表1-2的顺序存放,即: KEYS DB 'QWERTYU' , 'ASDFGHJ' , 'ZXCVBNM' 这样看来,就是将这些ASCII 码值分出三类,分别为低音类、中音类、高音类。 根据输入KEY 的ASCII 码值利用一个21次的LOOP 循环就可以找到对应的偏移地址,再将所得的偏移地址减去首地址的偏移地址得到该KEY 的地址相对值,再把该相对值与6和13大小判断偏移地址的所属类别(小于等于6为低音类,大于6小于等于13为中音类,大于13为高音类)。 知道KEY 的所属类别,就知道基准频率值应该乘以多大的倍数才是该KEY 的真正的频率值,低音类倍数为1,中音类倍数为2,高音类倍数为4。 接下来还要确定是哪个基准频率值,由于已经知道所属类别,如果是低音类则就是地址相对值,如果是中音类,则地址相对值要减去7,显然高音类则减去14,就得到了一个0至6的编码,再由换码指令XLA T 对频率数据FREQ 进行换码,可以很快得到该KEY 的对应的基准频率值。 最后是将得到的基准频率值乘以得到的类别倍数,就得到最后想要的输入KEY 的音调频率值。举例如下: 输入按键KEY 的ASCII 码值为“D ”,其ASCII 码是44H ,在一个21次的LOOP 循环下,可以得到数据位44H 的偏移地址DI ,在将该偏移地址DI-首地址的偏移地址KEYS=偏移地址的相对值9。 因为6<9<13属于中音类,基准频率值的倍数为2。因为属于中音类KEY “D ”编码为9-7=2,在换码可以知道,“D ”对应的基准频率值为165,故最后得到“D ”的频率值为165*2=330Hz 。 音度音名 1 2 3 4 5 6 7 低音频率/Hz 自定义按键 131 147 165 175 196 220 247 Q W E R T Y U 中音频率/Hz 自定义按键 131*2 147*2 165*2 175*2 196*2 220*2 247*2 A S D F G H J 高音频率/Hz 自定义按键 131*4 147*4 165*4 175*4 196*4 220*4 247*4 Z X C V B N M 因此,用此算法得到各个按键的频率值是可行的。不仅节省了存储空间,而且降低了存储数据的复杂程度,在程序编写上可以将这一段写成子程序,更加使得程序简洁明了。 2.2 扬声器的驱动分析 该程序主要是驱动电脑主板上的扬声器,根据音阶音调不同的频率值,来是扬声器发出不同的声音,从而产生想弹钢琴一样的感觉,当然音质是不能相提并论的。(在这里需要说明的是,现在大多数笔记本主板上已没有这个扬声器,但是台式机大多还是有的,在台式机上的效果更好点。) 在电路上如下图2-1所示: 8255(PB1) 图2-1 8253的电路连接图 在PC/XT/A T家族中,计时器芯片的3个通道都用其专门的功能,通道2是用来控制计算机的扬声器的声音频率的。通道2用于产生频率信号,故工作方式在方式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信号。另外,CPU通过8255A的C口,得知5283通道2的状态和扬声器驱动器的状态。 由上可知,需要扬声器正常发声,需要8253和8255A的协同工作,而8253的控制字在网上查的为43H,则同过下面的程序来初始化8253 MOV AL,0B6H OUT 43H,AL 而通道2的端口地址为42H,由于N值一般计算得出都大于255,故需要一个字的写入,而又因为8253只有八位数据线,故字的写入需要两次,一般将N值直接给AX然后通过下面的程序即可完成。 OUT 42H,AL MOV AL,AH OUT 42H,AL 而8255A能控制8253和扬声器,但是只要PB0和PB1同时为高调平,扬声器就为开,则对8255A的控制就是在对扬声器的控制,在网上得知8255A的B口地址为61H,则可以通过下面的程序实现扬声器的开与关。 IN AL,61H OR AL,3 ;可以保证PB0和PB1同时为高调平 OUT 61H,AL ;打开扬声器 MOV AL,AH AND AL,0FCH ;可以保证PB0和PB1同时为低调平 OUT 61H,AL ;关闭扬声器 2.3 发声时间 因为只要通过8255A将扬声器打开而不关闭,那么只要8253正常工作,扬声器就会一直发声,需要发声时间多长,只需要写一个延时子程序即可,利用LOOP和跳转指令就可以得到一个双循环程序,在根据指令时间依次乘以LOOP循环的次和跳转指令的跳转次数就可以得到想要的延时时间。子程序循环完毕在将扬声器关闭即可。延时子程序时间的长短就是发声时间的长短。 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)找出输入按键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流程图结束