简易电子琴版本2.docx

上传人:b****5 文档编号:12053787 上传时间:2023-04-16 格式:DOCX 页数:28 大小:291.89KB
下载 相关 举报
简易电子琴版本2.docx_第1页
第1页 / 共28页
简易电子琴版本2.docx_第2页
第2页 / 共28页
简易电子琴版本2.docx_第3页
第3页 / 共28页
简易电子琴版本2.docx_第4页
第4页 / 共28页
简易电子琴版本2.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

简易电子琴版本2.docx

《简易电子琴版本2.docx》由会员分享,可在线阅读,更多相关《简易电子琴版本2.docx(28页珍藏版)》请在冰豆网上搜索。

简易电子琴版本2.docx

简易电子琴版本2

 

合肥学院

计算机科学与技术系

 

课程设计报告

2008~2009学年第1学期

 

课程

微型计算机原理与接口技术

课程设计名称

简易电子琴课程设计

学生姓名

赵伟

学号

0604032010

专业班级

06级网络工程

(2)班

指导教师

肖连军

2009年2月10日

一、题义分析及解决方案

1.题义与需求分析

通过STARES598PCI单板机的G6区的1~7号键,通过单板机上的8255A芯片进行音调的选择,由8253芯片控制产生不同频率的方波,并由8255A芯片控制打开单板机上D1区的蜂鸣器,使其对应于G6区的1~7号键由低到高发出1~7的音阶,从而实现简易电子琴的功能。

同时,也可以通过事先设置好的“乐谱”回放一段音乐,其控制键在程序中设定(为A健),设8号键为回奏模块,用于对输入音符的回奏。

2、解决问题方法及思路

1)软件部分(汇编语言编写程序)

1、选择芯片8253

1)芯片8253在本设计中的作用

芯片8253在本实验中主要用于输出一定频率的方波,从而控制蜂鸣器发出一固定频率的声音。

2)芯片8253的功能分析

使用8253芯片的2号计数器,将其设置为“方波发生器”的工作方式(方式3),修改其计数初值,即可在8253芯片的OUT2引脚得到不同频率的方波。

将不同频率的方波输出到蜂鸣器便可以使其发出不同音阶的乐声。

3)芯片8253的技术参数

芯片8253的控制字端口地址为43H,通道2端口地址为42H。

参数名称

符号

测试条件

最大规范值

最小规范值

输入低电平电压

VIL

0.8

-0.5V

输入高电平电压

VIA

Vcc+0.5

2.2V

输出低电平电压

VOL

Vin=Vcc--0V

0.45

输出高电平电压

VOH

Vout=Vcc--0.45V

2.4V

输入负载电流

IIL

+/-10

输出浮动漏电流

IOFL

+/-10

电源电流

Icc

140

表2-18253A的技术参数

参数讨论:

输入低电压的范围是-0.5—0.8,输出低电压的范围0.45—2.4,输入高电压的范围是2.2—Vcc+0.5。

而测试条件均为Vin=Vcc—0V,Vout=Vcc—0.45V

2、选择芯片8255A

1)芯片8255A本设计中的作用

芯片8255A在本实验中主要用于接收1~7号按键的输入,控制蜂鸣器的开关和8253芯片的正常工作。

(8号键用于回奏)

2)芯片8255A的功能分析

8255是可编程并行接口,内部有3个相互独立的8位数据端口,即A口、B口和C口。

三个端口都可以作为输入端口或输出端口。

A口有三种工作方式:

即方式0、方式1和方式2,而B口只能工作在方式0或方式1下,而C口通常作为联络信号使用。

8255的工作只有当片选CS效时才能进行。

而控制逻辑端口实现对其他端口的控制。

8255A方式0是基本输入/输出方式,A、B、C三个口中任何一个口都可提供简单的输入和输出操作,不需要应答联络信号,即可用于无条件传送的场合,也可以用作查询方式传送。

当采用查询方式传送时,原则上可用A、B和C三个口的任一位充当查询信号。

方式0的工作特点:

通常不用联络信号,不使用中断,三个通道中的每一个都有可以由程序选定作为输入或输出。

其功能特点为:

1、两个8位通道:

通道A、B。

两个四位通道:

通道C高4位和低四位;

2、任何一个通道可以作输入/输出;

3、输出是锁存的;

4、输入是不锁存的;

5、在方式0时各个通道的输入/输出可有16种不同的组合。

使用8255A芯片的A口,将其设置为基本输入工作方式,通过A口的8位数据线连接G6区的8位按键数据线,接收用户的输入。

使用8255A芯片的C口,将其设置为基本输出工作方式,通过PC0输出线连接到芯片8253的GATE2口,使其2号计数器正常工作,从而控制蜂鸣器的发声与否。

由于蜂鸣器本身在输入端含有放大电路,所以无需考虑8253输出给蜂鸣器的驱动电流和电压的大小,只须保证其输出的驱动电流和电压位于蜂鸣器电路的输入有效范围内即可。

3)芯片8255A的技术参数

参数名称

符号

测试条件

最大

最小

输入低电平电压

Vol

0.8

-0.5V

输入高电平电压

Vih

Vcc

2.0V

输出低电平电压

(数据端口)

Vol

Iol=2.5mA

0.45

输出低电平电压

(外部端口)

Vol

Iol=1.7mA

0.45

输出高电平电压

(数据端口)

Voh

Ioh=-400mA

2.4V

输出高电平电压

(外部端口)

Voh

Ioh=-200mA

2.4V

达林顿驱动电流

Idar

Rrxt=750v

-4.0mA

-1.0mA

电源电流

Icc

Vrxt=1.5V

120mA

输入负载电流

Ill

Vin

+10/-10mA

输出浮动电流

Iofl

Vofl

+10/-10mA

表2-28255A技术参数表

参数分析:

达林顿驱动电流最大为4.0mA,LED工作电流为20mA,8255A的工作电流为低时,最大为0.45V,工作电流为高时,最小为2.4V,而LED为5V,因此需要一个驱动器来驱动,使工作电流和电压相匹配。

74Ls244的工作电流高电平为15mA,低电平为24mA,因此,244可以作为驱动器在8255A和LED之间起驱动作用。

3、选择二进制开关

1)二进制开关在本设计中的作用

在本实验中,二进制开关用于输入不同的数值,确定频率。

图2-1二进制开关的原理图

2)二进制开关的功能分析

二进制开关为输入器件,通过电平的不同输入不同的二进制数。

3)二进制开关的技术参数

参数分析:

K接Vcc=+5V时为1,接地时输出为0,保护电阻R=100kΩ.GND为接地端。

4、选择蜂鸣器

1)蜂鸣器在本设计中的作用

在本实验中,蜂鸣器用作将8253产生的不同频率装换为不同的音调的声音。

图2-2蜂鸣器原理图

2)蜂鸣器的功能分析

扬声器是将电能转化成声能,并将声能辐射到空气中去的一种电声转换器件。

当输入端输入一定频率的方波时,在RC震荡电路的作用下,蜂鸣器会发出一定频率的声音。

3)蜂鸣器的技术参数

参数分析:

它一般包括灵敏度、频率响应、额定功率、额定阻抗、指向性、失真、音质听感评价等。

本实验只关心工作电压,其工作电压为5V。

4、硬件总逻辑图及其说明

1)、硬件总逻辑图

图2-3本实验的硬件逻辑图

2)、硬件总逻辑图说明

JP74:

按键控制接口;按下为0信号,松开为1信号;JP80:

开关控制接口;闭合-0信号,断开-1信号;P75:

PB口;Ctrl:

控制接口,0-蜂鸣;CS:

片选信号,低电平有效;A0、A1:

地址信号;

2)硬件部分

本次设计的电子琴主要用到了芯片8255和芯片8253。

输入部分主要是由7个按键和一个并行接口8255组成。

7个按键一端接地,另一端接到8255的A口输入,并且通过一个电阻接到+5V。

如下表,当不同的按键按下时,从A口输入就对应一个8位的二进制数据(下表中是用16进制表示的)。

通过软件检测输入的数据,然后给8253送相应频率的计数值。

表1-1各个按键对应的频率

按键

1

2

3

4

5

6

7

对应数据

0FDH

0FBH

0F7H

0EFH

0DFH

0BFH

07FH

对应频率

493Hz

440Hz

392Hz

349Hz

329Hz

293Hz

261Hz

电子琴以8253的2号计数器为核心。

系统初始化时,2号计数器工作在“方波发生器”方式,CPU通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,写入顺序为先低后高,端口61H的最低位控制通道2门控的开断,,CLK2为1MHZ,当计数初值为3E8H时,OUT2输出的方波大约为1000HZ,经过简单的滤波之后,送至蜂鸣器。

通过改变2号计数器的计数初值就可以使蜂鸣器发出不同频率的声音。

在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。

其位组合的格式如下:

图1-18253方式控制字格式

芯片8255A的A口工作于基本输入方式下。

G6区的1~7号按键(S29~S36)直接连接到8255A芯片的A口中,用于控制芯片8253的2号计数器的计数初值,从而使8253芯片能够对于不同的按键产生与其相对应的发声频率。

芯片8255A的C口工作于基本输出方式下。

8255A芯片的C口的引脚PC0连接至8253芯片2号计数器的GATE引脚上,只有当PC0输出高电平至GATE引脚时,8253芯片的2号计数器才正常工作,产生方波,从而使蜂鸣器发出有规则的声音。

反之则不会产生任何频率方波,那么蜂鸣器也就不会发出任何的声音。

通过8255A芯片对8253芯片的控制来达到对蜂鸣器的是否发声的控制

三、控制程序设计

1、控制程序设计思路说明

程序采用模块化设计,分为显示模块,演奏模块,蜂鸣器开关模块,回放功能模块,延时模块等。

显示模块用于显示用户菜单,供用户选择电子琴的功能以及显示当前电子琴的功能状态。

回放功能模块用于从“乐谱”中读取数据,并转换为计数初值传给8253的2号计数器。

演奏模块则用于接收用户的按键输入,判断音阶然后传递规定的计数初值给计数器。

蜂鸣器开关模块则用于打开和关闭蜂鸣器,并以8253提供的方波频率发声。

2、程序流程图

图3-1主程序

图3-2演奏模块流程图

 

 

 

N

 

N

 

N

 

N

 

N

 

N

 

N

 

图3-3发音子程序

 

N

 

 

 

图3-4回放子程序

 

图3-5界面输出子程序

图3-6延时子程序

 

图3-7回奏子程序

3、控制程序

.MODELTINY

PCIBAR3EQU1CH;8位I/O空间基地址(它就是实验仪的基地址,也为DMA&32BITRAM板卡上的8237提供基地址)

Vendor_IDEQU10EBH;厂商ID号

Device_IDEQU8376;设备ID号

.STACK100

.DATA;数据段

IO_Bit8_BaseAddressDW?

msg0DB'BIOS不支持访问PCI$'

msg1DB'找不到StarPCI9052板卡$'

msg2DB'读8位I/O空间基地址时出错$'

msg3DB'电子琴程序$'

msg4DB'请选择:

$'

muslist1DB'A回放$'

muslist2DB'B演奏$'

muslist3DB'Q退出$'

COM_ADDDW00F3H;8255控制口偏移量

PA_ADDDW00F0H;PA口偏移量

PB_ADDDW00F1H;PB口偏移量

PC_ADDDW00F2H;PC口偏移量

COM_ADDRDW00B3H;8253控制口偏移量

T0_ADDRDW00B0H;8253T0计数器偏移量

T1_ADDRDW00B1H;8253T1计数器偏移量

T2_ADDRDW00B2H;8253T2计数器偏移量

FEQ_Data1DW294;给定与音符对应的频率

;此行是"DO"的频率值

FEQ_Data2DW330;此行是"RI"的频率值

FEQ_Data3DW370;此行是"MI"的频率值

FEQ_Data4DW410;此行是"FA"的频率值

FEQ_Data5DW860;此行是"SO"的频率值

FEQ_Data6DW930;此行是"LA"的频率值

FEQ_Data7DW1000;此行是"XI"的频率值

resultdw100dup(?

musfreqDW294,330,370,294,294,330,370,294

DW370,410,930,370,410,930

DW930,1000,930,860,370,294

DW930,1000,930,860,370,294

DW370,330,294;给一编好的乐进行回放谱

DW370,330,294,-1;上面是《两只老虎》的频率表

.CODE;程序段

START:

MOVAX,@DATA

MOVDS,AX;将数据段的地址放到ds中

CALLInitPCI;初始化PCI卡

CALLModifyAddress;根据PCI提供的基地址,将偏移地址转化为实地址

XORAX,AX;清空AX,取消第二次输入时对下面的影响

LEADX,msg3;

MOVAH,9;9号功能调用,输出字符串msg3的内容

INT21H;并送到信息窗Dos标签中,以$字符(24h)结尾

LEADX,muslist1

MOVAH,9;9号功能调用,输出字符串muslist1的内容

INT21H;并送到信息窗Dos标签中,以$字符(24h)结尾

LEADX,muslist2

MOVAH,9;9号功能调用,输出字符串

INT21H

LEADX,muslist3

MOVAH,9;9号功能调用,输出字符串

INT21H

LEADX,msg4

MOVAH,9;9号功能调用,输出字符串

INT21H

movsi,0

b:

MOVAH,01H;接受用户键盘输入

INT21H

CMPAL,'Q';比较输入的字符,看与目字符标是否一,退出

JZbbb;=0跳转

CMPAL,'A';回放

JNZB0;不=0跳转

CALLREPLAY;重播子程序

JMPEXIT

B0:

CMPAL,'B';演奏

JZbb

MOVDX,COM_ADD

MOVAL,90H;10010000工作于方式0A口输入C口(pc0)输出

OUTDX,AL

MOVDX,COM_ADD

MOVAL,00H;控制端口c的pc0

outDX,AL

 

K0:

MOVDX,PA_ADD

INAL,DX;从8255A口输入一个数据

CMPAL,0FEH;以下为检测哪个键被按下,如下

JZK1;k1键跳转到K1

CMPAL,0FDH

JZK2;k2键跳转到K2

CMPAL,0FBH

JZK3;k3键跳转到K3

CMPAL,0F7H

JZK4;k4键跳转到K4

CMPAL,0EFH

JZK5;k5键跳转到K5

CMPAL,0DFH

JZK6;k6键跳转到K6

CMPAL,0BFH

JZK7;k7键跳转到K7

CMPAL,07FH

JZK8;k8键跳转到K8

bb:

JMPEXIT;如没有键按下,则跳到EXIT

bbb:

JMPbbbb

xx:

jmpk0

K1:

JMPhui;如果为K1按下,返回开始菜单进行重新选择

K2:

MOVBX,FEQ_Data1;如为其它键则把相应的频率送给BX

JMPSOUNDF

K3:

MOVBX,FEQ_Data2

JMPSOUNDF

K4:

MOVBX,FEQ_Data3

JMPSOUNDF

K5:

MOVBX,FEQ_Data4

JMPSOUNDF

K6:

MOVBX,FEQ_Data5

JMPSOUNDF

K7:

MOVBX,FEQ_Data6

JMPSOUNDF

K8:

MOVBX,FEQ_Data7

SOUNDF:

MOVDX,10H;输入给8253T2计数器的频率初值为1MHz

MOVAX,0000H

DIVBX;DIV无符号除法

;频率初值除以相应的发音频率即得到相应的计数初值

movresult[si],ax

addsi,2

CALLSOUND

;调用发音子程序

CALLDELAY;调用延时程序

EXIT:

MOVAH,06H;有无键盘动作请求输入

MOVDL,0FFH

INT21H

JZxx;如果没有,则跳到K继续循环,检测用户的按键输入

bbbb:

;跳转子程序

MOVAH,4CH;如果有,则结束返回

INT21H

;以下是发音子程序

SOUNDPROCNEAR

PUSHAX

MOVDX,COM_ADDR;初始化8253,向8253控制口写入控制字

MOVAL,0BFH;"10111111",即选通道2,先低后高写入计数器

;方式3,BCD码计数

OUTDX,AL

POPAX

MOVDX,T2_ADDR;向8253T2计数器写入计数初值

OUTDX,AL;送计数值

MOVAL,AH

OUTDX,AL

MOVDX,COM_ADD;向8255控制口写C口置位复位控制字

MOVAL,01H

OUTDX,AL

RET

SOUNDENDP

REPLAYPROCNEAR

LEASI,musfreq

FRE:

MOVBX,[SI]

;获得当前指向的频率表中对应地址中的内容,送到BX

CMPBX,-1

;当发现当前指向的地址中的值为"-1",则结束

JEREPLAYEND

MOVDX,10H;输入给8253T2计数器的频率初值为1MHz

MOVAX,0000H

DIVBX;频率初值除以相应的发音频率即得到相应的计数初值

CALLSOUND;调用发音子程序

CALLDELAY;调用延时子程序

ADDSI,2

;每播放一个音符后,将频率表中的地址指针向后移动一位

JMPFRE

REPLAYEND:

RET

REPLAYENDP

huiprocnear

MOVSI,0

loop1:

movax,result[si]

callSOUND

callDELAY

incsi

incsi

LOOPLOOP1

MOVSI,0

RET

huiENDP

DELAYPROCNEAR

PUSHAX

PUSHDX

MOVDX,300;延时300ms

MOVAH,0FFH;星研公司提供的软中断

INT21H

 

POPDX

POPAX

RET

DELAYENDP

InitPCIPROCNEAR;板卡的初始化

MOVAH,00H

MOVAL,03H

INT10H;清屏

MOVAH,0B1H

MOVAL,01H

INT1AH;读取该卡PCI9052基地址

CMPAH,0

JZInitPCI2

LEADX,msg0

InitPCI1:

MOVAH,09H

INT21H

JMPExit

InitPCI2:

MOVAH,0B1H

MOVAL,02H

MOVCX,Device_ID

MOVDX,Vendor_ID

MOVSI,0

INT1AH

JNCInitPCI3;是否存在StarPCI9052板卡

LEADX,msg1;lea取有效地址指令

JMPInitPCI1

InitPCI3:

MOVDI,PCIBAR3

MOVAH,0B1H

MOVAL,09H

INT1AH;读取该卡PCI9052基地址

JNCInitPCI4

LEADX,msg2

JMPInitPCI1

InitPCI4:

ANDCX,0FFFCH

MOVIO_Bit8_BaseAddress,CX

RET

InitPCIENDP

ModifyAddressPROCNEAR

ADDCOM_ADD,CX

ADDPA_ADD,CX

ADDPB_ADD,CX

ADDPC_ADD,CX

ADDCOM_ADDR,CX

ADDT0_ADDR,CX

ADDT1_ADDR,CX

ADDT2_ADDR,CX

RET

ModifyAddressENDP

ENDSTART

四、上机调试过程

1、硬件调试

在各个硬件芯片之间的连接调试中,需要我注意的主要是连接的可靠性。

由于本课程设计所涉及的芯片都是我们学习过的,加之我在初期的硬件逻辑设计中未出现较大错误。

在硬件的调试过程中我遇到过两个主要的问题。

一个问题是8253和8255A芯片的片选信号到底应该由单板机接线板上的哪些接口给出。

经过询问、查阅资料及和同学之讨论,,最终确定了较为合适的接线方案,即8253的片选信号由接线板上的CS5给出,8255A的片选信号由CS1给出。

另一个问题是如何确定可以使蜂鸣器正常发出对应于每一个音阶声音的频率。

由于单板机上的蜂鸣器构造不同于一般常见的发音蜂鸣器,导致在测试蜂鸣器时,虽然给蜂鸣器的方波频率为标准的发音频率,但发出的声音确较为刺耳。

因此,我们对于每一个音阶所需要的频率,都进行了实际的测试与调整,并且也从网络上获得了响应的需要的频率,最终得到了比较合适的频率,从而是从听觉上感到适应。

 

2、软件调试

软件的调试中,我所遇到的问题主要集中在程序的人机交互方面和回放功能的实现以及对输入的音符的回放上(回奏)。

为了能达到人机交互目的,我在程序中设计了一个选择菜单,用户通过对菜单项的选择来调用程序中的相应功能模块。

在程序的编写过程中,采用的是模块化的设计思想,各个功能之间互相独立互不干扰,然而对于寄存器的初值问题确未能给予足够的注意。

即当调用完一个功能模块后,忽略了对寄存器的善后处理,未对使用过的相关寄存器进行初始化,造成调用其它模块时的寄存器初值错误,使整个的实验出现错误。

这种问题找错时也比较的困难,通过与同学的交流与讨论逐渐的客服各种困难、解决了问题进而将程序完成。

对于程序的回放功能,开始我都不知道从何入手,后来和同学讨论后我将频率进行存储,即设立一个频率表和一个延时时间,通过程序对这表中的数据进行读

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

当前位置:首页 > 考试认证 > 交规考试

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

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