电子琴 二.docx
《电子琴 二.docx》由会员分享,可在线阅读,更多相关《电子琴 二.docx(21页珍藏版)》请在冰豆网上搜索。
电子琴二
一、设计内容
编写一实现电子琴的程序,并实现若干扩展功能。
基本功能:
用键盘输入对应的七个音阶,通过实验箱的喇叭发出声音,并通过七段数码管显示输入音阶;
扩展功能:
1、在程序中可预设多首曲目,按一键可以进入预设子菜单,对要播放的曲目进行选择,并实现播放该曲目。
2、程序运行时有友好的用户介面。
3.当弹奏不同音阶时,双色点阵LED显示器显示不同的图案
二、元件与仪器
1.计时器8253
2.并行控制器8255A
3.实验台
三、设计原理、思路及流程图
1、设计原理
(1)对于一个特定的D/A转换接口电路,CPU执行一条输出指令将数据送入D/A,即可在其输出端得到一定的电压输出。
给D/A转换器输入按正弦规律变化的数据,在其输出端即可产生正弦波。
对于音乐,每个音阶都有确定的频率。
各音阶标称频率值:
(2)产生一个正弦波的数据可取32个(小于亦可),不同频率的区别,可通过调节向D/A转换器输出数据的时间间隔,例如:
发"1"频率为261。
1HZ,周期为1/261.1=3.83ms,输出数据的时间间隔为3.83ms/32=0.12ms.定时时间可以由8253配合8255来实现。
按下某键后发音时间的长短可以由发出的正弦波的个数多少来控制。
本程序中设置默认长度为60个正弦波。
(3)实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
(4)点阵LED显示器是将许多LED类似矩阵一样排列在一起组成的显示器件,双色点阵LED是在每一个点阵的位置上有红绿或红黄或红白两种不同颜色的发光二极管。
当微机输出的控制信号使得点阵中有些LED发光,有些不发光,即可显示出特定的信息,包括汉字、图形等。
车站广场由微机控制的点阵LED大屏幕广告宣传牌随处可见。
(5)实验仪上设有一个共阳极8×8点阵的红黄两色LED显示器,其点阵结构如图所示。
该点阵对外引出24条线,其中8条行线,8条红色列线,8条黄色列线。
若使某一种颜色、某一个LED发光,只要将与其相连的行线加高电平,列线加低电平即可。
例如欲显示汉字“年”,采用逐列循环发光。
首先由“年”的点阵轮廓,确定点阵代码(如图所示)根据“年”的点阵代码,确定逐列循环发光的顺序如下:
①行代码输出44H;红色列代码输01H;第一列2个红色LED发光。
②行代码输出54H;红色列代码输02H;第二列3个红色LED发光。
③行代码输出54H;红色列代码输04H;第三列3个红色LED发光。
④行代码输出7FH;红色列代码输08H;第四列7个红色LED发光。
⑤行代码输出54H;红色列代码输10H;第五列3个红色LED发光。
⑥行代码输出DCH;红色列代码输20H;第六列5个红色LED发光。
⑦行代码输出44H;红色列代码输40H;第七列2个红色LED发光。
⑧行代码输出24H;红色列代码输80H;第八列2个红色LED发光。
2、电路连接图如下:
(1)8253和8255连接如下
(2).实验仪上的点阵LED及驱动电路的行代码、红色列代码、黄色列代码各用一片74LS273锁存。
行代码输出的数据通过行驱动器7407加至点阵的8条行线上,红和黄列代码的输出数据通过驱动器DS75452反相后分别加至红和黄的列线上。
行锁存器片选信号为CS1,红色列锁存器片选信号为CS2,黄色列锁存器片选信号为CS3。
分别接上298h,2a0h,2a8h.
3.设计思路
在本次课程设计中,根据复杂程序设计思想——模块化程序设计,分析和确定程序总体设计目标:
电子琴基本功能及部分扩展功能后,将总体目标划分为若干模块(子程序,具体可见下)。
程序设计的思路按以下顺序进行:
1.分析与确定程序总体设计目标
2.将总体目标划分为若干模块
3.定义每个模块的具体任务,明确它与其他模块间的通信方式
4.编写源程序,进行调试,包括:
简单电子琴主程序
结合实验指导书的两程序,将其分为若干个子程序,实现简单的播放和显示音阶的功能。
发音子程序
本子程序实现放音功能。
首先从键盘读出键码,判断,如果键码不是1-8(9除外)即仍然处于音阶输入准备状态,如果是,即求出相应的时间常数的序号,取60次32个正弦波数据,播放32个数据,组成一个正弦波。
播放60次后,然后判断是否有按键,如果有就进入死循环,直到下次按键为止。
放歌子程序
本子程序实现播放预置在程序中的歌曲,并加上一个选择子程序段,可通过选择进入不同曲目,进而实现播放不同的歌曲,播放时直接调用放音子程序
Led显示子程序
本程序实现从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。
显示广告版子程序
本子程序实现在广告板上在输入不同音阶时有我们自行设计的图案显示。
输入不同图案相关的代码,然后调用图案显示判断程序段。
对其进行判断,然后进入图案显示代码,最终显示不同的图案。
源程序整体
程序开始,显示提示信息,接着调用发音子程序,实现发音和显示。
接着对9键进行判断、当9按下时,调用放音子程序。
然后iujinru选择,选择喜欢的歌曲并进行播放。
当检测到esc时,退出。
当每一个都检测不到时,退回到调用发音子程序,继续发音显示。
从而实现有扩展功能的电子琴。
5.模块连接,形成完整的程序
6.编写程序文档
4.流程图
以下用主程序与子程序配合流程图其进行说明。
(1)主程序流程图
(2)发音子程序流程图
(3)led显示子程序
(4)显示广告板子程序
(5)放音子程序
四、源程序
STACKSEGMENTPARASTACK'STACK'
DB100DUP(0)
STACKENDS
DATASEGMENT
IOPORTEQU0C400H-0280H
IO8255AEQUIOPORT+288H
IO8255CEQUIOPORT+28AH
IO8255BEQUIOPORT+28BH
IO8253AEQUIOPORT+280H
IO8253BEQUIOPORT+283H
IO0832AEQUIOPORT+290H
PROTEQU0C400H-280H
PROTHEQUPROT+298H
PROTLREQUPROT+2A0H
PROTLYEQUPROT+2A8H
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;正弦波数据
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
MESG1DB0DH,0AH,'INPUTANUM(1--8=PLAYPIANO,9=PLAYMUSIC,ESC=EXIT):
',0DH,0AH,'$'
MESG2DB0DH,0AH,'PLEASECHOOSETHEMUSICYOULIKE(1-AAA,2-BBB):
',0DH,0AH,'$'
TIMEDB120,110,100,90,81,72,55,42;发不同音时8253的计数器初值
NUMDB?
;NUM为8253计数器初值的序号--
MESSDB'STRIKEANYKEY,RETURNTODOS!
',0AH,0DH,'$'
MIN1DB00H,01H,02H,03H,04H,05H,06H,07H
COUNTDB0
JNUMDB?
;JNUM用来存储输入数字
MUSICDB30H,31H,31H,35H,35H,36H,36H,35H,30H,30H,34H,34H,33H,33H,32H,32H,31H,100DUP(30H);,35H,35H,34H,34H,33H,33H,32H,35H,35H,34H,34H,33H,33H,32H,31H,31H,35H,35H,36H,36H,35H,34H,34H,33H,33H,3;2H,32H,31H,
QMUSICDB?
DOWNDB31H,32H,33H,34H,35H,36H,37H,38H,38H,37H,36H,35H,34H,33H,32H,31H,100DUP(30H)
PPDB?
TTDB?
LMUSICEQU45
BUFF1DB00H,00H,18H,3CH,3CH,18H,00H,00H
BUFF2DB00H,1EH,0AH,46H,62H,50H,78H,00H
BUFF3DB00H,06H,06H,60H,60H,06H,06H,00H
BUFF4DB24H,66H,0E7H,00H,00H,0E7H,66H,24H
BUFF5DB42H,0E7H,42H,18H,18H,42H,0E7H,42H
BUFF6DB66H,24H,81H,0C3H,0C3H,81H,24H,66H
BUFF7DB24H,66H,00H,0DBH,0DBH,00H,66H,24H
BUFF8DB0CBH,99H,10H,0C6H,63H,08H,99H,0D3H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVTT,1
MOVAX,DATA
MOVDS,AX
MOVDX,IO8255B;使8255的A口为输出方式
MOVAX,92H
OUTDX,AL
MOVQMUSIC,0
JMPSSS
ZERO:
MOVQMUSIC,0
SSS:
CMPQMUSIC,LMUSIC
JEZERO
CMPQMUSIC,0
JESSS4
JMPSSS3
SSS4:
MOVDX,OFFSETMESG1
MOVAH,9
INT21H;显示提示信息
MOVAH,7
INT21H;从键盘接收字符,不回显
SSS3:
CMPAL,39H
JEPLAY0
CMPQMUSIC,0
JEOO
JMPPLAY
OO:
CMPAL,1BH
JEEXIT;若为ESC键,则转EXIT
CMPAL,30H
JESOFTDLY
;MOVDI,OFFESETRECORD
;MOV[DI],AL
;INCDI
CMPAL,31H
JLSSS
CMPAL,38H
JGSSS;若不在'1'-'8'之间转SSS
MOVJNUM,AL
SUBAL,31H
MOVNUM,AL;求出相应的时间常数的序号
MOVCX,60;取60次32个正弦波数据
SSS2:
MOVAL,JNUM
SUBAL,30H;将所得字符的ASCII码减30H
MOVBX,OFFSETLED;BX为数码表的起始地址
XLAT;求出相应的段码
MOVDX,IO8255C;从8255的C口输出
OUTDX,AL
DDD:
MOVSI,0
LLL:
MOVAL,DATA1[SI];取正弦波数据
MOVDX,IO0832A
OUTDX,AL;放音
CALLDELAY;调延时子程序
INCSI
CMPSI,32;是否取完32个数据
JLLLL;若没有,则继续
LOOPDDD;总循环次数60是否完,没有,则继续
MOVCX,0002H
CALLNIAN;------------------------
CALLNIAN
;CALLNIAN
JMPSSS;转SSS
EXIT:
MOVAH,4CH
INT21H
PLAY0:
CMPTT,1
JETT1
MOVDX,OFFSETMESG2
MOVAH,9
INT21H;显示子菜单
MOVAH,7
INT21H;输入子菜单命令
MOVPP,AL
PLAY:
MOVAL,QMUSIC
CMPPP,32H
JEPLAY2
CMPPP,31H
JNEPLAY0
MOVBX,OFFSETMUSIC
PLAY3:
XLAT
MOVCL,QMUSIC
ADDCL,01H
MOVQMUSIC,CL
JMPOO
TT1:
MOVTT,0
MOVPP,32H
PLAY2:
MOVBX,OFFSETDOWN
JMPPLAY3
SOFTDLY:
MOVBL,10
DELAY4:
MOVCX,0FFFFH
WAIT3:
LOOPWAIT3
DECBL
JNZDELAY4
JMPSSS
DELAYPROCNEAR;延时子程序
CCC1:
MOVBX,OFFSETTIME
MOVDX,IO8253B;置8253通道0为方式0工作
MOVAL,10H
OUTDX,AL
MOVAL,NUM;取相应的时间常数
XLAT
MOVDX,IO8253A
OUTDX,AL;向8253通道0输出
KKK:
MOVDX,IO8255A
INAL,DX;从8255A口读一字节
TESTAL,01;判PA0口是否为1
JZKKK;若不为1,则转KKK
RET;子程序返回
DELAYENDP
NIANPROCNEAR
START2:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMESS
AGN:
MOVCX,80H
D2:
MOVSI,OFFSETMIN1
MOVAH,01H
PUSHCX
MOVCX,0008H
NEXT:
MOVAL,JNUM
CALLBUFF
MOVDX,PROTH
OUTDX,AL
MOVAL,AH
MOVDX,PROTLR
OUTDX,AL;显示第一行红
SHLAH,01
INCSI
PUSHCX
MOVCX,0FFFFH
DELAY2:
LOOPDELAY2;延时
POPCX
LOOPNEXT
POPCX
CALLDELAY
LOOPD2
MOVAL,00
MOVDX,PROTLR
OUTDX,AL
CMPQMUSIC,0
JEC1
RET
C1:
MOVAH,01
INT16H
JNZBACK
AGN1:
MOVCX,80H;AGN1为显示黄色
D1:
MOVSI,OFFSETMIN1
MOVAH,01
PUSHCX
MOVCX,0008H
NEXT1:
MOVAL,JNUM
CALLBUFF
MOVDX,PROTH
OUTDX,AL
MOVAL,AH
MOVDX,PROTLY
OUTDX,AL
SHLAH,01
INCSI
PUSHCX
MOVCX,0FFFFH
DELAY1:
LOOPDELAY1
MOVCX,0FFFFH
DELAY3:
LOOPDELAY3
POPCX
LOOPNEXT1
POPCX
CALLDELAY
LOOPD1
MOVAL,00
MOVDX,PROTLY
OUTDX,AL
CMPQMUSIC,0
JEC2
RET
C2:
MOVAH,01
INT16H
JNZBACK
JMPAGN
BACK:
RET
;----------------------------------------------------------------
DELAY0PROCNEAR;延迟子程序
PUSHCX
MOVCX,0FFFFH
CCC:
LOOPCCC
POPCX
RET
DELAY0ENDP
;---------------------------------------------------------------------
;--------------------------------------------------------------------
BUFFPROCNEAR;代码选择判断子程序
JUDGE1:
CMPAL,31H
JEL1
CMPAL,32H
JEL2
CMPAL,33H
JEL3
CMPAL,34H
JEL4
CMPAL,35H
JEL5
CMPAL,36H
JEL6
CMPAL,37H
JEL7
CMPAL,38H
JEL8
;JMPA2
L1:
MOVAL,[SI]
MOVBX,OFFSETBUFF1
XLAT
RET;得到第一行码
L2:
MOVAL,[SI]
MOVBX,OFFSETBUFF2
XLAT
RET
L3:
MOVAL,[SI]
MOVBX,OFFSETBUFF3
XLAT
RET
L4:
MOVAL,[SI]
MOVBX,OFFSETBUFF4
XLAT
RET
L5:
MOVAL,[SI]
MOVBX,OFFSETBUFF5
XLAT
RET
L6:
MOVAL,[SI]
MOVBX,OFFSETBUFF6
XLAT
RET
L7:
MOVAL,[SI]
MOVBX,OFFSETBUFF7
XLAT
RET
L8:
MOVAL,[SI]
MOVBX,OFFSETBUFF8
XLAT
RET
BUFFENDP
NIANENDP
CODEENDS
ENDSTART
五、调试情况及其分析
源程序完成后,进行子程序与程序的调试工作,程序调试过程、完成情况及其分析按以下顺序进行:
1.主程序简单电子琴功能
主程序要求完成的功能有:
电子琴简单功能实现及将音阶用数码管显示,主程序由电子琴实验程序有机组成,两个程序简单拼凑在一齐是不能实现的。
经过实际调试和修改,将原电子琴程序改为2个子程序:
(实现播放音阶)和(实现播放音阶时延时);并加入了数码管显示的子程序以及广告版显示图案程序。
然后播放预存歌曲由放歌子程序完成。
调试后,主程序能实现课程设计要求的功能,并且界面清晰、操作容易。
2.子程序放歌(已预存)功能
此功能将一首预存的歌曲播放,此功能可以调用放音的子程序实现,唯一不同就是根据键盘的输入控制,选择播放的缓存区是预存歌缓存区。
然后通过键盘选择所要播放的歌曲曲目
3.源程序整体功能
将各子程序调试完成后,进行最后的源程序整体功能调试。
调试过程中我们注意到:
a.程序模块化(功能分为若干子程序)能使源程序清晰,调试简单,因此在调试中我们还将源程序进一步模块化。
b.注意子程序之间的通信方式,
c.调用子程序前,使用push/pop保护了一些子程序会用到的主程序同时会用到的寄存器,保证调用之后主程序的顺利执行。
在调试过程中出现的一些小问题,我们都根据以上3点总结出的经验作为原则进行调试,调试过程十分顺利。
最后根据电子琴的实际用途加上了一些必要清晰的提示性语句,使界面更加友好。
六、实验总结:
微机原理与应用这门课程刚刚于上学期结束,但是由于以前我们实验课时实在是太少了,还有经过寒假的放松,所以这次试验刚开始时最大的感觉就是以前学过的东西要不就是忘记了,或是记得的东西很难一下子拿出来应用。
这个不仅是在微机原理这门课,包括其他的课程设计也是开始会遇到知识与应用衔接不起来的困境。
通过老师的提示及相关实验指导书的资料我们找到了入手点,这点也是我觉得题目设置的比较合理的一点:
在已有基础题目的基础上加入创新内容。
在基础功能的实现上并没有遇到问题,主要也是有参考内容的知道,同时通过参考内容更好的把握了设计的整体思路及各个模块的细节。
但是在拓展功能上就有不少的问题。
就如我所做的电子琴来说,基本功能的程序已经在那里,但是如何使它可以同时用数码管显示音阶呢?
我们就找到了数码管显示的相关程序,但是直接相拼接显然是不行的,他们的端口还有重叠的地方,还有就是8255,8253两块芯片的相关使用指令,这些都是关系到我们程序是否实现功能的所在。
我们通过翻阅相关资料,逐步解决了相关的问题,然后我们同时也想到了将我们的电子琴做得与众不同,所以想到了旁边的点阵LED显示器,为了使我们的计划成功,同样的我们也翻阅了很多的资料,最后终于完成。
最后在老师的提示下,我们完成了在程序中预置歌曲的功能,还有开机音乐,但是在录制歌曲时出现了问题。
我们试了很久,但是最后还是无果而终,留下了一丝遗憾。
也希望在以后的实际问题中,能够得到相关解决。
也希望老师能够在汇编这一方面多给我们指导。
除了微机相关的知识,我通过这个实验更深刻了体会了数字与模拟之间的关系和相互转换的规律。
七、关于微机原理课程,实验课及课程设计的建议和意见
通过之前是微机实验和此次课程设计感触最深的一点就是:
就是上学期我们微机实验课的课时是在是太少啦,以致于留给我们做实验的时间实在是太少了,所以我们虽然完成了书本知识的学习,但是我们能够真正运用的东西太少了。
所以这次的课程设计提供给我们这个绝好的机会,让我们能得到学以致用的机会。
我希望以后这样能够让我们动手体验的机会可以更多一些。