电子琴的微机原理设计方案Word格式.docx
- 文档编号:21734069
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:32
- 大小:222.20KB
电子琴的微机原理设计方案Word格式.docx
《电子琴的微机原理设计方案Word格式.docx》由会员分享,可在线阅读,更多相关《电子琴的微机原理设计方案Word格式.docx(32页珍藏版)》请在冰豆网上搜索。
本系统由键盘矩阵、LED显示管、扬声器这几个部分组成,LED显示管显示当前按键,扬声器发出对应音符。
硬件总体设计图如下:
图3
2.3存储器模块:
8088有1MB存储空间,系统提供用户使用的空间为00000H-0FFFFH,用于存放、调试实验程序。
具体分配如下:
2.3.1存贮器地址分配
表2-1存贮器地址分配
2.3.2I/O地址分配
表2-2I/O地址分配
(一)
表2-3I/O地址分配
(二)
监控占用00004H-0000FH作为单步(T)、断点(INT3)、无条件暂停(NMI)中断矢量区,用户也可以更改这些矢量,指向用户的处理,但失去了相应的单步、断点、暂停等监控功能。
F0000H-FFFFFH监控程序区系统占用。
2.4键盘输入模块:
在P.2口十连有8个按键并加有8个拉电阻.它们一端接5伏电源,一端接地.在仿真时,只要有一个键被按下,并被单片机扫描到,则会使播放器发出声音.
图4
2.5输出驱动模块:
2.5.1子系统(模块)一
LED显示模块如图2-2所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个七段数码管的a-h的笔段上,数码管的公共端接电源。
矩阵扫描显示当前按键模块如下:
图5
2.5.2子系统(模块)二
矩阵扫描扬声器发出对应音符模块如下:
图6
第三章应用软件的设计
应用系统中任务的实现,最终是靠程序的执行来完成的。
应用软件设计的好坏,将决定系统的效率和它的优劣。
应用软件的设计依据是使用流程。
根据使用流程可以确定系统的控制流程和软件模块。
根据顺序控制器的操作流程可以确定,本系统软件主要由4个模块构成:
主程序,编程控制模块,运行控制模块和定时器中断服务模块。
3.1主程序
主程序的任务首先是进行初始化,然后根据“编程/运行”开关的状态判别,进入“编程状态”或“运行状态”。
根据主程序的操作流程,可以确定主程序的控制流程如图
主程序流程图
N
N
Y
Y
图7
主要程序:
MAIN:
MOVSP,#60H;
初始化堆栈指针
MOV30H,#00;
定时器初值清零
MOV31H,#00
MOVP1,#0FFH;
设置P1口为输入模式
MOVTOMD,#01H;
设置定时器0为工作模式1
SETBET0;
开定时器0中断
SETBEA;
开总中断
CLRTR0;
关闭定时器0
3.2编程控制模块
根据编程状态的操作流程,可以确定编程操作的控制流程如图
图8电子琴程序流程图
OUTBITequ0FE02h
INequ0FE00h
Pulseequ0
PulseCNTequ50h
ToneHighequ51h
ToneLowequ52h
SpeakerequP1.0
000002008EljmpStart
org000bh
Timer0Int:
000BC0D0pushPSW
000DC28CclrTR0
000F85518CmovTH0,ToneHigh
001285528AmovTL0,ToneLow
0015D28CsetbTR0
0017A200movc,Pulse
00199290movSpeaker,c
001BB200cplPulse
001D1550decPulseCNT
001FD0D0popPSW
002132reti
ToneTable:
0022FC42
0024FCAE
0026FD0A
0028FD35
002AFD82
002CFDC8
002EFE05dw64578,64686,64778,64821,64898,64968,65029
TestKey:
003090FE02movdptr,#OUTBIT
00337400mova,#0
0035F0movxdptr,a
003690FE00movdptr,#IN
0039E0movxa,dptr
003AF4cpla
003B540Fanla,#0fh
003D22ret
KeyTable:
003E161514
0041FFdb16h,15h,14h,0ffh
0042131211
004510db13h,12h,11h,10h
00460D0C0B
00490Adb0dh,0ch,0bh,0ah
004A0E0306
004D09db0eh,03h,06h,09h
004E0F0205
005108db0fh,02h,05h,08h
0052000104
005507db00h,01h,04h,07h
GetKey:
005690FE02movdptr,#OUTBIT
00598583A0movP2,dph
005C7800movr0,#Low(IN)
005E7920movr1,#00100000b
00607A06movr2,#6
KLoop:
0062E9mova,r1
0063F4cpla
0064F0movxdptr,a
0065F4cpla
006603rra
0067F9movr1,a
0068E2movxa,r0
0069F4cpla
006A540Fanla,#0fh
006C7006jnzGoon1
006EDAF2djnzr2,KLoop
00707AFFmovr2,#0ffh
0072800FsjmpExit
Goon1:
0074F9movr1,a
0075EAmova,r2
007614deca
007723rla
007823rla
0079FAmovr2,a;
r2=(r2-1)*4
007AE9mova,r1
007B7904movr1,#4
LoopC:
007D13rrca
007E4003jcExit
00800Aincr2
0081D9FAdjnzr1,LoopC
Exit:
008390FE02movdptr,#OUTBIT
0086E4clra
0087F0movxdptr,a
0088EAmova,r2
008990003Emovdptr,#KeyTable
008C93movca,a+dptr
008D22ret
Start:
008E758170movsp,#70h
0091758901movTMOD,#01;
Timer
009475A882movIE,#82h;
EA=1,IT0=1
MLoop:
00971130callTestKey
009960FCjzMLoop
009B1156callGetKey
009DF5F0movb,a
009F60F6jzMLoop;
=0,<
1
00A154F8anla,#!
7
00A370F2jnzMLoop;
>
7
00A515F0decb
00A7E5F0mova,b
00A923rla;
a=a*2
00AAF5F0movb,a
00AC900022movdptr,#ToneTable
00AF93movca,a+dptr
00B0F551movToneHigh,a
00B2F58CmovTH0,a
00B4E5F0mova,b
00B604inca
00B793movca,a+dptr
00B8F552movToneLow,a
00BAF58AmovTL0,a
00BCD28CsetbTR0
00BE755064movPulseCNT,#100
Wait:
00C1E550mova,PulseCNT
00C370FCjnzWait
00C5C28CclrTR0
00C7020097ljmpMLoop
end
3.3运行控制模块
根据运行状态的操作流程,可以确定运行操作的控制流程如图
图9
程序:
datasegment
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
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的计数器初值
banquandb0dh,0ah
db'
*************************************************'
0dh,0ah
**
**'
**WELCOMETOUSE
dianziqin**'
**THISPROGRAMMEIS
DESIGHEDBY**'
0DH,0AH
**zhouqiuping61007204
**'
Press1,2,3,4,5,6,7,8,ESC:
'
0dh,0ah,'
$'
numdb?
;
num为8253计数器初值的序号
freqdw262,294,330,349,392,440,494,523;
扬声器发声各频率值
timdw400
dataends
stacksegmentstack
dw256dup(?
stackends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,offsetbanquan;
显示
movah,9
int21h;
显示提示信息
sss:
movah,7
等待从键盘接收字符,不回显al=asc码
cmpal,1bh
jeexit;
若为ESC键,则转EXIT推出
cmpal,31h
jlsss;
小于31h
cmpal,38h;
大于38h
jgsss;
不在'
1'
-'
8'
之间转sss
subal,31h
movnum,al;
num求出相应的时间常数的序号
dianzhen:
moval,0ffh;
点阵板的列全部选通
movdx,proth
outdx,al
moval,00000001:
点阵的行赋初值
shlal,num;
根据输入的数字,左移相应位数,即点阵亮相应行
如输入3,则num为2,左移两位,第三行亮
movdx,prothl
led:
movdx,io8255d
moval,99h;
设置8255A口入B口出
movdx,io8255b
outdx,num;
根据移位后的num点亮相应led灯
kaiguan:
movdx,io8255a;
判断机机外
inal,dx;
从8255B口读一字节
testal,10b;
判断PA0口是否为10(二进制)
jzjiwai;
是的话转实验仪
jmpnei;
否则转机
---------------------------------jiwai
jiwai:
movcx,60;
取60次32个正弦波数据
ddd:
movsi,0
lll:
moval,data1[si];
取正弦波数据
movdx,io0832a
outdx,al;
放音
calldelay;
调延时子程序
incsi
cmpsi,32;
是否取完32个数据
jllll;
若没有,则继续
loopddd;
总循环次数60是否完,没有,则继续
jmpsss
exit:
movah,4ch
int21h
delayprocnear;
延时子程序
ccc:
movbx,offsettime
movdx,io8253b;
置8253通道0为方式0工作
moval,10h
moval,num;
取相应的时间常数
xlat
movdx,io8253a
向8253通道0输出
kkk:
movdx,io8255a
从8255A口读一字节
testal,01;
判PA0口是否为1
jzkkk;
若不为1,则转KKK
ret;
子程序返回
delayendp
-------------------------------------机部分
jinei:
moval,num
addal,al
movah,00h
movsi,ax
again:
movdi,freq[si]
movbx,tim
callgen
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
ret
genendp
codeends
endstart
3.4定时器中断服务模块
定时器子程序图如图2.7所示。
图10
3.5硬件调试与软件调试
3.5.1硬件调试
1)断电调试:
为了安全,首先进行断电调试,用万用表检测系统是否有短路现象,再检查严接线是否正确。
经检测,接线正确也没有短路现象。
2)通电调试:
第一,检查系统是否正常。
第二,检查数码显示是否乱码。
在通电调试过程中,经检查系统正常;
数码管显示乱码,查明原因为8255A芯片B输出端口与数码管输入端口接线时接反了,经改正后检查没有出现新的问题。
3.5.2软件调试
输入程序并检查无误,经汇编、连接后加载装入系统运行,观察现象。
发现倒计时器只能运行一次而不能循环(即程序倒计时到0后无法继续循环倒计时),经检查发现程序结束前掉了一条跳转指令。
经修改后,再进行编译并加载,运行程序,结果显示正常并实现了循环功能,经调试三个开关发现开关实现功能正常。
3.5.3调试过程
让8255的口工作在方式一输入状态下,B口接在试验箱上的八个拨码开关上,把拨码开关的电平信号传送到8255的输出口,CPU取走的8255输出口的信号送到8253,8253工作在工作方式3,方波放生气。
这样通过送不同的数据时8253发出不同频率的方波信号,不同频率的方波信号就会驱动发生器发出不同频率的声响。
3.6测试方案和测试结果
测试方案
测试结果
启动程序,出现按键提示,按下1~8键
机/实验仪发出相应的音阶
同时led和点阵板亮相应的灯和行
改变开关状态(可随时任意改变),按1~8键
对应发出相应的音阶
“弹琴”
发出优美旋律
按下ESC键
退出程序
表3-1
小结
通过这次课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。
原本微型计算机接口技术就是计算机科学与技术专业的一门核心课程,是突出计算机应用的一门课程。
根据自己所学的知识,来完成本次微型计算机课程设计的容。
本次课程设计主要是设计一个电子琴,要求用键盘输入1、2、3、4、5、6、7按键,产生不同频率的声音,来模拟电子琴发出音阶乐谱。
要发出声音,要用芯片实现,首先想到的是课堂上学过的8253定时/计数器它可以发出一定频率的声音。
有七音阶个频率,就对应有七个计数初值,通过调用不同的程序,来完成每一次按键所对应频率的计数初值,进而实现不同的声音。
要产生频率,就用到脉冲发生器、分频器;
产生音质好、播放出来声音,就用到音频功效模块。
各个模块进行相应的连接,来实现电子琴的功能。
这次微机实验课程设计,使我对微机软硬件结合有了进一步的了解。
原来并不太清楚是什么意思,一直都很模糊,听课本也是很迷茫;
而之前的那些单元实验,也没有都做好。
之前做的实验,由于大部分是验证性的,所以就很被动地去做,甚至并没有想为什么要那样连电路,部的代码更没有认真看。
这次课程设计,因为要自己去设计整个过程,所以就不得不去了解学习自己原来并没有真正弄懂的东西。
比如一些程序的代码的意思,汇编语言的逻辑,比如一些芯片的用途。
使我对前面所做的实验有了原理性的了解,回头看一些实验,也知其然其所以然了。
同时对课本上讲的一些容,不再像以前那样觉得抽象,通过这次设计,有了具体的理解。
经过我长时间的设计及调试,本系统基本能实现按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放对应的音符。
但由于仿真系统原因,本设计音频效果不是很好。
不足之处有:
1.可弹奏的音符数较少,只能在一定围满足用户需要。
可通过改进键盘识别模块和发生模块来增加其复杂度2.音量不可调。
在这为期一周的课程设计中,我深刻明白了理论知识与社会实践相结合的道理,从中得到了以前书本知识所不曾得到的知识,更加明白了如今信息时代电子技能知识的重要性。
同时我对自己的动手能力有了信心,这次的课程设计我感觉很完美,我会利用这次机会再努力的提高自己。
编写程序的过程中,我遇到了很多的问题。
在此我特别要感帮助我的老师们,特别是老师,没有他们,我就不能完成这个课程设计,是他们不厌其烦地帮我讲解。
经过这个课程设计,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试过,就肯定学到了不少东西。
这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子琴 微机 原理 设计方案