电子琴综合实验报告汇编语言.docx

上传人:b****5 文档编号:11883809 上传时间:2023-04-08 格式:DOCX 页数:62 大小:35.30KB
下载 相关 举报
电子琴综合实验报告汇编语言.docx_第1页
第1页 / 共62页
电子琴综合实验报告汇编语言.docx_第2页
第2页 / 共62页
电子琴综合实验报告汇编语言.docx_第3页
第3页 / 共62页
电子琴综合实验报告汇编语言.docx_第4页
第4页 / 共62页
电子琴综合实验报告汇编语言.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

电子琴综合实验报告汇编语言.docx

《电子琴综合实验报告汇编语言.docx》由会员分享,可在线阅读,更多相关《电子琴综合实验报告汇编语言.docx(62页珍藏版)》请在冰豆网上搜索。

电子琴综合实验报告汇编语言.docx

电子琴综合实验报告汇编语言

基于分频原理的多功能电子琴+节拍器

信息科学技术学院电子学系任伶00548091

[摘要]

一,课题及完成情况简介:

利用TPC-H实验箱上的8253实现二级分频,同时配合以8255A,与门和DAC0832,通过扬声器放音,实现两个八度音高(包括半音)的电子琴。

在软硬件相互配合下,电子琴具有弹奏和播放已存乐曲的功能,音长可控,播放速度可选,拥有美观的图形界面模拟真实琴键,且琴键随弹奏有起伏变化。

利用微机内部的8253,8255A和内置扬声器,与TPC-H实验板上的8255A和LED,实现节拍器,可产生长度和速度可控的2/4拍,3/4拍及4/4拍等,LED和内置扬声器同时对节拍进行提示。

二,关键词:

8253,8255A,DAC0832,弹奏,录音,播放,用户选择

[目标要求]

一,基本功能:

1.以微机键盘模拟真实琴键,发出标准C大调音阶和其高八度音阶,包括半音

2.每个音可以任意长短发音,由用户的按键时间决定,模拟真实电子琴的发生效果

二,附加功能:

1.通过编写汇编语言,实现可视化界面,便于用户操作;弹奏过程中,琴键随用户按键的按下和弹起有起落变化的效果

2.在弹奏过程中同步录音;播放已经录制的乐曲;播放速度由用户决定,由慢速,中速和快速等选择

3.将电子琴作为节拍器使用,输出各种节拍,有2/4拍,3/4拍及4/4拍等供用户选择,在节拍器输出的同时,有LED和微机内置扬声器作为指示;拥有LED指示是真实节拍器没有而本课题独有的功能

4.节拍器的输出拍数有长短两种,拍速有快慢两种,均由用户选择

[设计和实施方案]

一,设计方案选择与论述

电子琴的实现方案有多种,例如基于波形叠加原理和基于分频原理等。

基于波形叠加原理,其核心在于数模转换过程,其实现的过程和需要的组件较简单;用到的芯片主要为DAC0832,数目太少,很难达到硬件使用能力的锻炼;而基于分频原理的电子琴实现能够给我更多的锻炼机会。

基于分频原理,其核心在于对分频计数的控制,多变复杂;用到的芯片包括8253,8255A,DAC0832和与门等,包括了基于波形叠加原理用到的芯片,同时我对8253和8255A的应用更熟练,便于方案可行性估计和软件调试;此方案下,TPC-H实验箱上的连线较多,更是一种对硬件处理能力的挑战。

节拍器的实现主要依靠分频和并口数据传输。

基于上述理由,我选择基于分频原理的方案来实现电子琴和节拍器的混合体。

二,所选用方案的框图

 

三,采用的部件(元器件),方法,算法可实现所要求的功能和指标

1.电子琴发声部分

利用TPC-H实验箱上的8253,8255A,DAC0832和与门及相关电路连接(详见后续说明)实现电子琴弹奏和播放录音时的发声(二者算法基本一致),发生的频率和时长主要通过对用户输入(即按键)的判断,调用过程控制硬件完成。

用户弹奏时,通过对按键的判断,即可知其音高,在数据列表中找到相应计数初值,赋给8253计数器0和计数器1即可。

在这里要说明的是,计数器0执行的一级分频用于确定音高(不同音符的计数初值不同);计数器1执行的二级分频用于控制程序将正弦波形的离散数值写入DAC0832,从而得到模拟正弦波驱动扬声器,其计数初值不因音高变化而变化,这是因为在一个正弦周期内写入的离散数值个数是固定的,而写入频率由计数器0的输出作为GATE1控制;此为使用二级分频的缘故。

按键的时长由程序计数得到,在琴键按下时,8255A的PA0口输出为零,无按键时其输出为1,因此8255A的PA0和8253的OUT1相与后作为8255A的PC0输入,在琴键按下时控制程序中正弦波离散数值以其频率向DAC0832的写入,在琴键弹起时禁止此写入。

对于播放录音的情况,程序从内存中读出一个音符的音高与时长,同理控制上述过程即可。

不同按键与不同音符的对应关系如下(标准C大调音阶及其高八度音阶):

按键

1

2

3

4

5

6

7

8

9

0

-

=

音符

C

#C

D

#D

E

F

#F

G

#G

A

#A

B

按键

Q

W

E

R

T

Y

U

I

O

P

[

]

音符

HC

#HC

HD

#HD

HE

HF

#HF

HG

#HG

HA

#HA

HB

通过用户选择,赋予播放速度变量不同的值,从而改变音符的时长,从而改变了乐曲的播放速度。

2.电子琴琴键显示部分

在电子琴的图形界面设计上,采用像素点画图的方法。

实现计算好电子琴静态界面各个部分的位置和大小,确定其颜色存入数据列表中,使用时调用,按照像素点的颜色和数目等信息一次画出整个键盘。

在用户弹奏时,需要显示相应琴键按下和弹起的效果。

在判断音符时即确定它对应的琴键的图形中需要改动区域的像素的位置,大小和颜色,存入相应寄存器中,再调用KEYDOWN和KEYUP重新在上述区域逐点重画像素。

3.提示信息显示部分

所有对用户的提示信息均以字符串的形式在屏幕上显示,用户的输入根据其逻辑关系驱动程序走向(详见后续说明)。

4.节拍器工作部分

根据用户的选择,决定输出节拍的种类,长度和速度,并跳转到相应程序段,同时相应变量赋值。

其中,长度即输出节拍的个数,速度决定程序延时。

LED的L3~L0点亮与否由TPC-H实验箱上的8255A的PA4~PA1驱动,按一个节拍周期中强弱拍的变化依次点亮。

微机内部的8253和8255A驱动内置扬声器发出不同频率的声音,按一个节拍周期中强弱拍的变化规律与LED同时对用户作出节拍提示。

四,电路原理图,软件流程图和主要软件模块说明

1.电路原理图

 

2.软件流程图

 

3.主要软件模块说明

(1)采用IBM-PC彩色图形方式,显示电子琴键盘的画面

(a)绘制出键盘的静态效果

其中,图形界面的数据缓冲区定义如下:

色号

6

7

0

8

对应颜色

橙色

白色

黑色

灰色

KEYBOARDDB179DUP(6);电子琴上部的橙色背景

;键盘中部

DB6DUP(6),8DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)

DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)

DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),1DUP(0)

DB8DUP(7),7DUP(0),5DUP(7),7DUP(0),5DUP(7),7DUP(0),8DUP(7),6DUP(6)

DB6DUP(6),8DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)

DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)

DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),1DUP(0)

DB8DUP(7),7DUP(8),5DUP(7),7DUP(8),5DUP(7),7DUP(8),8DUP(7),6DUP(6)

;键盘下部

DB6DUP(6),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)

DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)

DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0)

DB11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),1DUP(0),11DUP(7),6DUP(6)

DB6DUP(6),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)

DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)

DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0)

DB11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),1DUP(0),11DUP(8),6DUP(6)

调用DRAW画出键盘的静态效果。

;-------------------DRAW----------------------

DRAWPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

MOVAX,DATA;段寄存器初始化

MOVDS,AX

MOVAH,0;设置屏幕显示为320X200

MOVAL,0DH;彩色图形(EGA)

INT10H

MOVSI,0;从第一个像素开始

MOVCX,66;列

MOVDX,62;行

LEABX,KEYBOARD

;绘制电子琴上部的橙色背景

PART1:

MOVDI,[BX+SI];取像素值

MOVAX,DI

MOVAH,0CH

INT10H

INCDX

CMPDX,82;一行画完了吗?

JNEPART1;若没有则继续

MOVDX,62;画下一行

INCSI

INCCX

CMPCX,245;所有的行都画完了吗?

JNZPART1;若没有则继续

;绘制电子琴中部黑白键交替的情景

MOVCX,66

MOVDX,82

LEABX,KEYBOARD;现在SI=167

PART2:

MOVDI,[BX+SI]

MOVAX,DI

MOVAH,0CH

INT10H

INCDX

CMPDX,101

JNEPART2

MOVDX,82

INCSI

INCCX

CMPCX,245

JNZPART2

;绘制电子琴中部灰白交替的情况(此处的灰色部分对应于上处的黑色部分,表示黑键

;的立体感)

MOVCX,66

MOVDX,101

LEABX,KEYBOARD

PART3:

MOVDI,[BX+SI]

MOVAX,DI

MOVAH,0CH

INT10H

INCDX

CMPDX,103

JNEPART3

MOVDX,101

INCSI

INCCX

CMPCX,245

JNZPART3

;绘制键盘的下部分,白色、中间夹着黑色线条表示不同的白键

MOVCX,66

MOVDX,103

LEABX,KEYBOARD

PART4:

MOVDI,[BX+SI]

MOVAX,DI

MOVAH,0CH

INT10H

INCDX

CMPDX,116

JNEPART4

MOVDX,103

INCSI

INCCX

CMPCX,245

JNZPART4

;绘制键盘的下部分,将横坐标方向上对应于上行白色的部分对应成灰色,显示立体感

MOVCX,66

MOVDX,116

LEABX,KEYBOARD

PART5:

MOVDI,[BX+SI]

MOVAX,DI

MOVAH,0CH

INT10H

INCDX

CMPDX,119

JNEPART5

MOVDX,116

INCSI

INCCX

CMPCX,245

JNZPART5

POPDI

POPSI

POPDX

POPCX

POPBX

POPAX

RET

DRAWENDP

(b)调用KEYDOWN和KEYUP画出琴键按下和弹起的动态效果

当白键按下时,对应白色键下面的灰色部分将被涂成白色,等按键弹起时恢复灰色。

当黑键按下时,对应黑色键下面的灰色部分将被涂成黑色,等按键弹起时恢复灰色。

由于白键和黑键的宽度不一样,在下面相应位置将灰色覆盖的颜色也分别是白色和黑色,并且开始绘制的横纵坐标不一样,因此程序中用CX记录该开始涂的点的横坐标,DX记录纵坐标,COLOR1表示KEYUP中应涂上的颜色,LEN表示涂的纵向长度,WID表示涂的横向宽度。

COLOR2表示KEYDOWN中应涂上的颜色。

;--------------KEYDOWN-------------------

KEYDOWNPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

MOVSI,0

MOVDI,0

MOVAH,0CH

MOVAL,COLOR1;确定图样颜色

DOWN:

INT10H

INCDX

INCDI

CMPDI,LEN;长度方向画完了吗?

JNEDOWN;没画完则继续

SUBDX,LEN

MOVDI,0

INCCX

INCSI

CMPSI,WID;宽度方向画完了吗?

JNEDOWN;没画完则继续

POPDI

POPSI

POPDX

POPCX

POPBX

POPAX

RET

KEYDOWNENDP

;---------------KEYUP---------------------------

KEYUPPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

MOVSI,0

MOVDI,0

MOVAH,0CH

MOVAL,COLOR2;确定图样颜色

UP:

INT10H

INCDX

INCDI

CMPDI,LEN;长度方向画完了吗?

JNEUP;没画完则继续

SUBDX,LEN

MOVDI,0

INCCX

INCSI

CMPSI,WID;宽度方向画完了吗?

JNEUP;没画完则继续

POPDI

POPSI

POPDX

POPCX

POPBX

POPAX

RET

KEYUPENDP

(2)用户弹奏,实现不同音高输出和时长控制

不同音高对应的初级分频计数初值记录在SCALE中:

SCALEDW476,450,424,402,378,356,336,316,300,282,268,252

DW238,224,210,200,188,182,170,158,150,140,132,124

DAC0832将正弦波的离散数值进行数模转换变为模拟量输出时使用的正弦波离散数值存储于SIN中(这是一个周期中对模拟正弦波进行32次等间隔抽样量化得到的结果):

SINDB127,139,152,164,176,187,198,208

DB217,225,233,239,244,249,252,253

DB254,253,252,249,244,239,233,225

DB217,208,198,187,176,164,152,139

DB127,115,102,90,78,67,56,46

DB37,29,21,15,10,5,2,1

DB0,1,2,5,10,15,21,29

DB37,46,56,67,78,90,102,115

以下程序段在按键已经完成音符判断的基础上实现声音的输出,音高和时长的记录存储(其中,BX存放频率数组指针偏移量):

PLAY:

CALLKEYDOWN;画出键按下的图样

PUSHBX

PUSHCX

PUSHDX

MOVDX,288H;发声

MOVAL,1

OUTDX,AL

MOV[DI],BX;存储频率(数组偏移量)

INCDI

INCDI

MOVAL,00110110B;8253初始化,计数器0,读写16位

MOVDX,283H;工作方式3,二进制计数

OUTDX,AL

MOVAX,[BX+SI];赋初值,即设定频率

MOVDX,280H

OUTDX,AL

MOVAL,AH

OUTDX,AL

MOVDX,283H

MOVAL,01010110B;8253初始化,计数器1,低8位读写

OUTDX,AL;工作与方式3,二进制计数

MOVDX,281H;输出计数器初值,控制向DAC0832写入的频率

MOVAL,32

OUTDX,AL

MOVBX,00H;开始记录按键时长

PBEG:

PUSHSI

LEASI,SIN;输出一个周期的正弦波形

MOVCX,32

L0:

WAIT1:

MOVDX,2B0H

MOVAL,[SI]

OUTDX,AL;取得正弦量化数值,送入DAC

MOVDX,28AH

INAL,DX

CMPAL,01H;分频控制信号的正半周期

JZWAIT1

INCSI

WAIT2:

MOVDX,2B0H

MOVAL,[SI]

OUTDX,AL;取得正弦量化数值,送入DAC

MOVDX,28AH

INAL,DX

CMPAL,00H;分频控制信号的负半周期

JZWAIT2

INCSI

LOOPL0

POPSI

INCBX;即输出一个周期的正弦波形,记录时长有一个增量

HOLD:

INAL,60H

TESTAL,80H

JZPBEG;如果按键未放开,继续记录

MOVDS:

[DI],BX;存储按键时长

INCDI

INCDI

MOVAX,BUFFER;缓冲区指针后移

INCAX

INCAX

INCAX

INCAX

MOVBUFFER,AX

MOVDX,288H;停止发声

MOVAL,0

OUTDX,AL

MOVDX,2B0H;DAC输入为零,不发声

MOVAL,0

OUTDX,AL

POPDX

POPCX

POPBX

CALLKEYUP;画出键恢复的图样

(3)调用LIST进行已存乐曲的播放

MODE存放用户选择的播放速度模式(慢速,中速或快速),其值控制每个音的时长,从而达到控制乐曲速度的效果。

;----------------------LIST----------------------------

LISTPROCNEAR

LISTMENU:

LEADX,LMENU;显示放录音时的菜单

MOVAH,09H

INT21H

LIN:

MOVAH,07H;读入播放速度或返回主菜单的要求

INT21H

CMPAL,'M'

JNZFFF

JMPMAINMENU;返回主菜单

FFF:

CMPAL,'1'

JNZMMM

MOVMODE,1;快速播放

JMPNEXT

MMM:

CMPAL,'2'

JNZLLL

MOVMODE,4;中速播放

JMPNEXT

LLL:

CMPAL,'3'

JNZLIN;按错键了则重新读入

MOVMODE,8;慢速播放

NEXT:

LEADX,LBEG;显示播放录音时的提示语

MOVAH,09H

INT21H

LI:

LEADI,BUFFER

INCDI

INCDI

LIO:

MOVBX,[DI]

INCDI

INCDI

CMPBX,0FFFFH

JZLI_END;如果是录音的结尾则结束播放,否则继续

MOVDX,288H;使能喇叭,开始播放

MOVAL,1

OUTDX,AL

MOVDX,283H

MOVAL,00110110B;8253初始化,计数器0,16位读写

OUTDX,AL;工作于方式3,二进制计数

MOVDX,280H;输出计数初值,即控制声音的频率

MOVAX,[BX+SI]

OUTDX,AL

MOVAL,AH

OUTDX,AL

MOVDX,283H

MOVAL,01010110B;8253初始化,计数器1,低8位读写

OUTDX,AL;工作与方式3,二进制计数

MOVDX,281H;输出计数器初值,控制向DAC0832写入的频率

MOVAL,32

OUTDX,AL

MOVBX,[DI];取得声音时长

MOVAX,BX;加以播放速度的控制

MULMODE

MOVBX,AX

INCDI

INCDI

DELAY:

;延时输出声音

PUSHSI

LEASI,SIN;输出一个周期的正弦波

MOVCX,32;频率由计数器0和1的分频结果控制

L1:

WAIT3:

MOVDX,2B0H;在分频输出方波为1时输出正弦波的第2n个值

MOVAL,[SI];其中n=0,1,2,...,31

OUTDX,AL;将正弦波的数值写入DAC,由其转化为模拟量输出

MOVDX,28AH

INAL,DX

CMPAL,01H

JZWAIT3

INCSI

WAIT4:

MOVDX,2B0H;在分频输出方波为0时输出正弦波的第2n+1个值

MOVAL,[SI]

OUTDX,

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

当前位置:首页 > 成人教育 > 自考

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

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