




免费预览已结束,剩余28页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学微机原理课程设计说明书课程设计任务书学生姓名: 专业班级: 电气0805班 指导教师: 工作单位: 自动化学院 题 目: 键盘电子乐器初始条件:掌握汇编语言程序设计方法,所设计的程序运行后可通过键盘控制,满足系统功能,并实现该系统设计方案。在dos,windows,汇编软件环境下运行。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.设计一个用键盘演奏音乐的程序,计时器系统设计编程定时输出电子音调,用pc机内部8253time使扬声器发声。用汇编语言对8253进行编程,使其out0上输出一定的频率,将其一定频率输出到喇叭上,演奏出不同的音节。pc机的数字键(17)作为电子音调的音调选择2. 课程设计说明书应包括:a)设计任务及要求b)方案比较及认证c)程序设计基本思想,程序流程图,部分源程序及注解d)调试记录及结果分析e)参考资料f)附录:全部源程序清单g)总结时间安排:2011年元月07日-元月09日 选题、查阅资料和方案设计2011年元月10日-元月14日 编程2011年元月15日-元月16日 调试程序,改进与提高2011年元月17日 撰写课程设计报告(有调试过程及结果的截屏)2011年元月18日 答辩和交课程设计报告指导教师签名: 2011 年 元 月 6 日系主任(或责任教师)签名: 年 月 日摘要利用pc上的定时/计数芯片8253a控制pc扬声器发声。编写内核模块,直接操作扬声器相关端口,或字符设备驱动,供应用程序调用,用键盘使其发出不同的声音。关键字:8253定时器中断目录1. 方案比较32.芯片介绍42.1 8255芯片简述42.1.1 8255三种方式下工作42.2 8253芯片简述52.2.1 8253六种工作方式53.通用发声程序74.音调与频率和时间的关系10附录12附录一:12附录二:13附录三:25附录四:26附录五:32参考文献33键盘电子乐器1. 方案比较1.1 发声程序循环优点:简单,易于思维缺点:程序过于长,比较繁琐1.2 调用宏,进行发声优点:程序短缺点:不易想到2.芯片介绍 2.1 8255芯片简述 图1-1 8255引脚图 8255可编程外围接口芯片是intel公司生产的通用并行i/o接口芯片,它具有a、b、c三个并行接口,+5v单电源供电。 2.1.1 8255三种方式下工作方式0基本输入/输出方式方式1选通输入/输出方式方式2双向选通输入/输出方式 2.1.2 8255引脚图如右图所示,各引脚功能如:d7d0与cpu侧连接的八条双向数据线;wr(低电平有效) 写输入信号;rd(低电平有效) 读输入信号;cs(低电平有效) 片选输入信号;a0、a1 片内寄存器选择输入信号;pa7pa0 a口外设双向数据线;pb7pb0 b口外设双向数据线;pc7pc0 c口外设双向数据线; reset 复位输入信号 2.1.3 8255端口地址寄存器a口b口c口控制寄存器端口地址60h61h62h63h 2.2 8253芯片简述 8253可编程定时/计数器是intel公司生产的通用外围芯片之一,有3个独立的十六位计数器,技术频率范围为02mhz,它所有的技术方式和操作方式都通过编程控制。图1-2 8253引脚图 2.2.1 8253六种工作方式方式0:计数结束中断方式1:可编程频率发生器方式2:频率发生器方式3:方波频率发生器方式4:软件触发的选通信号方式5:硬件触发的选通信号2.2.2 8253引脚图如上图所示,各引脚功能如下:d7d0 八条双向数据线;wr(低电平有效) 写输入信号;rd(低电平有效) 读输入信号;cs(低电平有效) 片选输入信号;a0、a1 片内寄存器地址输入信号;clk 计数输入,用于输入定时基准脉冲或计数脉冲;out 输出信号,以相应的电平指示计数的完成,或输出脉冲波形;gate 选通输入,用于启动或禁止计数器的操作,以使计数器和计测对象同步。2.2.3 8253端口地址寄存器0#计数器1#计数器2#计数器控制寄存器端口地址40h41h42h43h 本次课设要求用8253做。计算机中可以利用8253/54定时器来驱动扬声器。连接到扬声器上的是定时器2,gate2与端口61h的pb0相连,当pb0=1时,gate2获得高电平,使定时器2可以在模式3下工作。定时器2的out2与端口61h的pb1通过一个与门与扬声器的驱动电路相连。当pb1=1时,允许out2的输出信号到达扬声器电路。下面是控制扬声器的代码:inal,61h;get the current setting of port bmov ah,al;save itoral,00000011b;make pb0=1 and pb1=1out61h,al;turn the speaker on.;how long the beep sound goes heremoval,ah;get the original setting of port bout61h,al;turn off the speaker 对于ibm pc兼容机来说,无论是8086,80486还是pentium,驱动扬声器的过程是相同的。至于音调发出的时间量(音长),则取决于它的延迟的时间,这个延迟时间可以在pc机的80x86主处理器的帮助下实现。3.通用发声程序bios中的beep子程序能根据bx中给出的计数值控制8253/54定时器,产生频率为896hz的声音。实际上beep是一个很好的通用发声程序。首先,beep程序只能产生896hz的声音,通用发声程序应能产生任一频率的声音。其次beep产生声音的持续时间(音长)只能是.5s的倍数,我们希望声音的持续时间更易于调整,例如是10ms的倍数。给计数器2装入计数值533h就能产生896hz的声音(1.1931mhz/896hz=1331=533h),同样,产生其他频率声音的计数值也可以用下式计算出来: 假设发声频率存放在di寄存器中,下面的指令使ax中得到送往定时器2的计数值:movdx,12hmovax,348chdivdi利用cpu来产生延迟时间是最常用的一种方法,但对8088/86,80286,386,486以及pentium来说,它们产生的延迟时间都是不一样的。对基于8088/86的pc/xt,ps/2等pc机,可用下面的程序来产生时间延迟:movcx,ndelay:loopdelay在8088/86cpu中,执行一条loop指令需要17个时钟周期,因此,执行上面的指令大约需要n*17*t时钟周期。在bios中,利用上述方法来产生250ms延迟时间的程序如下:subcx,cxg7: loopg7;如果要产生与10ms成倍数的延迟时间,可在bx寄存器中放入倍数。例如,要产生1s的持续时间,则在bx中放入100,以控制loop指令执行次,也就是10ms的100倍。指令如下: movbx,100wait: movcx,2800delay: loopdelay decbx jnzwait上述流程图为:图2-1程序流程图下面在修改后的beep程序的基础上,为8088/86编写一个任一频率(由di指定)和任一持续时间(由cx和bx指定)的通用发声程序。此程序包括三个步骤:(1) 在8253/54中的43端口送一个控制字0b6h(10110110b),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。(2) 在在8253/54中的42端口(timer2)装入一个16位的计数值(533h*896/频率),以建立将要产生的声音频率。(3) 把输出端口61h的0/1两位置1,发出声音。gensound proc near ;*push ax push bx push cx push dx push di ;*mov al,0b6h;写8253的控制字 选中8253通道1读写16位工作方式3二进制计数方式 out 43h,al ;向8253中写入上述功能的控制字mov dx,12h ;假定发生频率存放在di寄存器中,下面的三行指令使ax中得到送往定时器2的计数值mov ax,348ch ;1193100hz/freqdiv di ;value of freqout 42h,al;将al中数放到8253计数器中 mov al,ah out 42h,al;将al中数放到8253计数器中 in al,61h;从61h号端口读取pb口现在的状态mov ah,al ;将pb口的状态放进ahor al,3 ;将al低两位置1out 61h,al;向61h号端口写入一个字节,打开扬声器wait1: mov cx,2000;3314 call waitf delay1: dec bx jnz wait1 mov al,ah ;recover value of port out 61h,al;从61h号端口读入一个字节;*pop di pop dx pop cx pop bx pop ax ;*ret gensound endpwaitf proc near push ax waitf1: in al,61h and al,10h ;check pb4cmp al,ah ;did it changeje waitf1 ;wait for changemov ah,al ;save the new pb4 statusloop waitf1 ;continue until cx becomes 0pop ax ret waitf endpgensound程序能产生1965536hz的声音,这个频率的下限19hz是使除法不产生溢出的最小的di值(dx)=12h=18d19)。其上限65536hz是多余的,因为人们最高能听到的音频约为20000hz。4.音调与频率和时间的关系 利用计算机控制发声的原理,可以编写演奏乐曲的程序。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。图3-1音频频率对照表组成乐曲的每个音符的频率值和持续时间是乐曲程序发生所需要的两个数据。音符的频率可以从图3-1中查表得到,但实际上送入计数器2的是输入频率1.1932mhz与音符频率相除的值,通用发声程序soundf的前半部分就是完成这个计算,并将计数值送入计数器2的功能。;mov al,0b6h;写8253的控制字 选中8253通道1读写16位工作方式3二进制计数方式 out 43h,al ;向8253中写入上述功能的控制字mov dx,12h ;假定发生频率存放在di寄存器中,下面的三行指令使ax中得到送往定时器2的计数值mov ax,348ch ;1193100hz/freqdiv di ;value of freqout 42h,al;将al中数放到8253计数器中 mov al,ah out 42h,al;将al中数放到8253计数器中 ;.附录附录一:程序一流程图附录二:程序一data segment para datainfo1 db 0dh,0ah,welcome you to come here!$info2 db 0dh,0ah,this is a piano program!$info3 db 0dh,0ah,please press!$info4 db 0dh,0ah,input error!$info5 db 0dh,0ah,please input again!$muslist db 0dh,0ah,1262 db 0dh,0ah,2294 db 0dh,0ah,3330 db 0dh,0ah,4347 db 0dh,0ah,5392 db 0dh,0ah,6440 db 0dh,0ah,7494 db 0dh,0ah,8524 db 0dh,0ah,$mus_freg1 dw 262,-1mus_time1 dw 50,25mus_freg2 dw 294,-1mus_time2 dw 50,25mus_freg3 dw 330,-1mus_time3 dw 50,25mus_freg4 dw 347,-1mus_time4 dw 50,25mus_freg5 dw 392,-1mus_time5 dw 50,25mus_freg6 dw 440,-1mus_time6 dw 50,25mus_freg7 dw 494,-1mus_time7 dw 50,25mus_freg8 dw 524,-1mus_time8 dw 50,25data endsstack segment para stack stack db 200 dup (stack)stack endscode segment assume ds:data,ss:stack,cs:codemain proc far mov ax,data mov ds,ax mov ah,0;设置显示方式 mov al,4;设置显示方式 int 10h;调用显示器中断 mov ah,0bh;设置背景颜色或彩色组 mov bh,0;设置背景颜色 mov bl,2;蓝色 int 10h;调用显示器中断 mov ah,0bh;设置背景颜色或彩色组 mov bh,01h;设置字体颜色 mov bl,1;黑色 int 10h;调用显示器中断;*定义一个宏*;功能09h功能描述:输出一个字符串到标准输出设备上。;如果输出操作被重定向,那么,将无法判断磁盘已满入口参数:ah09hds:dx待输出字符的地址;说明:待显示的字符串以$作为其结束标志show macro b lea dx,b mov ah,9 int 21h endm;* show info1;显示字符串 show info2;显示字符串 show info3;显示字符串 show muslist;显示字符串input: mov ah,01h;设置光标类型 int 21h;调用中断,返回dos cmp al,q;是否按下q jz retu;是则跳转,不是继续向下运行 cmp al,1;是否按下1 jnz b0;不是1跳转,是继续向下运行 call music1;跳转到music1程序 jmp exit1;跳转exit1b0: cmp al,2;是否按下2 jnz c0;不是2则跳转,是继续运行 call music2;调用 music2程序 jmp exit1;跳转到exit1c0: cmp al,3;是否按下3 jnz d0;不是3跳转,是继续运行 call music3;跳转到music3程序 jmp exit1d0: cmp al,4;是否按下4 jnz e0;不是4跳转,是继续运行 call music4;跳转到music4程序 jmp exit1 e0: cmp al,5;是否按下5 jnz f0;不是5跳转,是继续运行 call music5;跳转到music5程序 jmp exit1f0: cmp al,6;是否按下6 jnz g0;不是6跳转,是继续运行 call music6;跳转到music6程序 jmp exit1g0: cmp al,7;是否按下7 jnz h0;不是7跳转,是继续运行 call music7;跳转到music7程序 jmp exit1h0: cmp al,8;是否按下8 jnz exit;不是8跳转,是继续运行 call music8;跳转到music8程序exit1: show info5;显示字符 jmp input ;跳转到inputexit: call clear;跳转到clear show info4;显示字符 show info5;显示字符 show info1;显示字符 show info2;显示字符 show info3;显示字符 show muslist;显示字符 jmp input;跳转到inputretu: mov ah,4ch;带返回码返回 int 21h;调用dos中断main endp music1 proc near push ds sub ax,ax push ax lea si,mus_freg1;puts the freg table offset in si lea bp,ds:mus_time1;puts the time table offset in bpfreg1: mov di,si;read next frequency cmp di,-1;end of tone je end_mus1;if yes,exit mov dx,ds:bp;else,fetch the duration mov bx,5400 call gensound;play the note add si,2;update the table pointer add bp,2 jmp freg1 ;go process next noteend_mus1: retmusic1 endpgensound proc near push ax push bx push cx push dx push di mov al,0b6h;写8253的控制字 选中8253通道1读写16位工作方式3二进制计数方式 out 43h,al;向8253中写入上述功能的控制字 mov dx,12h mov ax,533h*896 div di out 42h,al;将al中数放到8253计数器中 mov al,ah out 42h,al;将al中数放到8253计数器中 in al,61h;从61h号端口读入一个字节 mov ah,al or al,3 out 61h,al;向61h号端口写入一个字节wait1: mov cx,8ff0h;向cx中写入数delay1: loop delay1;延时 dec bx;bx-1 jnz wait1;运算结果不为0,则zf=0,则转移 mov al,ah out 61h,al;从61h号端口读入一个字节 pop di pop dx pop cx pop bx pop ax retgensound endpmusic2 proc near push ds sub ax,ax push ax lea si,mus_freg2 lea bp,ds:mus_time2freg2: mov di,si cmp di,-1 je end_mus2 mov dx,ds:bp mov bx,1400 call gensound add si,2 add bp,2 jmp freg1end_mus2: retmusic2 endpmusic3 proc near push ds sub ax,ax push ax lea si,mus_freg3 lea bp,ds:mus_time3freg3: mov di,si cmp di,-1 je end_mus3 mov dx,ds:bp mov bx,1400 call gensound add si,2 add bp,2 jmp freg1end_mus3: retmusic3 endpmusic4 proc near push ds sub ax,ax push ax lea si,mus_freg4;puts the freg table offset in si lea bp,ds:mus_time4;puts the time table offset in bpfreg4: mov di,si;read next frequency cmp di,-1;end of tone je end_mus4;if yes,exit mov dx,ds:bp;else,fetch the duration mov bx,5400 call gensound;play the note add si,2;update the table pointer add bp,2 jmp freg4 ;go process next noteend_mus4: retmusic4 endpmusic5 proc near push ds sub ax,ax push ax lea si,mus_freg5;puts the freg table offset in si lea bp,ds:mus_time5;puts the time table offset in bpfreg5: mov di,si;read next frequency cmp di,-1;end of tone je end_mus5;if yes,exit mov dx,ds:bp;else,fetch the duration mov bx,5400 call gensound;play the note add si,2;update the table pointer add bp,2 jmp freg5 ;go process next noteend_mus5: retmusic5 endpmusic6 proc near push ds sub ax,ax push ax lea si,mus_freg6;puts the freg table offset in si lea bp,ds:mus_time6;puts the time table offset in bpfreg6: mov di,si;read next frequency cmp di,-1;end of tone je end_mus6;if yes,exit mov dx,ds:bp;else,fetch the duration mov bx,5400 call gensound;play the note add si,2;update the table pointer add bp,2 jmp freg6 ;go process next noteend_mus6: retmusic6 endpmusic7 proc near push ds sub ax,ax push ax lea si,mus_freg7;puts the freg table offset in si lea bp,ds:mus_time7;puts the time table offset in bpfreg7: mov di,si;read next frequency cmp di,-1;end of tone je end_mus7;if yes,exit mov dx,ds:bp;else,fetch the duration mov bx,5400 call gensound;play the note add si,2;update the table pointer add bp,2 jmp freg7 ;go process next noteend_mus7: retmusic7 endpmusic8 proc near push ds sub ax,ax push ax lea si,mus_freg8;puts the freg table offset in si lea bp,ds:mus_time8;puts the time table offset in bpfreg8: mov di,si;read next frequency cmp di,-1;end of tone je end_mus8;if yes,exit mov dx,ds:bp;else,fetch the duration mov bx,5400 call gensound;play the note add si,2;update the table pointer add bp,2 jmp freg8 ;go process next noteend_mus8: retmusic8 endpclear proc near push ax push bx push cx push dx mov ah,6;读当前光标位置设置 mov al,0;上滚行数 mov ch,0;上滚窗口左上角的行、列号 mov cl,0;上滚窗口左上角的行、列号 mov dh,24;上滚窗口右下角的行号 mov dl,79;上滚窗口右下角的列号 mov bh,7;空白行的属性 int 10h;调用显示器中断 pop dx pop cx pop bx pop ax retclear endpcode ends end main附录三:程序二流程图附录四:程序二data segment msg db 0dh,0ah, 1 2 3 4 5 6 7 db 0dh,0ah, q w e r t y u db 0dh,0ah, a s d f g h j db 0dh,0ah,_ db 0dh,0ah,9: exit db 0dh,0ah,_,$ ;*音调*后面用到-1判断音乐播是否放完 sound_0 dw -1;sound_0 dw -1 sound_11 dw 131,-1;sound_11 dw 441,-1 sound_12 dw 147,-1;sound_12 dw 495,-1 sound_13 dw 165,-1;sound_13 dw 556,-1 sound_14 dw 175,-1;sound_14 dw 589,-1 sound_15 dw 196,-1;sound_15 dw 661,-1 sound_16 dw 220,-1;sound_16 dw 742,-1 sound_17 dw 247,-1;sound_17 dw 833,-1 sound_21 dw 524,-1 sound_22 dw 588,-1 sound_23 dw 660,-1 sound_24 dw 698,-1 sound_25 dw 784,-1 sound_26 dw 880,-1 sound_27 dw 988,-1 sound_1 dw 262,-1;sound_1 dw 882,-1 sound_2 dw 294,-1;sound_2 dw 990,-1 sound_3 dw 330,-1;sound_3 dw 1112,-1 sound_4 dw 349,-1;sound_4 dw 1178,-1 sound_5 dw 392,-1;sound_5 dw 1322,-1 sound_6 dw 440,-1;sound_6 dw 1484,-1 sound_7 dw 492,-1;sound_7 dw 1655,-1 time dw 10;time dw 50data ends ;*stack segment db 200 dup (stack) stack ends ;*code segment assume ds:data,ss:stack,cs:code start: mov ax,data mov ds,ax mov ah,00h ;设置显示方式 mov al,12h;设置显示方式 int 10h;调用显示器中断8;*定义一个宏* ;功能09h功能描述:输出一个字符串到标准输出设备上。;如果输出操作被重定向,那么,将无法判断磁盘已满入口参数:ah09hds:dx待输出字符的地址;说明:待显示的字符串以$作为其结束标志show macro b lea dx,b mov ah,9 int 21h endm;*一个声音宏*onesound macro soundis,jumpis,letteris cmp al,letteris jnz jumpis lea si,soundis lea bp,ds:time call music jmp input endmshow msginput: mov ah,01h;设置光标类型 int 21h ;调用中断,返回dos cmp al,9;是否按下9 jnz go;按下9则转移 mov ah,4ch;带返回码结束 int 21h;调用dos中断go: onesound sound_11,a0,a;q调用宏a0: onesound sound_12,b0,s;w调用宏b0: onesound sound_13,c0,d;e调用宏c0: onesound sound_14,d0,f;r调用宏d0: onesound sound_15,e0,g;t调用宏e0: onesound sound_16,f0,h;y调用宏f0: onesound sound_17,g0,j;u调用宏g0: onesound sound_1,h0,q;1调用宏h0: onesound sound_2,i0,w;2调用宏i0: onesound sound_3,j0,e;3调用宏j0: onesound sound_4,k0,r;4调用宏k0: onesound sound_5,l0,t;5调用宏l0: onesound sound_6,m0,y;6调用宏m0: onesound sound_7,n0,u;7调用宏n0:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024江西省共青城市中考物理预测复习附答案详解【预热题】
- 2023年度广播电视播音员主持人全真模拟模拟题附参考答案详解【轻巧夺冠】
- 老旧街区综合管廊建设与管理方案
- 高校税务人才培养的挑战与应对策略
- 2023年度粮油食品检验人员考试彩蛋押题及参考答案详解(新)
- 康复医学治疗技术副高级职称通关题库附答案详解(模拟题)
- 新工科课程中的思政教学路径研究
- 2024冶金工业技能鉴定高频难、易错点题附答案详解(模拟题)
- 5万千瓦风电项目实施方案
- 2024年安全员考试自我提分评估带答案详解(研优卷)
- MySQL数据库PPT完整全套教学课件
- 2023年浙江台州温岭市禁毒办招聘禁毒社工笔试备考题库及答案解析
- 2023主题学习教育知识点总结归纳(应知应会手册)
- 铜陵市绿阳建材有限责任公司《60 万吨-年磷石膏综合利用技术改造项目》环境影响报告
- 检验标本的采集
- 二氧化碳气体保护焊培训
- 生理学第九章 感觉器官的功能
- 五年级上册美术课件-15 造型别致的椅子|人美版
- YY/T 1269-2015血液透析和相关治疗用水处理设备常规控制要求
- YS/T 285-2012铝电解用预焙阳极
- GB/T 7307-200155°非密封管螺纹
评论
0/150
提交评论