OUT1端要每隔1s输出一个5ms的负脉冲,计数通道1应工作在方式2,必须输入周期为5ms的时钟脉冲,计数初值为1s/5ms=200
MOV DX,43H
MOV AL, 36H
OUT DX,AL
MOV DX,40H
MOV AX,10000 //2710H
OUT DX,AL
MOV AL, AH
OUT DX, AL
//以上是通道0程序
MOV DX,43H
MOV AL, 01010100B
OUT DX,AL
MOV DX,41H
MOV AL,200 // C8H
OUT DX,AL
//以上是通道1程序
7.3.2 8254工作方式及其初始化编程http://www.tyut.edu.cn/kecheng1/2008/site04/courseware/chapter7/7.3.2.htm
7.3.2 8254工作方式及其初始化编程
1.8254工作方式
8254的每个计数器有六种工作方式,同一芯片中的三个计数器可以通过初始化分别设定为不同的工作方式,但是不论哪种工作方式都应遵循以下规则:
① 控制字写入控制寄存器后,控制逻辑电路复位,输出信号OUT进入初始状态(高电平或低电平)。
② 计数初始值写入CR后,经过一个时钟周期,送入CE。
③ 通常在时钟脉冲CLK的上升沿对门控信号GATE采样。在不同工作方式下,对门控信号的触发方式有不同的要求。
④ 在时钟脉冲CLK的下降沿,计数器减“1”计数。
(1)方式0:计数结束产生中断(interrupt on terminal count)
方式0时序如图7.21所示。 图7.21 方式0时序
在写入控制字CW(control word)后,OUT引脚初始电平为低电平,写入计数初始值N之后的第一个CLK的下降沿将N装入计数执行部件,待下一个CLK的下降沿到来且门控信号GATE为高电平时,开始启动减“1”计数,随后每一个CLK的下降沿,计数器减1。在计数过程中,OUT引脚一直保持低电平,直到计数为“0”时,OUT引脚输出由低电平变为高电平,并且保持高电平。
方式0的特点:计数初始值无自动装入功能,若要继续计数,则需要重新写入计数初始值。门控信号GATE用来控制CE,当GATE为高电平时,允许计数;当GATE为低电平时,禁止计数。当GATE重新为高电平时,计数器接着当前的计数值继续计数。计数期间给计数器装入新值,则会在写入计数初始值后重新开始计数过程。
由于方式0在计数结束后,OUT引脚输出一个由低电平到高电平的跳变信号,因此可以用它作为计数结束的中断请求信号。
(2)方式1:可重复触发的单稳态触发器(hardware retriggerable one shot)
方式1时序如图7.22所示,图7.22 方式1时序
在写入控制字CW后,OUT引脚初始电平为高,写入计数值N后,计数器并不开始计数,直到GATE上升沿触发之后的第一个CLK的下降沿,将N装入CE,待下一个CLK的下降沿开始计数,OUT引脚由高电平变为低电平。在整个计数过程中,OUT引脚都保持低电平,直到计数为“0”时变为高电平。一个计数过程结束后,OUT引脚输出一个宽度为N倍时钟周期的负脉冲,可作为单稳态触发器的输入信号。
方式1的特点:硬件启动计数,即由门控信号GATE的上升沿触发计数。在计数过程中,CPU可改变计数值,但是对计数过程没有影响。计数为“0”,OUT引脚输出高电平,若再次触发,则计数器将按新输入的计数初始值进行计数。
(3)方式2:分频器(rate generator)
方式2时序如图7.23所示, 图7.23 方式2时序
控制字CW写入之后,OUT引脚初始电平为高,在写入计数值N之后第一个CLK的下降沿将N装入计数执行单元CE,待下一个CLK的下降沿到来且门控信号GATE为高电平时,启动计数。在计数过程中,OUT引脚始终保持高电平,直到CE减到“1”时,OUT引脚变为低电平,维持一个时钟周期后,又恢复为高电平,同时自动将计数值N加载到CE,重新启动计数,形成循环计数过程,OUT引脚连续输出负脉冲。
方式2的特点:计数初始值有自动装入功能,不用重新写入计数值,计数过程可由GATE信号控制。当GATE为低电平时,暂停计数;在GATE变为高电平后的下一个CLK脉冲使计数器恢复计数初始值,重新开始计数。
(4)方式3:方波发生器(square wave mode)
方式3时序如图7.24所示, 图7.24 方式3时序
工作原理与方式2类似,有自动重复计数功能,但OUT引脚输出的波形不同。当计数值N为偶数时,OUT输出对称的方波信号,正负脉冲的宽度为个时钟周期;当计数值N为奇数时,OUT输出不对称的方波信号,正脉冲宽度为个时钟周期,负脉冲宽度为个时钟周期。
(5)方式4:软件触发计数(software triggered strobe)
方式4时序如图7.25所示, 图7.25 方式4时序
写入控制字CW后,OUT初始电平为高,在写入计数初始值N之后的第一个CLK的下降沿将N装入计数执行单元CE,待下一个计数脉冲信号CLK到来且门控信号GATE为高电平时(即软件启动),开始计数。当计数为“0”时,OUT引脚由高电平变为低电平,维持一个时钟周期,OUT引脚由低电平变为高电平。一次计数过程结束后,OUT引脚输出宽度为一个时钟周期的负脉冲信号.
方式4的特点:无自动重复计数功能,只有在输入新的计数值后,才能开始新的计数。若设置的计数值为N,则在写入计数值N个时钟脉冲之后,才使OUT引脚产生一个负脉冲信号。
(6)方式5:硬件触发计数(hardware triggered strobe)
方式5时序如图7.26所示, 图7.26 方式5时序
写入控制字CW后,OUT引脚初始电平为高,在写入计数值N后,计数器并不开始计数,只有GATE信号出现由低到高的上升沿(即硬件启动)之后的第一个CLK的下降沿,将N装入计数执行单元CE,待下一个CLK的下降沿才开始计数。当计数为“0”后,OUT引脚由高电平变为低电平,维持一个时钟周期,OUT引脚由低电平变为高电平。一次计数过程结束后,OUT引脚输出宽度为一个时钟周期的负脉冲信号。
方式5输出波形与方式4相同。两种工作方式的区别是:方式4为软件启动计数,即GATE=1,写入计数初始值时启动计数;方式5为硬件启动计数,即先写入计数初始值,由GATE的上升沿触发,启动计数。
在设置8254的工作方式时,需要注意上述六种工作方式的一些特点:方式0, 1, 4, 5的计数初始值无自动加载功能,当一次计数结束后,若要继续计数,需要再次编程写入计数值;方式2和方式3的计数初始值有自动加载功能,只要写入一次计数值,就可以连续进行重复计数。方式2, 4, 5的输出波形虽然相同,即都是宽度为一个时钟周期的负脉冲,但方式2可以连续自动工作,方式4由软件触发启动,方式5由硬件触发启动。
8254的六种工作方式的特点及其功能见表7.5。
表7.5 8254的六种工作方式的特点及其功能
2.8254初始化编程
8254的每个计数器都必须在写入控制字和计数初始值后,才能启动工作,因此,在初始化编程时,必须通过写入控制字来设定计数器的工作方式和写入计数初始值。
(1)控制字的格式
8254控制字的格式如图7.27所示。
图7.27 8254控制字的格式
D0:计数初始值计数方式选择。D0=1,BCD码计数;D0=0,二进制数计数。
8254有BCD码和二进制数两种计数方式。若采用二进制数计数(16位),计数值的范围为0000~FFFFH,最大值为216,即十进制数的65536,表示为0000H;若采用BCD码计数(四位十进制数),计数值的范围为0000~9999,最大值为104,即十进制数的10000,表示为0000。
D3D2D1:工作方式选择位。因为M2M1M0的二进制编码有八种(即000~111),而8254有六种工作方式,所以,方式2和方式3的M2位可设为任意值0或者1。
D5D4:读/写计数器控制。计数值的读出或写入可按字节或字两种方式进行 *** 作,用RW1和RW0的编码01, 10, 11来控制读出或写入计数值的顺序和字节数。若按字节读/写时,可选择低8位或高8位;若按字读写时,分为两步完成,即先读/写低8位后读/写高8位。
D7D6:计数器选择。D7D6的四个状态分别对应选择计数器0, 1和2,三个计数器的控制寄存器使用相同的端口地址。
需要注意的是:CPU对8254的某个计数器进行读出 *** 作时,有两种方法。一种方法是先由控制字的RW1和RW0设定读出顺序与格式,然后由输入(IN)指令对所选计数器进行读出 *** 作。采用这种方法时,为了确保被读出的当前计数值稳定,可利用门控信号GATE或者阻止时钟输入的方法,暂时禁止计数器 *** 作。另一种方法是先给8254发锁存命令(即设定RW1和RW0为00),然后按照先读取低字节、后读取高字节的顺序将当前计数值读出。当8254接收到锁存命令后,将当前的计数值锁存到计数锁存寄存器中,供CPU读取。
(2)8254的读回命令
8254的读回命令可以将三个计数器的计数值和状态锁存,并向CPU返回一个状态字,如图7.28所示。
图7.28 8254的读回命令
D7=1, D6=1时,为读回命令。
D5=0为锁存计数值,以便CPU读取当前计数值。
D4=0为锁存状态信息。
D3~D1是计数器选择位,一次可以锁存一个计数器、两个计数器或者三个计数器中的计数值或状态信息。当某一计数器的计数值或状态信息被CPU读取后,锁存失效。
读回命令写入控制端口,状态信息和计数值都通过计数器端口读取。如果使读回命令的D5和D4位都为0,即状态信息和计数值都要读回,读取的顺序是:先读取状态信息,后读取计数值。
(3)计数初始值的设定
计数初始值(或称计数常数)可根据8254的实际应用和工作方式来设定,一般有如下几种情况:
① 作为发生器,应选择方式2或方式3。它实际上是一个分频器,因此计数常数就是分频系数,即:分频系数(fi为输入CLK频率,f0为OUT输出频率)。
② 作为定时器,计数脉冲CLK通常来自系统内部时钟,计数常数就是定时系数,即:定时系数(T为定时时间,tclk为时钟周期,fclk为时钟频率)。
③ 作为计数器,计数脉冲通常来自系统外部,因此,计数常数为外部事件的脉冲个数。
(4)8254初始化编程
在编写初始化程序时,由于8254的三个计数器的控制字都是独立的,而他们的计数常数都有各自的地址单元,因此初始化编程顺序比较灵活,可以写入一个计数器的控制字和计数常数之后,再写入另一个计数器的控制字和计数常数,也可以把所有计数器的控制字都写入之后,再写入计数常数。需要注意的是:计数器的控制字必须在其计数常数之前写入,计数常数的低8位须在高8位之前写入。下面通过示例说明8254的初始化编程方法。
【例7.6】 某系统使用一片8254,要求完成如下功能:
① 计数器0对外部事件计数,记满100次向CPU发出中断请求;
② 计数器1产生频率为1kHz的方波信号,设输入时钟CLK1为2.5MHz;
③ 计数器2作为标准时钟,每秒向CPU发一次中断请求,输入时钟CLK2由OUT1提供。
根据题意,确定相应通道的工作方式控制字及计数常数:
计数器0的控制字为00010000B,即10H(方式0、二进制计数),计数常数为100。
计数器1的控制字为01110110B,即76H(方式3、二进制计数)。
计数常数为:=2.5MHz/1kHz=2500。
计数器2的控制字为10110001B,即B1H(方式0、BCD计数)。
计数常数为:=1s×1kHz=1000。
设8254的端口地址为80H~83H,编制初始化程序如下:
MOV AL, 10H 计数器0控制字
OUT 83H, AL 写入控制端口
MOV AL, 100 计数常数100
OUT 80, AL 写入计数器0的低字节
MOV AL, 76H 计数器1控制字
OUT 83H, AL 写入控制端口
MOV AX, 2500 计数常数2500
OUT 81H, AL 写入计数器1低字节
MOV AL, AH
OUT 81H, A 写入计数器1高字节
MOV AL, 0B1H 计数器2控制字
OUT 83H, AL 写入控制端口
MOV AX, 1000H计数常数1000(BCD码为1000H)
OUT 82H, AL 写入计数器2低字节
MOV AL, AH
OUT 82H, AL 写入计数器2高字节
有图,Q我1352282
设计任务及要求
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
对应数据 0FEH 0FDH 0FBH 0F7H 0EFH 0DFH 0BFH 7FH
对应频率 静音 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 ;延时循环
DEC BX ;(BX)=脉冲持续的时间
JNZ SOUND
MOV AL,AH
OUT 61H,AL ;恢复61H端口
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)