音乐乐曲演奏程序课程设计报告.doc_第1页
音乐乐曲演奏程序课程设计报告.doc_第2页
音乐乐曲演奏程序课程设计报告.doc_第3页
音乐乐曲演奏程序课程设计报告.doc_第4页
音乐乐曲演奏程序课程设计报告.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南通大学电气工程学院微机原理课程设计报 告 书课 题 名 按键选择音乐播放和步进电机正反转控制班 级 电084班 姓 名 陈彬 小组成员 陈彬 陈海冬 张晓天 指导教师 胡慧 日 期 2011.6.21 2011.6.30 第一部分软件设计按键选择音乐播放目 录1、设计目的-22、设计内容-23、设计过程-2-3.1流程图-2-3.2通用发声程序设计原理-3-3.3主要的宏和过程的实现-4-3.3.1display显示宏-4-3.3.2address音乐地址宏-5-3.3.3music宏-5-3.3.4通用发生程序gensound-6-3.3.5waitf延时程序-6-3.3.6clear清屏程序-7-3.3.7retu退出-7-3.4主程序实现-8-3.4.1数据段定义-8-3.4.2堆栈段定义-8-3.4.3初始化-9-3.4.4程序执行过程-94、系统调试-95、附录(程序清单)-116、收获体会-177、参考文献-17 1、设计目的1能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。2培养综合运用所学知识独立完成汇编程序课题的能力。2、设计内容要求完成一个音乐程序,即通过按下键盘上某个按键就可以按预先设定的程序播放音乐或者终止程序。3、设计过程3.1流程图图2-1 系统流程图开始显示提示信息接收键盘输入是“q”?是“a”?是“b”?退出程序将音乐节拍频率地址导入address调用music,播放音乐显示错误提示调用清屏程序是是是否否否3.2通用发声程序设计原理发声程序包括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)管理的。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通过一个与门与扬声器的驱动电路相连。当pb1=1时,允许out2的输出信号到达扬声器电路。因此,只有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前,必须先把8253进行初始化: mov al,0b6h out 43h,al 使其选用通道2,工作在方式3下。 就整个电路而言,接好电路后,通过软件编程不断地采集从8255口中输入的信号,而8个开关都接在8255的a口上,只要有开关按下,就会采集到一个数据,根据这个数据与事先编好的表对应,得到一个计数值,把这个计数值送给8253的通道2,8253的通道2工作的方式3下,这样就可以产生满足频率要求的发声方波。这个方波经驱动放大就可以使扬声器发出相应的声音。 所以8255在这里完成两个任务,它不仅从a口中采集到数据,而且b口的pb1和pb0两个位要控制发声。8253的主要任务就是产生所要求发声的不同频率的方波。3.3主要的宏和过程的实现3.3.1 display显示宏为将事先定义的数据段字符串显示在屏幕上,定一个参数为b的宏。将b的地址传到dx。随后调用dos09号功能调用。将字符串显示到屏幕。调用display的实例为: display info1 display info2 display info3 display muslist在此段代码中,程序显示提示作用的字符串和歌曲列表。display宏具体实现如下:display macro b lea dx,b mov ah,9 int 21h endm3.3.2 address音乐地址宏歌曲包含节拍和频率。此处定义的音乐地址宏包含两个参数,将歌曲频率地址导入si将歌曲节拍导入bp。当选择不同的歌曲时,主程序调用该宏,将用户要求的歌曲的频率和节拍导入,以便在music中实现发声。音乐地址宏实现如下:address macro a,b lea si,a lea bp,ds:b endm3.3.4 music宏在address中,程序已经将歌曲的首个频率地址和首个节拍地址分别导入si、bp。为了检测歌曲是否结束,在music中,首先将si传递到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 add si,2 add bp,2 jmp freg end_mus: ret music endp3.3.5通用发生程序gensound该发生程序是在修改beep发声程序的基础上,以实现为8088/86编写一个任意频率和任意持续时间的通用发声程序。该程序包括以下三个步骤:(1)在8253/54 中的43端口送一个控制字0b6h(10110110b),该控制字对定时器2进行初始化,使得定时器2准备接受计数初值。(2)在8253/54中的42h端口装入一个16位计数值,已建立将要产生的声音频率。(3)把输出端口61h的0、1两位置1,发出声音。具体实现过程见程序清单。该gensound程序能产生1965535hz的声音,这个频率的下限是使除法不产生溢出的最小值。此外一般情况下,gensound程序产生的声音不单单和频率有关,还和cpu有关。cpu工作频率越高,时延越短,产生的声音越急促。为了使程序产生一个与cpu工作频率无关的合适时延,在musci中调用了一个时间延时程序waitf。3.3.6waitf延时程序80x86的各种处理器采取了666mhz的工作频率,loop指令的执行时间在这些处理器上也不相同。为了建立一个与处理器无关的延时,ibm采用了一种利用硬件产生时间延时的方法,即通过监控端口61h和pb4,使pb4每15.08微秒触发一次,一产生一个固定不变的时间基准利用waitf子程序能获得任意的时间延时,而不必在考虑cpu的型号和工作频率。具体实现如下:waitf proc 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.3.7 clear清屏程序当程序初始化或用户输入错误时,程序调用clear清屏程序。清屏程序将ax、bx、cx、dx先入栈,以保存现场,保证清屏后重新执行不会出现错误。随后启用bios功能调用,将屏幕初始化或上卷。其中al=0表示初始化窗口,al=上卷行数, bh=卷入行属性,ch/cl=左上角行/列号,dh/dl=右上角行/列号。该程序段表示从左起0行0列到右起24行79列全部清屏。将屏幕清空后重新将ax、bx、cx、dx出栈。3.3.8 retu退出当程序要求退出时,主程序会调用retu进行退出。retu程序内容实际为一个bios功能调用。retu: mov ah,4ch int 21h3.4主程序实现3.4.1数据段定义数据段分别定义了info1、info2、info3 、info4、info5各字符串分别显示程序运行之初对用户的提示。muslist 中显示用户能选择的三首歌曲列表。程序用mus_freg、mus_time分别定义了音乐频率和节拍。使得发声程序可以按照理想的要求发出连续的乐曲。节拍和频率定义原理如下:乐曲是按照一定的高低、长短和强弱关系组成的音调,在每一首乐曲中,每个音符的音高和音长与发声系统中的频率、节拍有关。可参考下表:音名cdefgabcdefgabc唱名12345671234567i频率(hz)131147165175196220247262294330349392440492523其中,低音阶从低音c(131hz)到中央c(262hz),高音阶从中央c(262hz)到高音c(523hz)。组成乐曲的音符的频率值和持续时间是乐曲程序发声所必需的两组数据,频率可以查上表,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。在4/4拍中,四分音符为一拍,每小节四拍,全音符持续四拍,二分音符持续二拍,四分音符持续一拍,八分音符持续半拍。如果给全音符分配1秒(100*10ms)的时间,则二分音符持续时间为0.5秒,四分音符持续时间为0.25秒,八分音符持续时间为0.125秒。知道了音调及频率、时间的关系后,可以按照乐曲的乐谱将每个音符的频率和持续时间定义为两个数据表,然后编写程序依次取出表中的频率值和时间值。3.4.2堆栈段定义程序定义了一个长度了200的堆栈段,如下:stack segment db 200 dup (stack)stack ends3.4.3初始化程序初始化使用了bios功能调用。使用0ah号功能设置显示方式。本程序对显示要求较为简单,故使用40x25黑白文本、16级灰度方式显示。若要求改变显示方式,可以根据0ah功能设置表自行添加。 3.4.4程序执行过程详细参见附录中input部分,以及程序流程图。4、系统调试编译程序,如下图所示编译连接正确待装载成功后,运行程序,运行情况如图程序初始界面,如下图所示程序报错要求重新输入,如下图所示播放后退出,如下图所示5、附录(程序清单)本程序的代码如下:data segment info1 db 0dh,0ah,welcome to this programe!$ info2 db 0dh,0ah,there are some music!$ info3 db 0dh,0ah,please select which one to play!$ info4 db 0dh,0ah,please input again!$ muslist db 0dh,0ah,a music:mary has a little ship db 0dh,0ah,b music:the boat on taihu lake db 0dh,0ah,q exit db 0dh,0ah,$ ;* 音乐一 玛丽有只小羊羔mus_freg1 dw 330,294,262,294,3 dup (330) dw 3 dup (294),330,392,392 dw 330,294,262,294,4 dup (330) dw 294,294,330,294,262,-1mus_time1 dw 6 dup (25*8),50*8 dw 2 dup (25*8,25*8,50*8) dw 12 dup (25*8),100*8;* *音乐二 太湖船mus_freg2 dw 330,392,330,294,330,392,330,294,330 dw 330,392,330,294,262,294,330,392,294 dw 262,262,220,196,196,220,262,294,332,262,-1 mus_time2 dw 3 dup(50),25,25,50,25,25,100 dw 2 dup(50,50,25,25),100 dw 3 dup(50,25,25),100 data ends stack segment db 200 dup (stack)stack endscode segment assume ds:data,ss:stack,cs:code start: mov ax,data ;*初始化 mov ds,ax mov ah, 0 mov al,00 int 10h ;* 定义一个宏显示display macro b ;*虚参 lea dx,b ;*偏移地址传送到dx mov ah,9 ;*dos 9号功能,多个字符输出到屏幕显示 int 21h endm address macro a,b ;*音乐地址宏lea si,a ;*歌曲频率地址a导入si将歌曲节拍导入bplea bp,ds:b ;*歌曲节拍地址b导入bpendm display info1 ;* 宏调用 display info2 display info3 display muslist input: mov ah,01h ;*dos 1号功能,从键盘输入一个字符 int 21h cmp al,q ;*al和q相减,影响标志位 jz retu cmp al,a ;*al和a相减,影响标志位 jnz b0 ;*zf标志为0,则转移,转到b0(说明不是a) address mus_freg1,mus_time1 ;*宏调用(玛丽有只小羊羔) call music jmp exit1 b0: cmp al,b jnz exit address mus_freg2,mus_time2 ;*(太湖船) call music exit1: display info4 jmp input exit: call clear display info4 display info1 display info2 display info3 display muslist jmp input retu: mov ah,4ch int 21h gensound proc near ;*发声 push ax push bx push cx push dx push di mov al,0b6h ;*8253初始化,10110110,通道1,读写16位,方式3 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 ;*打开扬声器wait1: mov cx,3314 call waitf delay1: dec bx jnz wait1 mov al,ah out 61h,al pop di pop dx pop cx pop bx pop ax ret gensound endp waitf proc near ;* 延时程序 push ax waitf1: in al,61h and al,10h cmp al,ah je waitf1 mov ah,al loop waitf1 pop ax ret waitf endp music proc near ;* 音乐播放 push ds sub ax,ax push ax freg: mov di,si cmp di,-1 ;*将-1定为该歌曲结束标 je end_mus mov bx,ds:bp call gensound add si,2 add bp,2 jmp freg end_mus: ret music endp clear proc near ;* clear! 清屏程序 push ax push bx push cx pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论