简易电子琴版本2.docx
- 文档编号:12053787
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:28
- 大小:291.89KB
简易电子琴版本2.docx
《简易电子琴版本2.docx》由会员分享,可在线阅读,更多相关《简易电子琴版本2.docx(28页珍藏版)》请在冰豆网上搜索。
简易电子琴版本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、软件调试
软件的调试中,我所遇到的问题主要集中在程序的人机交互方面和回放功能的实现以及对输入的音符的回放上(回奏)。
为了能达到人机交互目的,我在程序中设计了一个选择菜单,用户通过对菜单项的选择来调用程序中的相应功能模块。
在程序的编写过程中,采用的是模块化的设计思想,各个功能之间互相独立互不干扰,然而对于寄存器的初值问题确未能给予足够的注意。
即当调用完一个功能模块后,忽略了对寄存器的善后处理,未对使用过的相关寄存器进行初始化,造成调用其它模块时的寄存器初值错误,使整个的实验出现错误。
这种问题找错时也比较的困难,通过与同学的交流与讨论逐渐的客服各种困难、解决了问题进而将程序完成。
对于程序的回放功能,开始我都不知道从何入手,后来和同学讨论后我将频率进行存储,即设立一个频率表和一个延时时间,通过程序对这表中的数据进行读
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 电子琴 版本