版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目 录1 总体要求与分析11.1 设计要求11.2 设计思路分析12 方案设计22.1 方案一22.2 方案二22.3 方案选择23 硬件电路34 软件设计44.1 屏幕显示设计44.2 音乐发生控制54.3 节拍时间的实现64.4 音乐乐谱编程74.5 程序流程图95 程序调试及运行结果126 小结与体会13参考文献13附录一程序源代码14附录二程序运行结果21摘要音乐演奏实现的一个主要步骤是乐谱编程。通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序利用硬件实现频率计数和延时时间的控制,利用8253-5定时/计数器芯片和8255a并行i/o接口芯片。使8253的一个
2、通道工作在“方波发生器”模式,实现对频率的计数;利用8255a的pb3端口实现发声时间的计数控制。转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。知道了音调与频率和时间的关系,就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表;然后编写程序一次取出表中的频率和时间值,调用gensoundf程序发出各种声音。这个程序最终通过菜单所提示的信息选取音乐。关键词:汇编语言 运行程序 演奏 调试音乐演奏1 总体要求与分析1.1设计要求本文主要编写一段音乐程序,该程序可以进行如下操作:按大写字母“a”,奏一首歌曲;按大写字母“b”;奏另一首歌曲,曲目自选。按q退出程序。1.2设计思路分
3、析 在ibm-pc/xt机中都带有8253-5定时/计数器,ibm-pc/at中带有8254定时/计数器,这两种芯片功能十分类似。本文通过对8253-5定时/计数器芯片的操作实现音乐演奏。该声音接口通过汇编语言对8253-5的端口直接进行操作,可以不必要过多的使用bios的调用和dos的调用。计数器芯片有3个通道,各自具有专用功能。通道0时系统的始终节拍计时器,通道1专用于产生动态ram的定时刷新信号,通道2用来控制计算机的扬声器的声音频率。该音乐演奏主要用到通道2的功能,使通道2工作在“方波发生器”方式,产生相应频率的音调送至喇叭驱动电路,使喇叭发出不同音调的声音。使用8255a的pb0控制
4、通道2的计数,pb1控制通道2的输出对扬声器产生控制的时间。人机交互包括屏幕显示提示语以及人工输入相应参数,主要应用到bios的10h号中断调用以及dos的21h号中断调用。bios的10h号中断调用用于显示器驱动,设置显示模式和光标位置;dos的21h号中断调用用于单字符输入以及多字符输出显示。音乐演奏实现的一个主要步骤是乐谱编程。通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。2 方案设计 音乐的实现主要是对乐谱中的单音符按照一定的音符频率表转化为计数器的计数频率以及喇叭发声的控制时间,通过计数产生相应的控制
5、动作。由此可以有两种方案比较和选择。2.1 方案一通过编程使用软件来实现计数和喇叭发声的时间设置,控制8255a并行i/o接口驱动喇叭发声。cpu每执行一条指令需要耗费一定的时间,这样可以通过循环的方式设置好循环次数,实现软件计数,然后输出相应的高低电平,驱动喇叭发出对应频率和节拍的声音。利用软件编程方式实现该功能的优点是可以减少硬件开支,便于调试和问题的查找。缺点是cpu开支太大,利用率不高,而且时间不够精准。2.2 方案二利用硬件实现频率计数和延时时间的控制,利用8253-5定时/计数器芯片和8255a并行i/o接口芯片。使8253的一个通道工作在“方波发生器”模式,实现对频率的计数;利用
6、8255a的pb3端口实现发声时间的计数控制。这样可以精确的控制时间,减少cpu的开支。该方案的优点是控制精度提高,同时也减少cpu的开支。缺点是硬件开销比较多。2.3 方案选择 本文要实现的功能所需要的硬件电路并不是太复杂,一般的ibm-pc/xt/at机家族都带有相应的硬件电路。在提高精度与简易程度的比较下,决定采用方案二,这样可以大大提高时间控制精度,同时减少软件程序的复杂度。3 硬件电路 ibm-pc/xt内部8253电路图如图3-1所示。图3-1 8253电路连接图8253的通道0用于产生固定频率的始终节拍,通道1用于产生固定频率的的刷新信号,通道2用于产生频率信号,工作在方式3,计
7、数值为6a4h=1190,方波输出频率为1.19mhz。此信号频率决定扬声器的音调,通道2的控制字为0b6h。音乐产生主要用到通道2。8253通道2的计数由8255a的pb0控制,当pb0输出为高电平时,使门控gate2为高电平。此时,8253通道2允许计数,故通道2的输出方波受pb0的控制,从而控制扬声器的音调高低。通道2的输出能否对扬声器产生持续控制还取决于8255a的pb1。当pb1为“0”时,out2不能通过“与门”;反之,则可以通过“与门”控制扬声器。所以,扬声器发音时间的长短取决于8255a的pb1信号。另外cpu通过读8255a的c口,得知8253通道2的状态和扬声器驱动器的状态
8、。4 软件设计4.1 屏幕显示设计程序运行时,屏幕显示第一界面如下:assembly music player-|please select a music|-a liangzhilaohub zhengfuq exit选择a、b分别演奏相应的音乐,选择q键结束程序运行。当输入别的按键信号时,显示出错提示信息,界面如下:error! choose a b qplease input again!assembly music player-|please select a music|-a liangzhilaohub zhengfuq exit按照提示信息重新输入正确字符即可。 上述提示信息在
9、数据段定义,类型为字节型。首先调用bios中断的10h号功能设置文本模式。程序如下: mov ah,00h ;bios 10子功能 mov al,02h ;80*25彩色文本模式 int 10h ;bios 10功能调用然后调用背景清屏子程序使文本屏幕清空,为输入信息作准备,清屏子程序如下:clr proc near mov bh,0 ;第0页 mov bl,00011010b ;字符属性,蓝底绿字不闪烁 mov dx,0000h ;0行0列 mov al,' ' ;输出的字符 mov cx,80*25 ;循环次数 mov ah,02h ;bios 10h子功能调用,置光标位置
10、 int 10h mov ah,09h ;bios 10h子功能调用,输出字符 int 10h retclr endp最后输出提示语字符。输出提示语字符时,需要多次使用一段相同的输出代码,将该代码定义为宏,可以避免多次重复书写相同的代码。不定义为子程序是为了避免多次调用使执行速度减慢。相应宏定义语句为:show macro b lea dx, b ;将相应字符段的偏移地址装入dx mov ah, 9 ;dos 21h号中断9子功能输出多字符 int 21h endm则相应的字符提示信息输出代码为:call clrshow info1 show info2show info3 show info
11、4 show muslist4.2 音乐发声控制一首乐曲由若干音符组成,一个音符对应一个频率。将与一个频率对应的计数器初值写入2号计数器(端口地址为42h),扬声器就发出相应的音调,计数器初值的计算公式:计数器初值=1193182/输出频率其中,1193182hz转换成十六进制为12348ch,因此在打开扬声器的条件下,执行下列程序段即可发出与输出频率对应的音调。mov al,0b6h ;写入方式控制字out 43h,al ;写入控制端口mov dx,12h mov ax,348ch div 频率值
12、 ;频率转换成计数初值 out 42h,al ;低8位送2号计数器 mov al,ah out 42h,al ;高位送2号计数器 接下来设计发声程序,发声系统受8255a芯片(端口地址为60h-63h)的两根输出线pb0和pb1的控制,pb0输出的高电平使2号计数器正常工作,pb1输出高电平打开输出控制门。发声程序代码如下:in al,61h ;读取8255a的pb端口原输出值mo
13、v ah,al ;将原输出值保存于ah中or al,3 ;使pb0、pb1、均为1out 61h,al ;打开gate2门,输出方波到扬声器4.3 节拍时间的实现下面控制音符的演奏时间,这是设计音乐程序的关键问题。最直观的方法是按照谱为每一个音符规定一个演奏时间。在遇到一首不熟悉歌曲时,初期很难确定每个音符的演唱时间,而调试程序的需大量的时间。为每一个音符规定“单位时间”: 单位时间*n=音符的延长时间其中,n为调试参数,一首歌曲只有一个调试参数。设计程序时可以用equ伪指令定义调试参数,初值现行估算,调试时在修改它。节拍时间设置好以后,就可以利用延时程序,通过pb1端口控制发声的时间长短。8
14、0x86的各种处理器采用6-66mhz的工作频率,loop治理的执行时间在这些处理器上也不同。为了建立一个与处理器无关的时间延迟,ibm采用了一个利用硬件产生时间延迟的方法,即通过监控端口61h的pb4,使pb4每15.08us触发一次,以产生一个固定不变的时间基准,在ibm-pc/xt 中的bios中的waitf子程序,就是一个产生n*15.08us时间延迟的程序,调用waitf子程序时,cx寄存器必须装入15.08us的倍数n。本程序延时程序参考上面的原理,代码如下:waitf proc near ;延时保护程序 push ax ;保护寄存器waitf1: in al,61h ;读取pb端
15、口地址 and al,10h ;低四位清零 cmp al,ah ;检查是否改变 je waitf1 ;等待改变 mov ah,al ;改变,保护新端口值 loop waitf1 ;继续,直到cx=0 pop ax ;恢复寄存器 ret waitf endp 4.4 音乐乐谱编程组成音乐的每个音符的频率值和持续时间是音乐程序发声所需要的两个数据,根据音调与频率和时间之间的关系,把要编辑的音乐的每个音符的频率和持续时间定义成两个数据表,进而把它们写入通用发声程序。音符频率表示见表1所示,编程产生各种音符的频率时可参照此表。表1音符频率表 (单位:赫兹)4.5 程序流程图 主程序流程图如图4-1。键
16、盘输入提示信息开始输入是“q”? y n 输入是“b”?输入是“a”?调用music y显示出错信息n调用music y退出n图4-1 主流程图主程序调用返回主程序指向下一个数据调用gensound频率值是“-1”?装入音符频率值寄存器入栈music子程序流程图如图4-2。yn图4-2 music子程序流程图gensound子程序流程图如图4-3所示:bx=0?返回music恢复寄存器调用waitf设置cx初始值开始计数并打开扬声器计数初值装入2号计数器求取发声频率设置计数器2工作方式寄存器入栈程序调用 n y图4-3 gensound子程序流程图5 程序调试及运行结果程序编写完成后在mf2k
17、p集成软件环境中运行,刚开始编译时,出现了很多的变量未定义的错误,经过反复检查,将拼写错误的地方一一改正,再次运行时出现了图5-1所示的错误。图5-1 运行错误界面一开始不知道哪里出现错误,反复检查程序后仍为发现错误。于是上网搜索“ntvdm”的意思,明白了它是一个虚拟进程运行时一个必要的程序。猜想可能是某个参数的设置超出了该进程的参数范围。于是重新调试程序,终于发现时调用bios 10h号中断0子功能中al设置的文本模式设置错误,其中al的值不能大于3。修改后将al值改为02h后,该错误得以解决。随后发现在按照提示正确输入时,可以演奏音乐,但是当输入错误的字符时,发现屏幕并不显示错误提示语,
18、经过多次检查和调试,发现是没有清屏程序重新设置文本显示模式,加上该段代码后程序运行正常。调试过程中声音的节拍调试时间比较长,多次取值后得到一个可以识别的演奏声音。解决完程序中的问题后,按提示语输入相应的字符命令,可以播放相应的歌曲或是退出,输入错误时会出现错误提示语句。基本能实现要求的功能。6 小结与体会本文编写的音乐演奏程序可以满足设计要求,能够播放音乐,并且能够有屏幕显示,极大地方便了人机交互。这次微机原理课程设计历时两个星期,在整整两星期的日子里,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。在这次的课程设计中,对于汇编语言的各种功能终于有了一个比较全面和具体的认
19、识,在亲自动手编写程序的过程中,发现了很多读程序时不能发现的漏洞。虽然上课学过很多的理论,平时也看了一些辅导书上的程序,但是真正自己动手才发现以前对于编程工具的使用还处于一知半解的状态上,各种指令和伪指令代码间的联系还不会应用,这次经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。在这次课程设计中,把以前学的支离破碎的指令代码相互的功能结合起来,使它们共同组成一个具有一定功能的小程序,这样大大提高了对于汇编语言的功能的认识,同时也极大地提高了我的兴趣。通过这次课程设计使我更加体会到了理论与实际相结合的重要性,
20、只有理论知识是远远不够的,在实践中可能会遇到各种各样的问题,不多经历就无法感受到这一点。要在实践中提高自己的动手能力和解决问题的能力,从而学以致用。参考文献1 沈美明、温冬蝉.ibm-pc汇编语言程序设计(第2版).北京:清华大学出版社,20012 周明德.微型计算机系统原理及应用(第4版).北京:清华大学出版社,20053 陈章龙、陈泽文.ibm-pc机软硬件接口及实验.北京:人民邮电出版社,19934 王爽.汇编语言(第2版).北京:清华大学出版社,20085 周佩玲、彭虎、傅中谦.微机原理与接口技术.北京:电子工业出版社,2005附录1 程序源代码data segment info1 d
21、b 0dh,0ah,' assembly music player$' info2 db 0dh,0ah,' -$'info3 db 0dh,0ah,' |please select a music|$' info4 db 0dh,0ah,' -$' info5 db 0dh,0ah,' error! choose a b q$' info6 db 0dh,0ah,' please input again!$' muslist db 0dh,0ah,' a liangzhilaohu'
22、; db 0dh,0ah,' b zhengfu' db 0dh,0ah,' q exit' db 0dh,0ah,' ' db 0dh,0ah,' $' ;* 两只老虎mus_freg1 dw 262,294,330,262 dw 262,294,330,262 dw 330,350,393 dw 330,350,393 dw 393,441,393,350,330,262 dw 393,441,393,350,330,262 dw 262,441,262 dw 262,441,262,-1 mus_time1 dw 4*15,
23、 4*15,4*15,4*15 dw 4*15, 4*15,4*15,4*15 dw 4*15, 4*15,8*15 dw 4*15, 4*15,8*15 dw 2*15,1*15,2*15,1*15,4*15,4*15 dw 2*15,1*15,2*15,1*15,4*15,4*15 dw 4*15, 4*15,8*15 dw 4*15, 4*15,8*15;* 征服mus_freg2 dw 392,392,523,523,587,587,523,587,659,784,659,392,392,415 dw 659,659,698,659,587,523,523,415,415,523,65
24、9,587 dw 392,392,523,523,587,587,659,659,784,784,392,415,523 dw 659,659,698,659,587,523,415,659,784,784,523,587,523,523 dw 784,1046,988,784,784,880,784 dw 784,1046,988,784,880,659,880 dw 880,880,880,784,659,659,698 dw 698,698,698,784,880,659,698,587 dw 784,1046,988,784,784,880,784 dw 784,1046,988,78
25、4,880,659,880 dw 880,880,880,784,659,659,698 dw 698,698,698,659,523,523,587,523,-1mus_time2 dw 8 dup(50),3 dup(100),50,100,250 dw 50,50,100,50,100,50,50,200,50,50,100,250 dw 7 dup(50),100,50,150,50,100,200 dw 50,50,3 dup(100),125,25,50,125,25,50,50,150,250 dw 50,100,50,50,100,50,250 dw 50,100,50,50,
26、100,50,250 dw 50,50,100,50,100,50,250 dw 50,50,100,50,50,200,50,250 dw 50,100,50,50,100,50,250 dw 50,100,50,50,100,50,250 dw 50,50,100,50,100,50,300 dw 50,50,100,4 dup(50),200;* data ends stack segment db 200 dup ('stack') stack ends code segment assume ds:data,ss:stack,cs:code main: mov ax,
27、data mov ds,ax mov ah,00h ;bios 10子功能 mov al,02h ;80*25彩色文本模式 int 10h ;bios 10功能调用 call clr ;* 定义宏 show macro b lea dx,b ;将提示语的偏移地址送入dx mov ah,9 ;调用中断,输出多字符 int 21h endm ;* 音乐地址宏 address macro a,b lea si,a ;将频率表的偏移地址送入silea bp,ds:b ;将节拍时间表的偏移地址送入bpendm ;* show info1 show info2 show info3 show info4
28、show muslist input: mov ah,01h ;等待输入一个字符 int 21h cmp al,'q' ;比较字符 jz retu ;是,返回 cmp al,'a' ;与a比较 jnz b0 ;不等再比较 address mus_freg1,mus_time1 ;取数据 call music ;调用音乐子程序 jmp exit1 b0: cmp al,'b' jnz exit address mus_freg2,mus_time2 call music exit1: jmp input ;继续等待输入exit: mov ah,00
29、h ;bios 10子功能 mov al,02h ;80*25彩色文本模式 int 10h ;bios 10功能调用 call clr ;背景清屏 show info5 ;输入错误,显示提示语 show info6 show info1 show info2 show info3 show info4 show muslist jmp input retu: mov ah,4ch ;返回 int 21h ;* ;背景清屏clr proc near mov bh,0 ;第0页 mov bl,011010b ;字符属性 mov dx,0000h ;0行0列 mov al,' ' ;要输出的字符 mov cx,80*25 ;循环次数 mov ah,02h ;置光标位置 int 10h mov ah,09h ;bios 10子功能调用,输出字符 int 10h retclr endp;*发声 gensound proc near push ax ;保护寄存器 push bx push cx push dx push di mov
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论