




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学 号: 兰州理工大课 程 设 计题 目音乐程序设计教 学 院山丹培黎学校专 业应用电子技术班 级09)秋大专电子班姓 名贾高强指导教师王文珍2010年10月1日目录一 概述21 背景分析22 课程设计目的23课程设计要求及功能33. 133. 1. 243. 1. 34二 总体方案设计51 设计思路52 程序流程图如下:6三 详细设计71 可编程时间间隔定时器825372 发声程序设计83 80x86的时间延迟94 宏定义105 清屏子程序设计11四 详细的算法描述121 主程序表述122音乐处理程序详细描述123音乐处理程序详细描述14五 程序的调试与运行结果说明15六使用说明17七 课程设计总结18参考文献19附录20一 概述1 背景分析汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语汇编语言言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。 大多数情况下Linux程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在Linux操作系统中也可以用完全用C语言来实现,再加上GCC这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实际情况是Linux程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和libc无关性。假设要移植Linux到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了音乐演奏程序设计课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求我们能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。通过具体的问题分析、设计、调试、运行程序。在实际问题中锻炼提高自己,增加了对本门课程内容的理解,锻炼了动手能力。就这个程序具体而言:知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表;然后编写程序一次取出表中的频率值和时间值,调用GENSOUDF程序发出各种声音。这个程序最终通过菜单所提示的信息选取所欣赏的音乐,是执行此程序后,会很有速且有效的使扬声器接通并发出音频位896Hz的声音。2 课程设计目的汇编语言是计算机能够提供用户使用的最快而又最有效的语言,也是能够用计算机所有特性能直接控制硬件的唯一语言。通过这次实验要求我们:(1) 了解通用发声程序。(2) 了解与掌握定时、计数、音乐、频率、时间之间的关系。(3) 学会用发声程序的设计方法。(4) 学会用汇编编辑音乐程序。这里主要用到MASM来进行程序的调试和运行,在程序测试通过后,最后运行查看最终结果。为了编写一个流行音乐乐曲演奏程序,分析时按照课程设计的要求必须要有操作提示、输入和输出。在界面设计时应该追求友好,能够使用户便于使用该程序。而且按照课题要求最好能够实现菜单式的界面,进一步提高该程序界面的友好性。同时,在设计分析时也必须解决发声问题。分析设计时按照课本P383(10.4 通用发声程序)所示的设计方法解决发声问题。通过音乐程序设计熟悉并掌握用汇编语言编程的方法和特点,借此来比较高级语言低级语言的优缺点,以便更好运用各种语言来开发应用软件通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法。达到能独立阅读、编制和调试一定规模的汇编语言程序的水平,能用汇编语言熟练地运用三大结构,进一步掌握各个指令的功能,特别是转向指令,能掌握子程序的定义及调试,包括段间及段内调用,以及正确地运用DEBUG指令,进一步理解和掌握程序直接控制I/O方式。3课程设计要求及功能 3. 1在本次课程设计中,编写源程序,并要求实现以下功能:3. 1. 1采用位触发方式编写程序,使计算机发出音响并奏出几首可选的乐曲。(1) 通过查阅相关资料,进一步理解程序直接控制I/O方式和位触发方式控制声音的工作原理(两种方式的概念及工作过程)。并要求怎样实现,了解掌握其运行各自的情况,在什么要的情况下使用。(2) 一首乐曲是由不同频率和节拍的音调组成,因此控制脉冲的频率和持续时间是编写乐曲程序的关键。根据已知的音符频率对照表,给出乐曲的频率表:设二分音符持续时间为0。5秒(50*10ms),50作为2拍的计数值,给出乐曲的节拍时间表。1(3) 用MASM进行调试,反复测试,不停反复的测试各个功能,看是否会有程序运行错误。例如:极限值的设置等。在不停测试程序直到正确时,测试工作才算完成,可以供以后的使用。3. 1. 2进一步学习利用定时器产生声音的方法,使计算机奏出乐曲。3. 1. 3 必须全面了解MASM 的功能,并能熟练使用MASM完成汇编程序的编译、调试、运行。3. 2 MASM软件简介3. 2. 1 MASM的主要版本:2000年微软发布了MASM6。15版本,后来出现MASM 64位元版。6.15 版是放在 Visual C+ 6。0 Processor Pack 中。7.0 版是放在 Visual C+ 。NET 2002。7.1 版是放在 Visual C+ 。NET 2003。8.0 版是放在 Visual C+ 。NET 2005,它也可以组译 x64 的程式码。3. 2. 2特点及功能介绍:4. x 1980 年代末期最流行的版本,很多组合语言入门书都以它为范本。5. x 开始强化组译器简易指令(点指令),以简化程式架构。稍晚的组合语言入门书亦大量运用此一版本。 6. x 版本为了支援 Windows,有几个重大特色:(1)支援 flat 与 386 以上 CPU保护模式。 整合 PWB(ProgrammersWorkBench) 开发环境。这软件在同时期的 Quick BASIC 也找得到。 (2)支援 DOS Extender,内建 DOS/16M。 (3)开始支援 OS/2 与 WinAPI。 (4)简易指令加入流程控制叙述,如 。IF、。While、。Exit。等。 (5)强化对外部函式库的支援命令,如 proto 与 invoke 等指令,其中最核心的是将 proc 指令包装成符合高阶语言风格(支援 C 与 Pascal 风格)的形式,且 invoke 指令重新包装 call 与 push/pop 指令,可以更直观、高阶地运用函式。这对呼叫高阶语言写成的函式、特别是繁复的 WinAPI 非常重要。 (6)masm 与 link 整合为 ML。(7) NMake 的 makefile 描述结构也产生了巨大的变化。二 总体方案设计1 设计思路 本程序应用了BIOS中断功能的字符显示和乐曲演奏程序。并利用计算机控制发声原理,在计算机中有一个可编程时间间隔定时器,它能根据程序提供的记数值和工作模式,产生各种形状和各种频率的记数定时脉冲,提供给系统各个部分使用。该乐曲点播程序曲一个主程序和4个子程序组成。其中前三个子程序为乐曲演奏子程序,接着是发声程序和清屏子程序,最后是一个回车换行程序。 1. 1定义频率表和时间表根据音阶表和简谱位演奏的乐曲定义一个频率freg和一个节拍时间表time。频率表中的数据可以才书本查到,节拍时间表中的数据是延迟时间10ms的倍数。1. 2将两个表的偏移地址放入SI和DI LEA SL MUS_FREQ LEA BP DSMUS_TIME1. 3取频率和时间从表中取出音符的频率放入DI,取出音符的持续时间(实际上是10ms的倍数)放入BX。 MOV DI,SI MOV BX,DS:BP频率表中最后一个数据1作为乐曲的结束符,也可以用0或其他的特殊值来代替。1. 4调用SOUND子程序发出音调调用通用发声子程序GENSOUND发声音调。这个程序比较简单,如果想演奏另一个乐曲,只需把freg和两个表中的数据换成另一个乐曲的频率和节拍时间就可以了。2 程序流程图如下: 图1 程序流程图初始化键盘输入结束符? Y菜单选择 N结束13? N DI频率表BX节拍表 Y调用GENSOUND 三 详细设计1 可编程时间间隔定时器8253在通用个人计算机中,有一个可编程时间间隔定时器8253,它能够根据程序提供的计数值和工作方式,产生各种形状和各种频率的计数/定时脉冲,提供给系统各个部件使用。本设计是利用计算机控制发声的原理,编写演奏乐曲的程序。在8253/54定时器内部有3个独立工作的计数器:计数器0,计数器1和计数器2,每个计数器都分配有一个断口地址,分别为40H,41H和42H.8253/54内部还有一个公用的控制寄存器,端地址为43H.端口地址输入到8253/54的CS,AL,A0端,分别对3个计数器和控制器寻址.对8353/54编程时,先要设定控制字,以选择计数器,确定工作方式和计数值的格式.每计数器由三个引脚与外部联系,见教材第320页图9-1.CLK为时钟输入端,GATE为门控信号输入端,OUT为计数/定时信号输入端.每个计数器中包含一个16位计数寄存器,这个计数器时以倒计数的方式计数的,也就是说,从计数初值逐次减1,直到减为0为止.8253/54的三个计数器是分别编程的,在对任一个计数器编程时,必须首先讲控制字节写入控制寄存器.控制字的作用是告诉8253/54选择哪个计数器工作,要求输出什么样的脉冲波形.另外,对8253/54的初始化工作还包括,向选定的计数器输入一个计数初值,因为这个计数值可以是8为的,也可以是16为的,而8253/5的数据总线是8位的,所以要用两条输出指令来写入初值.下面给出8253/54初始化程序段的一个例子,将计数器2设定为方式3,MOV AL,10110110BOUT 43H,ALOUT 42H,ALMOV AL,AHOUT 42H,AL在IBM PC中8253/54的三个时钟端CLK0,CLK1和CLK2的输入频率都是1.1931817MHZ. PC机上的大多数I/O都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的.关于8255A的结构和工作原理及应用举例参阅教材第340373页.教材第364页的”PC/XT机中的扬声器接口电路”一节介绍了扬声器的驱动原理,并给出了通用发声程序.本设计正是基于这个原理,通过编程,控制加到扬声器上的信号的频率,奏出乐曲的.2 发声程序设计2. 1 扬声器驱动方式 利用计算机控制发声的原理,可以编写演奏乐曲的程序。 PC机上的大多数都是由主板上的8255(或8255A)可编程序外围 接口芯片(PPI)管理的。PPI包括三个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号60H和62,输出寄存器分配的I/O端口号位61H。由PPI输出寄存器的0或1两位来控制扬声器的驱动方式。2. 1. 1 采用定时器方式: 它是利用8253/54定时器驱动扬声器。连接到扬声器上的是2。从扬声器的驱动系统图中可以知道,GATE2与端口61H的PBO相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模板3下工作。定时器2的OUT2与端口61H的PB1=1是,语序OUT2的输出信号到达扬声器电路。 当通道2用于发声是,一般采用模式3下,输出线为“1”和“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。2. 1. 2 采用位触发方式程序直接控制PPI(8255A可编程序外围接口芯片)的输出控制寄存器(I/O端口位61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而控制开关电路产生遗传脉冲形,这些脉冲经放大后驱动扬声器发出声音。如果控制着一脉冲波形的脉宽和长度就可以产生不同频率和不同音长的声音。乐曲是按照一定的高低、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。音符的频率可以从乐谱中查到,但实际上送入计数器2的是输入频率1。1931MHz与音符频率相除的值,通过发生程序SOUNDF的前半部分就是完成这个计算,并将计数值送入计数器2的功能。 音符的持续时间是根据乐曲的速度及每个音符的节拍数来确定的。在4/4(四四拍)中,四分音符为1拍,每小节四拍,全音符持续4拍,二分音符持续2拍,四分音符持续1拍,八分音符持续半拍等。如果给全音符分配1s(100*10ms)的时间,则二分音符的持续时间为0。5s(50*10ms),四分音符的持续时间为0。25s(25*10ms),八分音符的持续时间为0。125s(12。5*10ms)。知道了音调和频率的关系,就可以按照乐曲的乐谱将每个音符的频率和持续的时间定义成两个数据表;然后编写程序依次取出表中的频率值和时间值,调用程序发出各种声音。53 80x86的时间延迟利用CPU循环执行一条或几条指令来产生延迟时间是最常用 的一种方法,但对8088/86,80286,80386,80486以及pentiumIV来说,由于它们的工作频率不同及有些指令执行周期的差异,执行同样的延迟程序,产生的延迟时间都不一样。为了建立一个与处理器无关的时间延迟,1BM采用了一种利用硬件产生时间延迟的方法,即通过监视端口61H的PB4,使PB4每15.08us触发一次,以产生一个固定不变的时间基准,。下面的WAITF程序就是一个产生N x 15.08us 时间延迟的程序。调用WALTF子程序时,CX寄存器必须装入15.08us的倍数N。CX =15.08us的倍数WAITF PROC NEAR PUSH AXWALTF1: IN AL,61H AND AL,10H ;检测PB4的状态 CMP AL,AH ;是否发生变化 JE WAITF1 ;等待变化 MOV AH , AL ;存入新的PB4的状态 LOOP WAITF1 ;循环,直到CX 0为止 POP AX RETWAITF ENDP 当CX中的计数值N663时,调用WAITF子程序,可延迟10ms,若要延迟1s,可调用WAITF子程序100次,若要延迟0.5s,可调用WAITF子程序50次,依从类推,只要设置WAITF子程序的调用次数,就可获得所需的延迟时间。4 宏定义宏是源程序中一段有独立功能的代码程序。它只需要在源程序中定义一次,就可以多次调用它,调用时只需要用一个宏指令语句就可以了。 宏定义是用一组微操作来实现的。其格式是:macro name MACRO dummy parameter list ENDM其中MACRO和ENDM是一对伪操作。这对伪操作之间是宏定义体是一组有独立功能的程序代码。宏指令名(macro name)给出该宏定义的名称,调用时就是用宏指令名来调用该宏定义。宏指令名的第一个符号必须是字母,其后可以跟字母、数字或下划线字符。其中哑元表(dummy parameter list)给出了宏定义中所能用到的形式参数(或称虚参),每个亚元之间用逗号隔开。经宏定义后的宏指令就可以在源程序中调用。这种对宏指令的调用称为宏调用,宏调用的格式是:macro name actual parameter list实元表(actual parameter list)中的每一项为实元,相互之间用逗号隔开。 当源程序被汇编时,汇编程序将对每个宏调用做宏展开。宏展开就是用宏定义取代原程序中的宏指令名,而且用实元取代宏定义中的哑元。在取代时,实元和哑元是一一对应的,即第一个实元取代第一个哑元,第二个哑元取代第二个哑元以此类推。一般来说,实元的个数应该和哑元的个数相等,但汇编程序并不要求他们必须相等。若实元个数大于哑元个数,则多余的实元不予考虑;若实元个数小于哑元个数,则多余的哑元个数做“空”处理。6 在程序中,我们利用宏定义来实现字符串的输出功能,这样在输出提示语言时,不用每次都写一段很长的代码,而只需要改变宏定义中的参数即可。 具体的宏定义代码如下:SHOW MACRO b LEA DX , b MOV AH,9 INT 21H ENDM若要调用时HELLO字符串,只须一句语句: SHOW HELLO 这里需要注意的是,宏定义结束使用关键字NEDM,而不子程序结束时的ENDP。5 清屏子程序设计屏幕的其实行列不为(0,0)结束的行列不为(24,79),则屏幕上只有指定的一部分具有上卷的功能,这个屏幕伤的部分区域叫做窗口(window)像这样的窗口可以在屏幕上设置多个,这些窗口都可以独立使用。如果上卷超过指定窗口的顶部,这些行的内容就消失,出现在窗口底部的新行被填为空格,其属性用BH寄存器决定。如果AL=0,则实现完成的工作是清楚屏幕的功能,它将按AL中的Blank字符(0)使指定的窗口为空白。CLEAR PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,6 MOV AL,0 MOV CH,0MOV CL,0 MOV DH,48 MOV DL,158 MOV BH,7 INT 10H POP DX POP CX POP BX POP AX RETCLEAR ENDP四 详细的算法描述1 主程序表述code segmentassume cs:code,ds:databegin:mov ax,data mov ds,axnext: dispmsg msgmenu dispmsg msgchoose;提示菜单及输入数字inputbegin:mov ah,01h int 21h cmp al,q ;输入q则退出 je exit cmp al,1 ;比较数字4? ja doagain and ax,000fh;将ASCII码转换成数字,以便后面指向table表里对应的地址 dec ax ;减1,对应地址 shl ax,1 ;相当于ax*2,因为table里的相邻偏移地址是2 mov bx,ax jmp tablebx ;间接转移:IP-table+bx跳到table里面对应的程序段exit: mov ah,4ch int 21h2音乐处理程序详细描述music1: dispmsg msgdoing mov si,offset freq_dahai mov di,offset time_dahaim1: mov cx,si cmp cx,-1 je next mov bx,di call gensound add si,2 add di,2 jmp m1music2:dispmsg msgdoing mov si,offset freq_dongfengpo mov di,offset time_dongfengpom2: mov cx,si cmp cx,-1 je next mov bx,di call gensound add si,2 add di,2 jmp m2music3:dispmsg msgdoing mov si,offset freq_dashetou mov di,offset time_dashetoum3: mov cx,si cmp cx,-1 je xx jmp xx1xx: jmp nextxx1: mov bx,di call gensound add si,2 add di,2 jmp m33音乐处理程序详细描述 gensound proc near push dx mov al,0b6h ; 向计数器写控制数 out 43h,al ; 方式3、双字节写和二进制计数方式写控制口 mov dx,08h ; 设置被除数 mov ax,3208h div cx ; 其商为预置值 out 42h,al ; 先送LSB mov al,ah out 42h,al ; 后送MSB in al,61h ; 读端口原值 mov ah,al or al,3 out 61h,al ; 接通扬声器l2: push dx push ax mov dx,8h mov ax,0f05hs1: sub ax,1 sbb dx,0 jnz s1 pop ax pop dx dec bx jnz l2 mov al,ah ; 写回61h端口值,关闭扬声器 out 61h,al pop dx retgensound end五 程序的调试与运行结果说明4. 1执行程序时,用户界面如下: 5. 2、歌曲选择“1”时,下图所示:(张宇生大海) 5. 3、歌曲选择“2”时,下图所示:(周杰伦东风破) 5. 4、歌曲选择“3”时,下图所示:(吴克群大舌头) 5. 5输入“q”程序返回DOS环境5. 6输入其他未定义字符,则显示出错六使用说明 流行音乐乐曲演奏程序的歌曲清单如下:1、 张宇生大海2、 周杰伦东风破3、 吴克群大舌头操作说明如下表:输入操作字符“1”播放张宇生大海字符“2”播放周杰伦东风破字符“3”播放吴克群大舌头字符“q”返回到D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025一级建造师综合提升测试卷及完整答案详解【名校卷】
- 应急安全培训校园课件
- 2024-2025学年度收银审核员测试卷及参考答案详解【达标题】
- 2025燃气职业技能鉴定考前冲刺试卷附参考答案详解AB卷
- 秋季腹泻典型临床表现与非典型症状识别
- 2024年安全员考试模拟试题附完整答案详解(夺冠)
- 水井合同(标准版)
- 信息系统项目管理师案例分析
- 2024-2025学年度环境影响评价工程师之环境影响评价相关法律法规能力提升B卷题库及答案详解【真题汇编】
- 2024年安全员考试检测卷及答案详解(网校专用)
- 2025年高考真题-化学(湖南卷) 含答案
- 植保培训活动方案
- 好教育好人生
- 头痛的中医护理查房
- 客户拜访技巧讲课件
- 软件和信息技术服务定制化开发解决方案
- 水井清污协议书
- 水利工程施工防火措施
- 2025年煤炭生产经营单位(一通三防安全管理人员)考试笔试试题(400题)附答案
- 音乐基础-乐理篇
- 塑胶地板施工合同
评论
0/150
提交评论