汇编 音乐乐曲演奏程序.doc

上传人:11****ws 文档编号:3210097 上传时间:2019-05-25 格式:DOC 页数:25 大小:253.50KB
下载 相关 举报
汇编 音乐乐曲演奏程序.doc_第1页
第1页 / 共25页
汇编 音乐乐曲演奏程序.doc_第2页
第2页 / 共25页
汇编 音乐乐曲演奏程序.doc_第3页
第3页 / 共25页
汇编 音乐乐曲演奏程序.doc_第4页
第4页 / 共25页
汇编 音乐乐曲演奏程序.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、黄石理工学院汇编语言程序设计课程设计1目 录1、问题定义 .21.1 设计目的 .21.2 设计内容 .22、需求分析 .32.1 流程图 .32.2 通用发声程序设计原理 .43、详细设计 .63.1 主要的宏和过程的实现 .63.1.1DISPLAY 显示宏 .63.1.2ADDRESS 音乐地址宏 .63.1.3MUSIC 宏 .73.1.4 通用发生程序 GENSOUND.83.1.5WAITF 延时程序 .93.1.6CLEAR 清屏程序 .103.1.7RETU 退出 .113.2 主程序实现 .113.2.1 数据段定义 .113.2.2 堆栈段定义 .123.2.3 初始化 .

2、133.2.4 程序执行过程 .134、系统调试 .145、收获体会 .176、附录 .187、参考文献 .25黄石理工学院汇编语言程序设计课程设计21、问题定义1.1 设计目的1使学生能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。2培养学生综合运用所学知识独立完成汇编程序课题的能力。3培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。4提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。5培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问

3、题的新途径的悟性,初步培养工程意识和创新能力。6对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。1.2 设计内容要求完成一个音乐程序,即通过按下键盘上某个按键就可以按预先设定的程序播放音乐或者终止程序。 (比如:按大写字母“A” ,唱乐曲“玛丽有只小羔羊” ;按大写字母“B” ,唱乐曲“太湖船”按大写字母“C” ,唱乐曲“两只老虎” ;按“Q“鍵,退出。 )此程序涉及到过程和宏的调用,要求学生掌握关于过程和宏的定义和使用。(比如:可以设定播放某一段音乐为一个过程,设定对音乐进行播放的操作为一个宏操作。 )黄石理工学院汇编语言程序设计课程设计3

4、2、需求分析2.1 流程图开始显示提示信息接收键盘输入是“Q”?是“A”?是“C”?是“B”?退出程序将音乐节拍频率地址导入 ADDRESS调用 MUSIC,播放音乐显示错误提示调用清屏程序是是是是否否否否图 2-1 系统流程图黄石理工学院汇编语言程序设计课程设计42.2 通用发声程序设计原理PC 机发声系统以 8254 的 2 号计数器为核心。系统初始化时, 2 号计数器 I 作在“方波发生器”方式,初值为二进制数, ,写入顺序为先低后高,CLK2 为1193182MHz ,当计数初值为 533H 时,OUT2 输出的方波大约为 900Hz,经过简单的滤波之后,送至扬声器。改变 1.4 号计

5、数器的计数初值就可以使扬声器发出不同频率的音响。ROM BIOS 中有个 BEEP 子程序,这能根据 BL 中组出的时间计数值控制 8254 定时器,产生持续时间为 1 个或几个 0.5 秒,频率为 896HZ 的声音,我们可以利用并修改 BEEP,使其产生任一频率的声音。为此我们需要做两点修改,首先,BEEP 程序只能产生 896HZ 的声音,我们的通用发声程序应能产生任一频率的声音。其次,BEEP 产生声音的持续时间(音长)只能是 0.5 秒的倍数,我们希望声音的持续时间更易于调整,例如可以是 10ms 的倍数。我们知道 BEEP 能将计数值 533H 送给定时器 2 产生 896HZ 的

6、声音的,那么产生其它频率声音的时间计数值应为:533H896给定频率=123280H给定频率发声程序包括 3 个步骤: (1)在 8253 中的 42 端口送一个控制字 0B6H(10110110B) ,该控制字对定时器 2 进行初始化,使定时器 2 准备接收计数初值。 (2)在 8253 中的 42H 端口(Timer2)装入一个 16 位的计数值(533H895/频率) ,以建立将要产生的声音频率。 (3)把输出端口 61H 的 PB0、PB1 两位置 1,发出声音。 对于发音部分。PC 机上的大多数输入/输出(I/O)都是由主板上的 8255(或8255A)可编程序外围接口芯片(PPI)

7、管理的。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 通过一个与门与扬声器的驱动电路相连。当黄石理工学院汇编语言程序设计课程设计5PB1=1 时,允许 OUT2 的输出信号到达扬

8、声器电路。因此,只有 PB0 和 PB1 同时为“1”时,才能驱动扬声器地声。通过以下指令实现: IN AL,61H OR AL,3 OUT 61H,AL 上面的指令用以打开扬声器,如要关闭扬声器时则为: AND AL,0FCH OUT 61H,AL 当从 8255 中采集到输入的数据时,需要确定相应的频率,所以在软件编程时要建立一个数据表: TABLE DW 493,440,392,349,329,293,261 把相应的频率送到一个寄存器上,通过公式: 计数值=533H896 f=1234DCH f 算出计数值,再把算得的计数值送给 8253,就可产生所要频率的方波。在把计数值送 8253

9、 前,必须先把 8253 进行初始化: MOV AL,0B6H OUT 43H,AL 使其选用通道 2,工作在方式 3 下。 就整个电路而言,接好电路后,通过软件编程不断地采集从 8255 口中输入的信号,而 8 个开关都接在 8255 的 A 口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给 8253 的通道 2,8253 的通道 2 工作的方式 3 下,这样就可以产生满足频率要求的发声方波。这个方波经驱动放大就可以使扬声器发出相应的声音。 所以 8255 在这里完成两个任务,它不仅从 A 口中采集到数据,而且 B 口的 PB1 和

10、PB0 两个位要控制发声。8253 的主要任务就是产生所要求发声的不同频率的方波。黄石理工学院汇编语言程序设计课程设计63、详细设计3.1 主要的宏和过程的实现3.1.1DISPLAY 显示宏为将事先定义的数据段字符串显示在屏幕上,定一个参数为 b 的宏。将 b 的地址传到 DX。随后调用 DOS09 号功能调用。将字符串显示到屏幕。调用 DISPLAY的实例为:DISPLAY INFO1 DISPLAY INFO2 DISPLAY INFO3 DISPLAY MUSLIST在此段代码中,程序显示提示作用的字符串和歌曲列表。DISPLAY 宏具体实现如下:DISPLAY MACRO b LEA

11、 DX,b MOV AH,9 INT 21H ENDM3.1.2ADDRESS 音乐地址宏歌曲包含节拍和频率。此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入 SI 将歌曲节拍导入 BP。当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在 MUSIC 中实现发声。音乐地址宏实现如下:ADDRESS MACRO A,B LEA SI,A LEA BP,DS:B 黄石理工学院汇编语言程序设计课程设计7ENDM3.1.3MUSIC 宏在 ADDRESS 中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入SI、BP。为了检测歌曲是否结束,在 MUSIC 中,首先将 S

12、I 传递到 DI,DI 与-1 相减,如等于 0,则得出该频率定义为-1 。在歌曲频率表定义中将-1 定为该歌曲结束标志,此时 MUSIC 跳出结束。若该频率不为-1。调用通用发生程序 GENSOUND,将该音符按照频率和节拍表发声。发声后 SI、BP 分别加 2,跳转到下一个音符的频率和节拍,继续检测歌曲是否结束。如频率不为 0,继续将该音符发声,并循环此过程。具体实现方法如下:MUSIC PROC NEAR PUSH DS SUB AX,AX PUSH AX FREG: MOV DI,SI CMP DI,-1 JE END_MUS MOV BX,DS:BP CALL GENSOUND AD

13、D SI,2 ADD BP,2 JMP FREG END_MUS: RET MUSIC ENDP黄石理工学院汇编语言程序设计课程设计83.1.4 通用发生程序 GENSOUND该发生程序是在修改 BEEP 发声程序的基础上,以实现为 8088/86 编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:(1)在 8253/54 中的 43 端口送一个控制字 0B6H(10110110B) ,该控制字对定时器 2 进行初始化,使得定时器 2 准备接受计数初值。(2)在 8253/54 中的 42H 端口装入一个 16 位计数值,已建立将要产生的声音频率。(3)把输出端口 61H

14、的 0、1 两位置 1,发出声音。具体实现如下:GENSOUND PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL,0B6H OUT 43H,AL MOV DX,12H MOV AX,348ch DIV DI OUT 42H,AL MOV AL,AH OUT 42H,AL IN AL,61H MOV AH,AL OR AL,3 OUT 61H,AL 黄石理工学院汇编语言程序设计课程设计9WAIT1: MOV CX,3314 call waitf DELAY1: DEC BX JNZ WAIT1 MOV AL,AH OUT 61H,

15、AL POP DI POP DX POP CX POP BX POP AX RET GENSOUND ENDP该 GENSOUND 程序能产生 1965535Hz 的声音,这个频率的下限是使除法不产生溢出的最小值。其上限 65535 是多余的,因为人能听到的声音最高频率为20000Hz。此外一般情况下,GENSOUND 程序产生的声音不单单和频率有关,还和 CPU 有关。CPU 工作频率越高,时延越短,产生的声音越急促。为了使程序产生一个与CPU 工作频率无关的合适时延,在 MUSCI 中调用了一个时间延时程序 WAITF。3.1.5WAITF 延时程序80x86 的各种处理器采取了 666M

16、Hz 的工作频率,loop 指令的执行时间在这些处理器上也不相同。为了建立一个与处理器无关的延时,IBM 采用了一种利用硬件产生时间延时的方法,即通过监控端口 61H 和 PB4,使 PB4 每 15.08 微秒触发一次,一产生一个固定不变的时间基准。在 IBM PC AT BIOS 的 WAITF 子程序,就是一个产生 Nx15.08 微秒时间演示的程序。调用 WAITF 子程序时,CX 寄存器必须装入 15.08 微秒的倍数 N。黄石理工学院汇编语言程序设计课程设计10利用 WAITF 子程序能获得任意的时间延时,而不必在考虑 CPU 的型号和工作频率。具体实现如下:waitf proc

17、near push ax waitf1: in al,61h and al,10h cmp al,ah je waitf1 mov ah,al loop waitf1 pop ax ret waitf endp3.1.6CLEAR 清屏程序当程序初始化或用户输入错误时,程序调用 CLEAR 清屏程序。清屏程序将 AX、BX、CX、DX 先入栈,以保存现场,保证清屏后重新执行不会出现错误。随后启用 BIOS 功能调用,将屏幕初始化或上卷。其中 AL=0 表示初始化窗口,AL= 上卷行数, BH=卷入行属性,CH/CL=左上角行/列号,DH/DL=右上角行/列号。该程序段表示从左起 0 行 0 列到右起 24行 79 列全部清屏。将屏幕清空后重新将 AX、BX、CX、DX 出栈。clear proc near push ax push bx push cx push dx

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。