1、微机实验及课程设计课程设计报告电子琴姓 名: * 学 号: * 专 业: * 实 验 室: 电工电子实验中心 103 设计时间: 2009年 5 月 30日 2009年 6 月 4日评定成绩: 审阅教师: 目 录一实验简介3二基本设计思想3三程序流程和程序实现3四测试方案和测试结果10五分析与总结10一实验简介 目的: 检验和提高我在原理与接口综合应用方面分析问题与解决问题的能力,同时也给我提供更多、更好的训练机会。根据设计要求,尽可能完成设计要求的功能,选择最合适的器件,构成最有效的硬件电路来完成。 基本实验要求:构造一模拟/数字电子琴、选择利用实验仪扬声器/PC机内8253驱动内扬声器与键
2、盘1、2、3、4、5、6、7、8设计一个电子琴,通过按数字键响相应的乐符1、2、3、4、5、6、7、i,使能演奏简单的乐曲。按18数字键同时点亮相应的8个LED灯,使具有声、光效果;2、 利用实验仪DAC和喇叭,软件控制上述功能。选择机内还是实验仪由开关设置,课随时切换;3、在8*8点阵上表示音节高低;4、精确显示从第一个键按下后的时间(单位秒,要求精确到0.1秒,显示到秒)。 进一步设计要求:1.、能准确记录开始演奏到结束演奏的时间,在八段码上显示;2、 数字、模拟合奏,能同时指示音阶;3、自动录音,并具有回放功能(分两种水平、难易不等、即记录按键,同时记录按键和时间。 实现情况:实现基本实
3、验要求的13。二基本设计思想1、先分别设计机内电子琴和实验仪电子琴。机内电子琴参照实验五8253计数器/定时器的选做与探索中使用PC机内8253驱动声音接口;实验仪电子琴参照实验中演示实验的电子琴流程图;2、再把两者结合起来,用一个高低电平作开关控制是机内还是实验仪,可通过8255A口输入,判断10(二进制)则实验仪DAC,00则机内喇叭;3、点阵显示。根据输入的数字判断应显示点阵的哪一行。具体可先把点阵的8列全选通,输入为1某个数字时,判断显示相应的行;、LED灯显示。同样,根据输入的数字判断应显示哪一个LED灯。具体可设置8255B口为输出,根据输入的数字,输出控制LED灯相应灯亮。三程序
4、流程和程序实现1、机内电子琴开始流程图:键盘读入一个字符是ESC键吗?YNN返回DOS是数字18键吗?Y求出音阶值保存赋相应频率值延时程序:dseg segment freq dw 262,294,330,349,392,440,494,523 ;扬声器发声各频率值msg db Press 1,2,3,4,5,6,7,8,ESC:,0dh,0ah,$tim dw 400num db ?dseg endssseg segment stack dw 256 dup(?)sseg endscseg segment assume cs:cseg,ds:dsegstart: mov ax,dseg mo
5、v ds,ax mov dx,offset msg mov ah,9 int 21h ;显示提示信息sss: mov ah,7 int 21h ;等待从键盘接收字符,不回显al=asc码 cmp al,1bh je exit;若为ESC键,则转EXIT退出 cmp al,31h jl sss ;小于31h cmp al,38h ;大于38h jg sss ;不在1-8之间转sss sub al,31h mov num,al ;num求出相应的时间常数的序号jinei: mov al,num add al,al mov ah,00h mov si,axagain: mov di,freqsi m
6、ov bx,tim call gen jmp sssexit: mov ah,4ch int 21hgen proc near mov al,0b6h ;设置8253通道2方式3二进制计数 out 43h,al mov dx,12h mov ax,12928; DX AX=896*533h=18*65536+12928=1.19M div di out 42h,al ;8253通道2口设置初值 mov al,ah out 42h,al in al,61h ;读8255PB口 mov ah,al or al,3 out 61h,alwait1: mov cx,0hdelay3: mov ax,1
7、0 ;延时子程序delay2: nop dec ax jnz delay2 loop delay3 dec bx jnz wait1 mov al,ah out 61h,al retgen endp cseg endsend start2、实验仪电子琴流程图:实验电路:程序:data segmentioportequ 0d400h-0280hio8253aequ ioport+280hio8253bequ ioport+283hio8255aequ ioport+288hio8255bequ ioport+28bhio0832aequ ioport+290hdata1 db 80h,96h,0
8、aeh,0c5h,0d8h,0e9h,0f5h,0fdh db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h db 80h,66h,4eh,38h,25h,15h,09h,04h db 00h,04h,09h,15h,25h,38h,4eh,66h;正弦波数据time db 120,106,94,89,79,70,63,59;发不同音时8253的计数器初值msg db Press 1,2,3,4,5,6,7,8,ESC:,0dh,0ah,$num db ?;num为8253计数器初值的序号data endscode segment assume cs:code,
9、ds:datastart:mov ax,datamov ds,axmov dx,offset msgmov ah,9int 21h ;显示提示信息sss:mov ah,7int 21h ;从键盘接收字符,不回显cmp al,1bhje exit ;若为ESC键,则转EXITcmp al,31hjl ssscmp al,38hjg sss ;若不在1-8之间转ssssub al,31hmov num,al ;求出相应的时间常数的序号mov cx,60 ;取60次32个正弦波数据ddd:mov si,0lll:mov al,data1si ;取正弦波数据mov dx,io0832aout dx,a
10、l ;放音call delay ;调延时子程序inc sicmp si,32 ;是否取完32个数据jl lll ;若没有,则继续loop ddd ;总循环次数60是否完,没有,则继续jmp sssexit:mov ah,4chint 21hdelay proc near ;延时子程序ccc:mov bx,offset timemov dx,io8253b ;置8253通道0为方式0工作mov al,10hout dx,almov dx,io8255b ;设8255A口输入mov al,9bhout dx,almov al,num ;取相应的时间常数xlatmov dx,io8253aout d
11、x,al ;向8253通道0输出kkk:mov dx,io8255ain al,dx ;从8255A口读一字节test al,01 ;判PA0口是否为1jz kkk ;若不为1,则转KKKret ;子程序返回delay endpcode endsend start3.电子琴总设计流程图:开始键盘读入一个字符Y是ESC键吗?NN是数字18键吗?返回DOSY点亮点阵Y点亮LED灯N是机内吗?60个正弦波完了吗?YN求出音阶值保存正弦波个数计数器赋值60每个正弦波数据个数计数器赋初值取正弦波数据送DAC0832求出音阶值保存Y赋相应频率值一个正弦波完了吗?N延时延时电路图: 8个LED灯PB7PB0
12、 PA0PA1 CSCLK0GATE0 OUT0CS 8253 82551MHZ+5V DAC0832CS280H K0开关 288H 290H程序:data segmentioportequ 0c800h-0280hio8253aequ ioport+280h;8253通道0地址io8253bequ ioport+283h;8253控制字寄存器地址io8255aequ ioport+288h ;8255A口地址io8255bequ ioport+289h ;8255B口地址io8255dequ ioport+28bh;8255控制字寄存器地址io0832aequ ioport+290hpro
13、th equ ioport+2a8h ;点阵行选的地址protlr equ ioport+2b0h ;点阵列选的地址data1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h db 80h,66h,4eh,38h,25h,15h,09h,04h db 00h,04h,09h,15h,25h,38h,4eh,66h;正弦波数据time db 120,106,94,89,79,70,63,59;发不同音时8253的计数器初值banquan db 0dh,0ahdb*,0dh,0ah
14、db* *,0dh,0ahdb* WELCOME TO USE dianziqin *,0dh,0ahdb* THIS PROGRAMME IS DESIGHED BY *,0DH,0AHdb* zhouqiuping 61007204 *,0DH,0AHdb* *,0dh,0ahdb*,0dh,0ah db Press 1,2,3,4,5,6,7,8,ESC:,0dh,0ah,$num db ? ;num为8253计数器初值的序号freq dw 262,294,330,349,392,440,494,523 ;扬声器发声各频率值tim dw 400data endsstack segment
15、 stack dw 256 dup(?)stack endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,offset banquan ; 版权显示 mov ah,9 int 21h ;显示提示信息sss: mov ah,7 int 21h ;等待从键盘接收字符,不回显al=asc码 cmp al,1bh je exit ;若为ESC键,则转EXIT推出 cmp al,31h jl sss ;小于31h cmp al,38h ;大于38h jg sss ;不在1-8之间转sss sub al,31h
16、 mov num,al ;num求出相应的时间常数的序号dianzhen: mov al,0ffh ;点阵板的列全部选通 mov dx,proth out dx,al mov al,00000001 :点阵的行赋初值 shl al,num ;根据输入的数字,左移相应位数,即点阵亮相应行 mov num,al ;如输入3,则num为2,左移两位,第三行亮 mov dx,prothl out dx,alled: mov dx,io8255d mov al,99h ;设置8255A口入B口出 mov dx,io8255b out dx,num ;根据移位后的num点亮相应led灯kaiguan: m
17、ov dx,io8255a ;判断机内机外 in al,dx ;从8255B口读一字节 test al,10b ;判断PA0口是否为10(二进制) jz jiwai ;是的话转实验仪 jmp nei ;否则转机内;-jiwaijiwai:mov cx,60 ;取60次32个正弦波数据ddd:mov si,0lll:mov al,data1si ;取正弦波数据mov dx,io0832aout dx,al ;放音call delay ;调延时子程序inc sicmp si,32 ;是否取完32个数据jl lll ;若没有,则继续loop ddd ;总循环次数60是否完,没有,则继续jmp sss
18、exit: mov ah,4chint 21hdelay proc near ;延时子程序ccc: mov bx,offset timemov dx,io8253b ;置8253通道0为方式0工作mov al,10hout dx,almov al,num ;取相应的时间常数xlatmov dx,io8253aout dx,al ;向8253通道0输出kkk:mov dx,io8255ain al,dx ;从8255A口读一字节test al,01 ;判PA0口是否为1jz kkk ;若不为1,则转KKKret ;子程序返回delay endp;-机内部分jinei: mov al,num ad
19、d al,al mov ah,00h mov si,axagain: mov di,freqsi mov bx,tim call gen jmp sss gen proc near mov al,0b6h ;设置8253通道2方式3二进制计数 out 43h,al mov dx,12h mov ax,12928 ; DX AX=896*533h=18*65536+12928=1.19M div di out 42h,al ;8253通道2口设置初值 mov al,ah out 42h,al in al,61h ;读8255PB口 mov ah,al or al,3 out 61h,alwait
20、1: mov cx,0hdelay3: mov ax,10 ;延时子程序delay2: nop nop dec ax jnz delay2 loop delay3 dec bx jnz wait1 mov al,ah out 61h,al retgen endp code endsend start四测试方案和测试结果 测试方案 测试结果启动程序,出现按键提示,按下18键机内/实验仪发出相应的音阶同时led和点阵板亮相应的灯和行改变开关状态(可随时任意改变),按18键对应发出相应的音阶“弹琴”发出优美旋律按下ESC键退出程序 五分析与总结 问题分析:关于开关改变发声源为机内或机外和led灯的点
21、亮,原来想用前面学过的简单输入输出实验,用74LS273做输出,到led上驱动led灯亮;用74LS244做输入,把开关值输入控制发声源。后来发现这样很麻烦,虽然在程序上没有太繁杂,但是这样就加了两个地址,而且对于电路来说,就很复杂。因此,后来想到直接用8255做输入输出,设A口为输入,B口输出,这样用一个片子即可完成几个功能。 关于点亮点阵板,原来想将num逐个与07比较,来判断亮哪一行,后来这样写代码时比较繁杂,就改成移位来实现,给点阵的行赋初值00000001,然后再左移num位,即可亮相应的行。实验总结: 这次微机实验课程设计,使我对微机软硬件结合有了进一步的了解。原来并不太清楚是什么
22、意思,一直都很模糊,听课本也是很迷茫;而之前的那些单元实验,也没有都做好。之前做的实验,由于大部分是验证性的,所以就很被动地去做,甚至并没有想为什么要那样连电路,内部的代码更没有认真看。这次课程设计,因为要自己去设计整个过程,所以就不得不去了解学习自己原来并没有真正弄懂的东西。比如一些程序的代码的意思,汇编语言的逻辑,比如一些芯片的用途。使我对前面所做的实验有了原理性的了解,回头看一些实验,也知其然其所以然了。同时对课本上讲的一些内容,不再像以前那样觉得抽象,通过这次设计,有了具体的理解。 同时,我也知道了设计一个项目,应该如何下手。应该先对项目要求有个全面的了解,知道要做什么,然后根据要求所
23、要涉及到的知识我们要主动去摄取,结合自己已学过的,再对整体框架有个感知,心里有数后,进行设计。设计时用流程图,这很重要,这样整个思路就很清晰,而且是按照软硬件语言的逻辑顺序进行,就很方便。设计过程可以分模块,不要一开始就想把所有的功能都实现了,应该一个模块一个模块地实现,再总的连起来,实现最后的总模块。在每个模块设计时,尽量想到比较简单的设计,简化编程和电路,也可少出错。对微机是这样,对其他的像数字系统设计,也是一样的。 因此,我也觉得微机实验的这种形式的课程设计是很好也很有必要的。对我们对微机实验的理解有很大帮助。参考书目:【1】 杨素行微型计算机系统原理及应用,北京,清华大学出版社,2004年【2】 微机实验及课程设计教程(试用版2.0),东南大学微机系统与接口课程组,2009年2月