电子琴设计(微机原理课程设计)Word格式文档下载.doc
《电子琴设计(微机原理课程设计)Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《电子琴设计(微机原理课程设计)Word格式文档下载.doc(20页珍藏版)》请在冰点文库上搜索。
(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)主程序流程图
开始
调用发音子程序
使用键盘输入
是否1到8键
放音子程序
N
Y
退出
是esc键
是否9键
调用广告版子程序
Led子程序
(2)发音子程序流程图
(3)led显示子程序
(4)显示广告板子程序
(5)放音子程序
用键盘输入喜欢歌曲的序号(1-3)
是否1到3键
四、源程序
STACKSEGMENTPARASTACK'
STACK'
DB100DUP(0)
STACKENDS
DATASEGMENT
IOPORT EQU0C400H-0280H
IO8255A EQUIOPORT+288H
IO8255C EQUIOPORT+28AH
IO8255B EQUIOPORT+28BH
IO8253A EQUIOPORT+280H
IO8253B EQUIOPORT+283H
IO0832A EQUIOPORT+290H
PROT EQU0C400H-280H
PROTH EQU PROT+298H
PROTLR EQUPROT+2A0H
PROTLY EQU PROT+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):
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
从键盘接收字符,不回显
SSS3:
CMPAL,39H
JEPLAY0
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口输出
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;
显示子菜单
输入子菜单命令
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
MOVAL,NUM;
取相应的时间常数
XLAT
MOVDX,IO8253A
向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:
MOV CX,80H
D2:
MOV SI,OFFSETMIN1
MOV AH,01H
PUSH CX
MOV CX,0008H
NEXT:
MOVAL,JNUM
CALLBUFF
MOV DX,PROTH
OUT DX,AL
MOV AL,AH
MOV DX,PROTLR
OUT DX,AL;
显示第一行红
SHL AH,01
INC SI
PUSHCX
MOV CX,0FFFFH
DELAY2:
LOOPDELAY2;
延时
POP CX
LOOPNEXT
CALLDELAY
LOOPD2
MOV AL,00
CMPQMUSIC,0
JEC1
RET
C1:
MOV AH,01
INT 16H
JNZBACK
AGN1:
MOV CX,80H;
AGN1为显示黄色
D1:
MOV SI,OFFSETMIN1
MOV AH,01
NEXT1:
MOVAL,JNUM
MOV DX,PROTLY
DELAY1:
LOOPDELAY1
DELAY3:
LOOPDELAY3
LOOPNEXT1
LOOP D1
JEC2
C2:
JMPAGN
BACK:
RET
;
----------------------------------------------------------------
DELAY0 PROC NEAR;
延迟子程序
CCC:
LOOP CCC
RET
DELAY0 ENDP
---------------------------------------------------------------------
--------------------------------------------------------------------
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:
MOV AL,[SI]
MOV BX,OFFSETBUFF1
XLAT
RET;
得到第一行码
L2:
MOV BX,OFFSETBUFF2
L3:
MOV BX,OFFSETBUFF3
L4:
MOV BX,OFFSETBUFF4
L5: