微机原理及应用课程设计-Read 下载本文

微机原理及应用课程设计

一. 设计任务及要求

1. 以8255接八个开关K1~K8,做电子琴按键输入。

2. 以8253控制扬声器,拨动不同的开关,发出相应的音阶。 要求: K1—静音

K2—发si的音493Hz K3—发la的音440Hz K4—发sol的音392Hz K5—发fa的音349Hz K6—发mi的音329Hz K7—发re的音293Hz K8—发do的音261Hz

二. 方案比较和认证

通过8255和8253来实现电子琴模拟,主要可以分成两部分,分别为输入部分和发音部分。输入部分主要是由8255和8个常开型开关来完成。常开型开关如右图。8个常开型开关K1~K8与8255的A口PA0~PA7相接,不触动开关时,为高电平输入,当按下开关时,就接地,为低电平输入。例如当K1键按下时,从8255中A口输入的数为11111110B,十六进制为0FEH。每一个开关按下时,都对应一个ASCII码,如下表所示: 开 关 K1 K2 K3 K4 K5 K6 K7 K8 0FBH 0F7H 0EFH 0DFH 0BFH 7FH 对应数据 0FEH 0FDH 对应频率 静音 493 Hz 440 Hz 392 Hz 349 Hz 329 Hz 293 Hz 261 Hz 输入部分的硬件实现比较简单,所以说主要还是在发音部分。在设计中驱动扬声器地声的主要有两种方式,分别是以位触发和定时器控制。下面就这两种不同的方式确定两个不同的设计方案。

方案1:

发声采用位触发方式。电路原理图如下所示。程序直接控制PPI(8255可编程序外围接口芯片)的输出控制寄存器(I/O端口为61H)的第一位,使该位按所需的频率进行1和0的交替变化,从而产生一串脉冲控制波形,这些脉冲经过放大后驱动扬声器发出声音。

可以利用软件延时来控制所产生的脉冲波形的长度和脉宽,就可以实现产生不同频率和不同音长的声音。软件实现的程序如下:

IN AL,61H MOV AH,AL

AND AL,0FCH ;关断定时器通道2的门控 SOUND:XOR AL,2 ;触发61H端口第1位 OUT 61H,AL

MOV CX,DX ;(DX)=控制脉冲的计数值 WAIT: LOOP WAIT ;延时循环

1

微机原理及应用课程设计

DEC BX ;(BX)=脉冲持续的时间 JNZ SOUND MOV AL,AH

OUT 61H,AL ;恢复61H端口

在本方案中,通过程序的方法来控制PB1,使其在1和0之间按一定的频率变,从而产生一串脉冲。控制脉冲宽度的计数值的算法如下:

计数值=2801*100/音频

如果音频为f,则脉冲周期1/f一个半波的时间为1/2f秒,而1/2f秒的延时可简单地通过LOOP指令的循环来取得,由于2801次LOOP指令循环执行所需时间是10MS,所以一秒钟时间约执行2801*100次LOOP指令。控制脉冲宽度的计数值的实现程序如下: MOV AX,2801

MOV BX,50 ;频率不同该值就不同 MUL BX

DIV DI ;(DI)= f MOV DX,AX ;(DX)=1/2f

算出了脉冲宽度,再通过高低电平的不断变换,就可实现不同频率的脉冲方波。把此方波经滤波放大即可驱动扬声器发声了。

方案2:

利用定时器发声。这里是通过硬件即8253定时器产生声音。 CUP通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。当定时器接收的计数值为533H时,能产生896Hz的声音,因此产生其他频率的计数值就可由下式计算:

计数值=533H×896÷ f=1234DCH÷ f

2

微机原理及应用课程设计

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

当通道2用于发声时,采用的是模式3,在模式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。 产生指定频率声音的程序段如下: MOV AL,0B6H

OUT 43H,AL ;43H为8253的控制字端口 MOV DX,12H MOV AX,34DCH

DIV DI ;(DI)=频率

OUT 42H,AL ;42H为8253的通道2端口 MOV AL,AH MOV 42H,AL

从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特殊的音频信号,端口61H的PB1位和定时器的输出信号同时作为与门的输入,PB0和PB1位可由程序决定为0还是为1。显然只有PB0和PB1都是1时,才能使扬声器发出声音。控制音长的时间可以简单地通过反复执行指令来得到。我们知道执行2801次LOOP指令约需要10MS的时间。因此用10MS的倍数值来控制扬声器开关的时间间隔,就可控制发声的音长了。实现程序如下: IN AL,61H MOV AH,AL OR AL,3

OUT 61H,AL ;开扬声器 L: MOV CX,2801 DY:LOOP DY DEC BX JNZ L

MOV AL,AH

OUT 61H,AL ;关扬声器

3