微机课程设计电子琴Word格式文档下载.docx
《微机课程设计电子琴Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《微机课程设计电子琴Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
2、数字、模拟合奏,能同时指示音阶;
3、自动录音,并具有回放功能(分两种水平、难易不等、即记录按键,同时记录按键和时间。
实现情况:
实现基本实验要求的1~3。
二.基本设计思想
1、先分别设计机内电子琴和实验仪电子琴。
机内电子琴参照实验五8253计数器/定时器的选做与探索中使用PC机内8253驱动声音接口;
实验仪电子琴参照实验中演示实验的电子琴流程图;
2、再把两者结合起来,用一个高低电平作开关控制是机内还是实验仪,可通过8255A口输入,判断10(二进制)则实验仪DAC,00则机内喇叭;
3、点阵显示。
根据输入的数字判断应显示点阵的哪一行。
具体可先把点阵的8列全选通,输入为1~8某个数字时,判断显示相应的行;
4、LED灯显示。
同样,根据输入的数字判断应显示哪一个LED灯。
具体可设置8255B口为输出,根据输入的数字,输出控制LED灯相应灯亮。
三.程序流程和程序实现
1、机内电子琴
流程图:
程序:
dsegsegment
freqdw262,294,330,349,392,440,494,523
;
扬声器发声各频率值
msgdb'
Press1,2,3,4,5,6,7,8,ESC:
'
0dh,0ah,'
$'
timdw400
numdb?
dsegends
ssegsegmentstack
dw256dup(?
)
ssegends
csegsegment
assumecs:
cseg,ds:
dseg
start:
movax,dseg
movds,ax
movdx,offsetmsg
movah,9
int21h;
显示提示信息
sss:
movah,7
int21h
;
等待从键盘接收字符,不回显al=asc码
cmpal,1bh
jeexit;
若为ESC键,则转EXIT退出
cmpal,31h
jlsss;
小于31h
cmpal,38h;
大于38h
jgsss;
不在'
1'
-'
8'
之间转sss
subal,31h
movnum,al;
num求出相应的时间常数的序号
jinei:
moval,num
addal,al
movah,00h
movsi,ax
again:
movdi,freq[si]
movbx,tim
callgen
jmpsss
exit:
movah,4ch
int21h
genprocnear
moval,0b6h;
设置8253通道2方式3二进制计数
out43h,al
movdx,12h
movax,12928
DXAX=896*533h=18*65536+12928=1.19M
divdi
out42h,al;
8253通道2口设置初值
moval,ah
out42h,al
inal,61h;
读8255PB口
movah,al
oral,3
out61h,al
wait1:
movcx,0h
delay3:
movax,10;
延时子程序
delay2:
nop
decax
jnzdelay2
loopdelay3
decbx
jnzwait1
out61h,al
ret
genendp
csegends
endstart
2、实验仪电子琴
实验电路:
datasegment
ioportequ0d400h-0280h
io8253aequioport+280h
io8253bequioport+283h
io8255aequioport+288h
io8255bequioport+28bh
io0832aequioport+290h
data1db80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db80h,66h,4eh,38h,25h,15h,09h,04h
db00h,04h,09h,15h,25h,38h,4eh,66h;
正弦波数据
timedb120,106,94,89,79,70,63,59;
发不同音时8253的计数器初值
num为8253计数器初值的序号
dataends
codesegment
code,ds:
data
movax,data
从键盘接收字符,不回显
jeexit;
若为ESC键,则转EXIT
jlsss
cmpal,38h
若不在'
求出相应的时间常数的序号
movcx,60;
取60次32个正弦波数据
ddd:
movsi,0
lll:
moval,data1[si];
取正弦波数据
movdx,io0832a
outdx,al;
放音
calldelay;
调延时子程序
incsi
cmpsi,32;
是否取完32个数据
jllll;
若没有,则继续
loopddd;
总循环次数60是否完,没有,则继续
int21h
delayprocnear;
ccc:
movbx,offsettime
movdx,io8253b;
置8253通道0为方式0工作
moval,10h
outdx,al
movdx,io8255b;
设8255A口输入
moval,9bh
moval,num;
取相应的时间常数
xlat
movdx,io8253a
向8253通道0输出
kkk:
movdx,io8255a
inal,dx;
从8255A口读一字节
testal,01;
判PA0口是否为1
jzkkk;
若不为1,则转KKK
ret;
子程序返回
delayendp
codeends
3.电子琴总设计
电路图:
8个LED灯
82538255
1MHZ
+5V
DAC0832
280H
K0开关288H
290H
ioportequ0c800h-0280h
io8253aequioport+280h;
8253通道0地址
io8253bequioport+283h;
8253控制字寄存器地址
io8255aequioport+288h;
8255A口地址
io8255bequioport+289h;
8255B口地址
io8255dequioport+28bh;
8255控制字寄存器地址
io0832aequioport+290h
prothequioport+2a8h;
点阵行选的地址
protlrequioport+2b0h;
点阵列选的地址
data1db80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db00h,04h,09h,15h,25h,38h,4eh,66h
timedb120,106,94,89,79,70,63,59
banquandb0dh,0ah
db'
*************************************************'
0dh,0ah
**
**'
**WELETOUSE
dianziqin**'
**THISPROGRAMMEIS
DESIGHEDBY**'
0DH,0AH
**zhouqiuping61007204
**'
**
Press1,2,3,4,5,6,7,8,ESC:
freqdw262,294,330,349,392,440,494,523;
stacksegmentstack
stackends
movdx,offsetbanquan;
显示
若为ESC键,则转EXIT推出
dianzhen:
moval,0ffh;
点阵板的列全部选通
movdx,proth
moval,00000001:
点阵的行赋初值
shlal,num;
根据输入的数字,左移相应位数,即点阵亮相应行
movnum,al;
如输入3,则num为2,左移两位,第三行亮
movdx,prothl
led:
movdx,io8255d
moval,99h;
设置8255A口入B口出
movdx,io8255b
outdx,num;
根据移位后的num点亮相应led灯
kaiguan:
movdx,io8255a;
判断机内机外
从8255B口读一字节
testal,10b;
判断PA0口是否为10(二进制)
jzjiwai;
是的话转实验仪
jmpnei;
否则转机内
---------------------------------jiwai
jiwai:
movdx,io0832a
movdx,io8253b;
ret;
-------------------------------------机内部分
genprocnear
moval,0b6h;
out43h,al
movax,12928
DXAX=896*533h=18*65536+12928=1.19M
divdi
out42h,al
codeends
四.测试方案和测试结果
测试方案
测试结果
启动程序,出现按键提示,按下1~8键
机内/实验仪发出相应的音阶
同时led和点阵板亮相应的灯和行
改变开关状态(可随时任意改变),按1~8键
对应发出相应的音阶
“弹琴”
发出优美旋律
按下ESC键
退出程序
五.分析与总结
问题分析:
关于开关改变发声源为机内或机外和led灯的点亮,原来想用前面学过的简单输入输出实验,用74LS273做输出,到led上驱动led灯亮;
用74LS244做输入,把开关值输入控制发声源。
后来发现这样很麻烦,虽然在程序上没有太繁杂,但是这样就加了两个地址,而且对于电路来说,就很复杂。
因此,后来想到直接用8255做输入输出,设A口为输入,B口输出,这样用一个片子即可完成几个功能。
关于点亮点阵板,原来想将num逐个与0~7比较,来判断亮哪一行,后来这样写代码时比较繁杂,就改成移位来实现,给点阵的行赋初值00000001,然后再左移num位,即可亮相应的行。
实验总结:
这次微机实验课程设计,使我对微机软硬件结合有了进一步的了解。
原来并不太清楚是什么意思,一直都很模糊,听课本也是很迷茫;
而之前的那些单元实验,也没有都做好。
之前做的实验,由于大部分是验证性的,所以就很被动地去做,甚至并没有想为什么要那样连电路,内部的代码更没有认真看。
这次课程设计,因为要自己去设计整个过程,所以就不得不去了解学习自己原来并没有真正弄懂的东西。
比如一些程序的代码的意思,汇编语言的逻辑,比如一些芯片的用途。
使我对前面所做的实验有了原理性的了解,回头看一些实验,也知其然其所以然了。
同时对课本上讲的一些内容,不再像以前那样觉得抽象,通过这次设计,有了具体的理解。
同时,我也知道了设计一个项目,应该如何下手。
应该先对项目要求有个全面的了解,知道要做什么,然后根据要求所要涉及到的知识我们要主动去摄取,结合自己已学过的,再对整体框架有个感知,心里有数后,进行设计。
设计时用流程图,这很重要,这样整个思路就很清晰,而且是按照软硬件语言的逻辑顺序进行,就很方便。
设计过程可以分模块,不要一开始就想把所有的功能都实现了,应该一个模块一个模块地实现,再总的连起来,实现最后的总模块。
在每个模块设计时,尽量想到比较简单的设计,简化编程和电路,也可少出错。
对微机是这样,对其他的像数字系统设计,也是一样的。
因此,我也觉得微机实验的这种形式的课程设计是很好也很有必要的。
对我们对微机实验的理解有很大帮助。
参考书目:
【1】杨素行《微型计算机系统原理及应用》,,清华大学,2004年
【2】微机实验及课程设计教程(试用版2.0),东南大学《微机系统与接口》课程组,2009年2月