电子琴 计算机接口 大作业.docx

上传人:b****3 文档编号:3848038 上传时间:2022-11-25 格式:DOCX 页数:16 大小:144.40KB
下载 相关 举报
电子琴 计算机接口 大作业.docx_第1页
第1页 / 共16页
电子琴 计算机接口 大作业.docx_第2页
第2页 / 共16页
电子琴 计算机接口 大作业.docx_第3页
第3页 / 共16页
电子琴 计算机接口 大作业.docx_第4页
第4页 / 共16页
电子琴 计算机接口 大作业.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

电子琴 计算机接口 大作业.docx

《电子琴 计算机接口 大作业.docx》由会员分享,可在线阅读,更多相关《电子琴 计算机接口 大作业.docx(16页珍藏版)》请在冰豆网上搜索。

电子琴 计算机接口 大作业.docx

电子琴计算机接口大作业

苏州科技学院

电子与信息工程学院

计算机接口技术及其应用

大作业--电子琴设计

 

班级:

姓名:

学号:

指导老师:

 

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计时器的使用方法。

编写程序的过程中,我遇到了很多的问题。

经过这个作业,虽然时间比较短,完成任务的效果不是很理想,但是既然自己尝试过,就肯定学到了不少东西。

这次课程设计对我综合运用所学知识的能力的提高有不小的帮助,之前做的实验都是很简单的编程,跟硬件结合也没有这么复杂,实现的功能都比较简单,可是这次要实现的功能相对来说比较复杂,要求掌握的知识比较综合。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1