《电子琴 计算机接口 大作业.doc》由会员分享,可在线阅读,更多相关《电子琴 计算机接口 大作业.doc(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、苏 州 科 技 学 院电子与信息工程学院计算机接口技术及其应用 大作业-电子琴设计 班 级 : 姓 名 : 学 号 : 指导老师: 2012/6/51设计目标 按照音符来设定频率和8253定时/计数器的延时时间。8253的CLK0接1MHz时钟,GATE0接5V,OUT0接8255的PA0,J1接喇叭,编程使计算机的数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音阶。以8255接八个开关K1K8,做电子琴按键输入。以8253控制扬声器,拨动不同的开关,发出相应的音阶。扩展功能:1、录音:记录所弹奏曲目 2、放录音:任意时刻重放最新记录曲目2设计思想21录音子程序实现记录弹奏曲
2、目并播放的功能。首先由9触发,将输入的音阶存入缓存区song中,输入的同时可以发声和显示。当再次按9时录制完成。22放音子程序本子程序实现放音功能。首先从8279键盘读出键码,判断,如果键码不是18即回到程序开始,如果是,即求出相应的时间常数的序号,取60次32个正弦波数据,播放32个数据,组成一个正弦波。播放60次后,从PORT1中取出值到AL,和1相与,判断是否有按键,如果有就进入死循环,直到下次按键为止。23源程序整体程序开始,显示提示信息,对缓存区、8279初始化。接着调用发音子程序,键盘子程序,在把AL送缓存区,实现发音和显示。接着对9键、0键、f键、r键进行逐个判断,当9按下时,调
3、用录音子程序。当按下0时,播放录制的曲目。当按下f键时,播放程序中预设的曲目。当检测到r时,退出到DOS状态。当每一个都检测不到时,退回到调用发音子程序,继续发音显示。从而实现有扩展功能的电子琴。 24模块连接,形成完整的程序3电路原理与电路图3.1、电路原理3.11、对于一个特定的/转换接口电路,CPU执行一条输出指令将数据送入/, 即可在其输出端得到一定的电压输出。给/转换器输入按正弦规律变化的数据, 在其输出端即可产生正弦波。对于音乐,每个音阶都有确定的频率。 3.12、产生一个正弦波的数据可取32个(小于亦可),不同频率的区别,可通过调节向转换器输出数据的时间间隔,例如:发频率为261
4、。1HZ,周期为1/261.1=3.83ms,输出数据的时间间隔为3.83ms/320.12ms. 定时时间可以由8253配合8255来实现。按下某键后发音时间的长短可以由发出的正弦波的个数多少来控制。本程序中设置默认长度为60个正弦波。32、电路图4、算法描述与流程图41算法描述软件部分对整个系统来说起着重要的作用,在本电子琴系统中,软件可以分为六部分,主程序部分、发音子程序部分、放录音子程序部分、显示子程序部分、 键盘显示子程序、放录音子程序部分。42流程图421、主程序流程图422、发音子程序流程图 423、 放录音子程序流程图 42. 4、 显示子程序流程图425、键盘显示子程序流程图
5、 42. 6、放录音子程序流程图5、程序DATA SEGMENTIOPORT EQU 0C400H-0280HPORT0 EQU IOPORT+2B0H ;8279 DATA PORTPORT1 EQU IOPORT+2B1H ;8279 CTRL PORTSEC1 DB 0 ;HOUR HIGHTSEC2 DB 0 ;HOUP LOWMIN1 DB 0 ;MIN HIGHTMIN2 DB 0 ;MIN LOWHOUR1 DB 0 ;SEC HIGHTHOUR2 DB 0 ;SEC LOWLED DB 3FH,06,5BH,4FH,66H,6DH,7DH,07,7FH,6FH,77H,7CH,
6、39H,5EH,79H,71H ;7段管对应的显示码DB 67H,37H,73H,31H,3EH,36H,66HIO8253A EQU IOPORT+280HIO8253B EQU IOPORT+283HIO8255A EQU IOPORT+288HIO8255B EQU IOPORT+28BHIO0832A EQU IOPORT+290HDATA1 DB 80H,96H,0AEH,0C5H,0D8H,0E9H,0F5H,0FDHDB 0FFH,0FDH,0F5H,0E9H,0D8H,0C5H,0AEH,96HDB 80H,66H,4EH,38H,25H,15H,09H,04HDB 00H,0
7、4H,09H,15H,25H,38H,4EH,66H ;正弦波数据TIME DB 120,106,94,89,79,70,63,59 ;发不同音时8253的计数器初值DB 1.PRESS 18 TO PLAY,0DH,0AH,0DH,0AHDB2.PRESS 9 TO RECORD,0DH,0AH,0DH,0AHDB3.PRESS 0 TO PLAY THE RECORD,0DH,0AH,0DH,0AHDB4.PRESS F TO PLAY THE SONG,0DH,0AH,0DH,0AHDB5.PRESS ANYKEY TO PAUSE/START WHEN PLAY THE RECORD,
8、0DH,0AH,0DH,0AHNUM DB ? ;NUM为8253计数器初值的序号SONG DB 50 DUP(?)SONG1 DB 1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,-1MSGPLAY DB 0DH,0AH,0DH,0AH,RECORDING.PLESS 9 TO END,0DH,0AH,0DH,0AH,$MSGEND DB RECORD FINISHED.,0DH,0AH,0DH,0AH,0DH,0AH,0DH,0AH,$MSGPLAY1 DB 0DH,0AH,0DH,0AH,PLAYING.PRESS ANYKEY TO PAUSE.,0DH,0AH,0DH
9、,0AH,$MSGEND1 DB PLAYING FINISHED.,0DH,0AH,0DH,0AH,$DATA ENDSSTACK1 SEGMENT PARA STACK STACKDB 50 DUP(0)STACK1 ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET MSGMOV AH,9INT 21H ;显示提示信息CLIMOV AX,DATAMOV DS,AXMOV SEC1,0MOV SEC2,0MOV MIN1,0MOV MIN2,0MOV HOUR1
10、,0MOV HOUR2,0 ;显示缓存区初始化MOV AX,DATAMOV DS,AXMOV AX,CSMOV DS,AXMOV DX,PORT1MOV AL,0D3H ;11010011 清除命令特征位OUT DX,AL ;8279 CLEARMOV AL,2AH ;00101010 42分频,内部使用1MHZ/42的频率OUT DX,AL ;8279 CLOCKMOV AL,40HOUT DX,AL ;READ FIFO RAM COMMANDMOV AL,00H ;8个字符显示,左入口。编码扫描键盘,双键锁定。OUT DX,AL ;KEYBORD DISPLY MODEMOV AL,80
11、H ;写入的存储单元地址为0000OUT DX,AL ;WRITE RAM COMMANDKEY1:CALL MUSIC ;发音CALL KEYBORD ;CALL KEYBORD AND DISPLYNEXT2:MOV HOUR2,ALMOV HOUR1,ALMOV MIN2,ALMOV MIN1,ALMOV SEC2,ALMOV SEC1,AL ;键盘码存入显示缓冲区LP0:CMP AL,9HJZ RECMP AL,0HJZ OUTPUTCMP AL,15JZ FUCMP AL,13H ;R COMMANDJNZ LP1MOV AX,4C00H ;QUIT TO DOSINT 21HLP1
12、: JMP KEY1RE:CALL RE0 ;录音JMP LP1OUTPUT:CALL OUTPUT0 ;放录音JMP LP1FU:CALL OUTPUT1JMP LP1MAIN ENDPRE0 PROC NEAR ;录音子程序MOV DX,OFFSET MSGPLAYMOV AH,9INT 21H ;显示录音提示信息LEA SI,SONGR:CALL KEYBORDMOV HOUR2,ALMOV HOUR1,ALMOV MIN2,ALMOV MIN1,ALMOV SEC2,ALMOV SEC1,AL ;键盘码存入显示缓冲区CALL MUSICCALL DISPMOV SI,AHCMP AH,
13、9JZ QRE0INC SIJMP RQRE0:MOV DX,OFFSET MSGENDMOV AH,9INT 21H ;显示录音提示信息RETRE0 ENDPOUTPUT0 PROC NEAR ;放录音子程序MOV DX,OFFSET MSGPLAY1MOV AH,9INT 21H ;显示PLAY提示信息LEA SI,SONGOU:MOV AL,SICMP AL,9JZ QRE1MOV HOUR2,ALMOV HOUR1,ALMOV MIN2,ALMOV MIN1,ALMOV SEC2,ALMOV SEC1,AL ;键盘码存入显示缓冲区CALL DISPMOV AL,AHCALL MUSIC
14、NEXT:INC SIJMP OUQRE1:MOV DX,OFFSET MSGEND1MOV AH,9INT 21H ;显示PLAYEND提示信息RETOUTPUT0 ENDPOUTPUT1 PROC NEAR ;放歌子程序MOV DX,OFFSET MSGPLAY1MOV AH,9INT 21H ;显示PLAY提示信息LEA SI,SONG1OU1:MOV AL,SICMP AL,-1JZ QRE2MOV HOUR2,ALMOV HOUR1,ALMOV MIN2,ALMOV MIN1,ALMOV SEC2,ALMOV SEC1,AL ;键盘码存入显示缓冲区CALL DISPMOV AL,AH
15、CALL MUSICNEXT1:INC SIJMP OU1QRE2:MOV DX,OFFSET MSGEND1MOV AH,9INT 21H ;显示PLAYEND提示信息RETOUTPUT1 ENDPKEYBORD PROC NEAR ;键盘子程序MOV DX,PORT1MOV AL,0D1HOUT DX,AL ;CLEAR DISPLAYWREP:CALL DISPMOV DX,PORT1IN AL,DX ;读状态AND AL,07H ;判断是否有按键JZ WREPKEYN: ;下一次的按键MOV DX,PORT0IN AL,DX ;读数据MOV BL,ALAND AL,07HAND BL,
16、38HMOV CL,03SHR BL,CLCMP BL,00HJNZ LINE1ADD AL,08HJMP QUIT1LINE1:CMP BL,01HJNZ LINE2JMP QUIT1LINE2:ADD AL,10HQUIT1:RETKEYBORD ENDPDISP PROC NEAR ;显示子程序PUSH SIPUSH CXPUSH DXMOV AX,DATAMOV DS,AXMOV DX,PORT1MOV AL,90HOUT DX,AL ;写地址为0000的显示缓存区命令,每次写入后地址自动加1指向下一次写入地址MOV SI,OFFSET SEC1MOV CX,0001MOV BX,OF
17、FSET LEDDISP1:CLDLODSBMOV AH,ALXLAT ;键盘码转显示码MOV DX,PORT0OUT DX,AL ;显示LOOP DISP1POP DXPOP CXPOP SIQ:RETDISP ENDPMUSIC PROC NEAR ;发音子程序PUSH SICMP AL,1JL QUITCMP AL,8JG QUIT ;若不在1-8之间转QUIT,不发音MOV NUM,AL ;求出相应的时间常数的序号MOV CX,60 ;取60次32个正弦波数据DDD:MOV SI,0LLL:MOV AL,DATA1SI ;取正弦波数据MOV DX,IO0832AOUT DX,AL ;放
18、音CALL DELAY ;调延时子程序INC SICMP SI,32 ;是否取完32个数据JL LLL ;若没有,则继续LOOP DDD ;总循环次数60是否完,没有,则继续D: MOV DX,PORT1 ;扫描实现任意键暂停 IN AL,DX ;读状态 AND AL,01H ;判断是否有按键 JNZ FFF ;按键延时 JMP QUITFFF: MOV CX,60 JMP DQUIT:POP SIRETMUSIC ENDPDELAY PROC NEAR ;延时子程序CCC: MOV BX,OFFSET TIMEMOV DX,IO8253B ;置8253通道0为方式0工作MOV AL,10HO
19、UT DX,ALMOV DX,IO8255B ;设8255A口输入MOV AL,9BHOUT DX,ALMOV AL,NUM ;取相应的时间常数XLATMOV DX,IO8253AOUT DX,AL ;向8253通道0输出KKK: MOV DX,IO8255AIN AL,DX ;从8255A口读一字节TEST AL,01 ;判PA0口是否为1JZ KKK ;若不为1,则转KKKRET ;子程序返回DELAY ENDPCODE ENDSEND START6、设计总结通过这次作业,让我在课本的基础上,更深入的了解了各种芯片的用法和程序的完成过程,调试方法及技巧。为了实现基本功能,认真研究了参考程序的意义,了解了电子琴的不同音阶放音功能的实现,长短音的实现,更深入了解了8253计时器的使用方法。编写程序的过程中,我遇到了很多的问题。 经过这个作业,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试过,就肯定学到了不少东西。这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较综合。
限制150内