电子琴 计算机接口 大作业.docx
《电子琴 计算机接口 大作业.docx》由会员分享,可在线阅读,更多相关《电子琴 计算机接口 大作业.docx(16页珍藏版)》请在冰豆网上搜索。
电子琴计算机接口大作业
苏州科技学院
电子与信息工程学院
计算机接口技术及其应用
大作业--电子琴设计
班级:
姓名:
学号:
指导老师:
2012/6/5
1.设计目标
按照音符来设定频率和8253定时/计数器的延时时间。
8253的CLK0接1MHz时钟,GATE0接+5V,OUT0接8255的PA0,J1接喇叭,编程使计算机的数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音阶。
以8255接八个开关K1~K8,做电子琴按键输入。
以8253控制扬声器,拨动不同的开关,发出相应的音阶。
扩展功能:
1、录音:
记录所弹奏曲目
2、放录音:
任意时刻重放最新记录曲目
2.设计思想
2.1.录音子程序
实现记录弹奏曲目并播放的功能。
首先由9触发,将输入的音阶存入缓存区song中,输入的同时可以发声和显示。
当再次按9时录制完成。
2.2.放音子程序
本子程序实现放音功能。
首先从8279键盘读出键码,判断,如果键码不是1-8即回到程序开始,如果是,即求出相应的时间常数的序号,取60次32个正弦波数据,播放32个数据,组成一个正弦波。
播放60次后,从PORT1中取出值到AL,和1相与,判断是否有按键,如果有就进入死循环,直到下次按键为止。
2.3.源程序整体
程序开始,显示提示信息,对缓存区、8279初始化。
接着调用发音子程序,键盘子程序,在把AL送缓存区,实现发音和显示。
接着对9键、0键、f键、r键进行逐个判断,当9按下时,调用录音子程序。
当按下0时,播放录制的曲目。
当按下f键时,播放程序中预设的曲目。
当检测到r时,退出到DOS状态。
当每一个都检测不到时,退回到调用发音子程序,继续发音显示。
从而实现有扩展功能的电子琴。
2.4.模块连接,形成完整的程序
3.电路原理与电路图
3.1、电路原理
3.1.1、对于一个特定的D/A转换接口电路,CPU执行一条输出指令将数据送入D/A,即可在其输出端得到一定的电压输出。
给D/A转换器输入按正弦规律变化的数据,在其输出端即可产生正弦波。
对于音乐,每个音阶都有确定的频率。
3.1.2、产生一个正弦波的数据可取32个(小于亦可),不同频率的区别,可通过调节向D/A转换器输出数据的时间间隔,例如:
发"1"频率为261。
1HZ,周期为1/261.1=3.83ms,输出数据的时间间隔为3.83ms/32=0.12ms.定时时间可以由8253配合8255来实现。
按下某键后发音时间的长短可以由发出的正弦波的个数多少来控制。
本程序中设置默认长度为60个正弦波。
3.2、电路图
4、算法描述与流程图
4.1算法描述
软件部分对整个系统来说起着重要的作用,在本电子琴系统中,软件可以分为六部分,主程序部分、发音子程序部分、放录音子程序部分、显示子程序部分、键盘显示子程序、放录音子程序部分。
4.2流程图
4.2.1、主程序流程图
4.2.2、发音子程序流程图
4.2.3、放录音子程序流程图4.2.4、显示子程序流程图
4.2.5、键盘显示子程序流程图4.2.6、放录音子程序流程图
5、程序
DATASEGMENT
IOPORTEQU0C400H-0280H
PORT0EQUIOPORT+2B0H;8279DATAPORT
PORT1EQUIOPORT+2B1H;8279CTRLPORT
SEC1DB0;HOURHIGHT
SEC2DB0;HOUPLOW
MIN1DB0;MINHIGHT
MIN2DB0;MINLOW
HOUR1DB0;SECHIGHT
HOUR2DB0;SECLOW
LEDDB3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH,77H,7CH,39H,5EH,79H,71H;7段管对应的显示码
DB67H,37H,73H,31H,3EH,36H,66H
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的计数器初值
DB'1.PRESS1~8TOPLAY',0DH,0AH,0DH,0AH
DB'2.PRESS9TORECORD',0DH,0AH,0DH,0AH
DB'3.PRESS0TOPLAYTHERECORD',0DH,0AH,0DH,0AH
DB'4.PRESSFTOPLAYTHESONG',0DH,0AH,0DH,0AH
DB'5.PRESSANYKEYTOPAUSE/STARTWHENPLAYTHERECORD',0DH,0AH,0DH,0AH
NUMDB?
;NUM为8253计数器初值的序号
SONGDB50DUP(?
)
SONG1DB1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,-1
MSGPLAYDB0DH,0AH,0DH,0AH,'RECORDING......PLESS9TOEND',0DH,0AH,0DH,0AH,'$'
MSGENDDB'RECORDFINISHED.',0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,'$'
MSGPLAY1DB0DH,0AH,0DH,0AH,'PLAYING......PRESSANYKEYTOPAUSE.',0DH,0AH,0DH,0AH,'$'
MSGEND1DB'PLAYINGFINISHED.',0DH,0AH,0DH,0AH,'$'
DATAENDS
STACK1SEGMENTPARASTACK'STACK'
DB50DUP(0)
STACK1ENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMSG
MOVAH,9
INT21H;显示提示信息
CLI
MOVAX,DATA
MOVDS,AX
MOVSEC1,0
MOVSEC2,0
MOVMIN1,0
MOVMIN2,0
MOVHOUR1,0
MOVHOUR2,0;显示缓存区初始化
MOVAX,DATA
MOVDS,AX
MOVAX,CS
MOVDS,AX
MOVDX,PORT1
MOVAL,0D3H;11010011清除命令特征位
OUTDX,AL;8279CLEAR
MOVAL,2AH;0010101042分频,内部使用1MHZ/42的频率
OUTDX,AL;8279CLOCK
MOVAL,40H
OUTDX,AL;READFIFORAMCOMMAND
MOVAL,00H;8个字符显示,左入口。
编码扫描键盘,双键锁定。
OUTDX,AL;KEYBORDDISPLYMODE
MOVAL,80H;写入的存储单元地址为0000
OUTDX,AL;WRITERAMCOMMAND
KEY1:
CALLMUSIC;发音
CALLKEYBORD;CALLKEYBORDANDDISPLY
NEXT2:
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
MOVMIN1,AL
MOVSEC2,AL
MOVSEC1,AL;键盘码存入显示缓冲区
LP0:
CMPAL,9H
JZRE
CMPAL,0H
JZOUTPUT
CMPAL,15
JZFU
CMPAL,13H;'R'COMMAND
JNZLP1
MOVAX,4C00H;QUITTODOS
INT21H
LP1:
JMPKEY1
RE:
CALLRE0;录音
JMPLP1
OUTPUT:
CALLOUTPUT0;放录音
JMPLP1
FU:
CALLOUTPUT1
JMPLP1
MAINENDP
RE0PROCNEAR;录音子程序
MOVDX,OFFSETMSGPLAY
MOVAH,9
INT21H;显示录音提示信息
LEASI,SONG
R:
CALLKEYBORD
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
MOVMIN1,AL
MOVSEC2,AL
MOVSEC1,AL;键盘码存入显示缓冲区
CALLMUSIC
CALLDISP
MOV[SI],AH
CMPAH,9
JZQRE0
INCSI
JMPR
QRE0:
MOVDX,OFFSETMSGEND
MOVAH,9
INT21H;显示录音提示信息
RET
RE0ENDP
OUTPUT0PROCNEAR;放录音子程序
MOVDX,OFFSETMSGPLAY1
MOVAH,9
INT21H;显示PLAY提示信息
LEASI,SONG
OU:
MOVAL,[SI]
CMPAL,9
JZQRE1
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
MOVMIN1,AL
MOVSEC2,AL
MOVSEC1,AL;键盘码存入显示缓冲区
CALLDISP
MOVAL,AH
CALLMUSIC
NEXT:
INCSI
JMPOU
QRE1:
MOVDX,OFFSETMSGEND1
MOVAH,9
INT21H;显示PLAYEND提示信息
RET
OUTPUT0ENDP
OUTPUT1PROCNEAR;放歌子程序
MOVDX,OFFSETMSGPLAY1
MOVAH,9
INT21H;显示PLAY提示信息
LEASI,SONG1
OU1:
MOVAL,[SI]
CMPAL,-1
JZQRE2
MOVHOUR2,AL
MOVHOUR1,AL
MOVMIN2,AL
MOVMIN1,AL
MOVSEC2,AL
MOVSEC1,AL;键盘码存入显示缓冲区
CALLDISP
MOVAL,AH
CALLMUSIC
NEXT1:
INCSI
JMPOU1
QRE2:
MOVDX,OFFSETMSGEND1
MOVAH,9
INT21H;显示PLAYEND提示信息
RET
OUTPUT1ENDP
KEYBORDPROCNEAR;键盘子程序
MOVDX,PORT1
MOVAL,0D1H
OUTDX,AL;CLEARDISPLAY
WREP:
CALLDISP
MOVDX,PORT1
INAL,DX;读状态
ANDAL,07H;判断是否有按键
JZWREP
KEYN:
;下一次的按键
MOVDX,PORT0
INAL,DX;读数据
MOVBL,AL
ANDAL,07H
ANDBL,38H
MOVCL,03
SHRBL,CL
CMPBL,00H
JNZLINE1
ADDAL,08H
JMPQUIT1
LINE1:
CMPBL,01H
JNZLINE2
JMPQUIT1
LINE2:
ADDAL,10H
QUIT1:
RET
KEYBORDENDP
DISPPROCNEAR;显示子程序
PUSHSI
PUSHCX
PUSHDX
MOVAX,DATA
MOVDS,AX
MOVDX,PORT1
MOVAL,90H
OUTDX,AL;写地址为0000的显示缓存区命令,每次写入后地址自动加1指向下一次写入地址
MOVSI,OFFSETSEC1
MOVCX,0001
MOVBX,OFFSETLED
DISP1:
CLD
LODSB
MOVAH,AL
XLAT;键盘码转显示码
MOVDX,PORT0
OUTDX,AL;显示
LOOPDISP1
POPDX
POPCX
POPSI
Q:
RET
DISPENDP
MUSICPROCNEAR;发音子程序
PUSHSI
CMPAL,1
JLQUIT
CMPAL,8
JGQUIT;若不在'1'-'8'之间转QUIT,不发音
MOVNUM,AL;求出相应的时间常数的序号
MOVCX,60;取60次32个正弦波数据
DDD:
MOVSI,0
LLL:
MOVAL,DATA1[SI];取正弦波数据
MOVDX,IO0832A
OUTDX,AL;放音
CALLDELAY;调延时子程序
INCSI
CMPSI,32;是否取完32个数据
JLLLL;若没有,则继续
LOOPDDD;总循环次数60是否完,没有,则继续
D:
MOVDX,PORT1;扫描实现任意键暂停
INAL,DX;读状态
ANDAL,01H;判断是否有按键
JNZFFF;按键延时
JMPQUIT
FFF:
MOVCX,60
JMPD
QUIT:
POPSI
RET
MUSICENDP
DELAYPROCNEAR;延时子程序
CCC:
MOVBX,OFFSETTIME
MOVDX,IO8253B;置8253通道0为方式0工作
MOVAL,10H
OUTDX,AL
MOVDX,IO8255B;设8255A口输入
MOVAL,9BH
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
CODEENDS
ENDSTART
6、设计总结
通过这次作业,让我在课本的基础上,更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。
为了实现基本功能,认真研究了参考程序的意义,了解了电子琴的不同音阶放音功能的实现,长短音的实现,更深入了解了8253计时器的使用方法。
编写程序的过程中,我遇到了很多的问题。
经过这个作业,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试过,就肯定学到了不少东西。
这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较综合。
。