一、工作方式
1、方式0——计数结束后输出由低变高
(1)工作过程
当写入方式0控制字后,计数器输出段OUT立即变成低电平。当写入计数初值N后,若GATE为高电平,计数器开始计数。
在计数过程中,OUT端一直维持为低,直到计数为0(计数)时,OUT端变为高,此时可以设置为向CPU发出中断请求。
在计数过程中,若GATE变为低电平,暂时停止计数,OUT不变,直到GATE变为高电平后继续接着计数,到计数为0(结束)时,呕吐端变为高,此时可以设置为向CPU发出中断请求。
8253用作计数器时,一般都工作在方式0。
(2)特点
- 计数器只计一遍数。当计数到0时,并不回复计数初值,不开始重新计数,输出段OUT由低变高且一直保持为高。只有当写入一个新的计数初值后,OUT才变低,开始新的计数。
- 在计数过程中可改变计数值。如果计数器为8位,在写入新的8位计数值后,计数器将按新的计数值重新开始计数。如果计数器为16位,在写入第一个字节后,计数器停止计数,在写入第二个字节后,计数器按照新的数值开始计数。
- 在计数过程中,可由门控信号GATE暂停。当GATE=0时,计数器暂停计数;当GATE变为1后,就接着计数。
- 方式0的OUT信号在计数到0时由低变高,可作为中断请求信号。但由于8253内部没有中断控制电路,通常接8259中断控制器。
2、方式1——可程控的单脉冲
(1)工作过程
写入控制字后,OUT输出高电平,此时并不开始计数。写入计数初值后,当门控制信号GATE变为高电平时(边沿触发!),启动计数,OUT输出变低。在整个计数过程中,OUT都维持低,直到计数到0时,输出变为高。因此,输出为一单脉冲,其低电平维持时间由装入的计数初值来决定。
(2)特点
当计数到0后,计数器可再次由外部启动(GATE信号跳变依次),按原计数初值重新开始计数,输出单脉冲,二不需要再次送一个计数初值。
在计数过程中,外部可发出门控脉冲,进行再触发。这时不管原来计数到何值,计数器将重新开始计数,输出端仍保持低电平。
计数过程中改变计数初值不影响本次计数过程。若门控信号再次被触发,则计数器才按新的计数值计算。
方式0 | 方式1 |
---|---|
设置计数初值后立即计数。 | 设置计数初值后不立即计数,直到有外部触发信号后才开始计数。 |
在计数过程中能用门控信号暂停计数 | 在计数过程中若有门控脉冲时不停止计数,而是使计数过程重新开始。 |
在计数过程中改变计数初值时,原计数停止,立即按新的初值开始计数。 | 在计数过程中当改变计数初值时,现行计数不受影响,新计数初值在下次启动计数后才起作用。 |
在一次计数结束后,必须重新设置设置计数初值才能再次计数,即计数初值只能使用一次。 | 计数初值在一次计数过程完成后继续有效。 |
3、方式2——分频器
(1)工作过程
写入控制字后,计数器输出端为高电平。写入计数初值后,只要GATE为高电平(电平触发!)计数器立即对CLK端的输入脉冲计数。
在计数过程中输出端始终保持为高,直到计数器减为1,输出变低。经过一个CLK周期,输出回复为高,同时按照原计数初值重新开始计数。如果计数初值为N,则在每输入N个脉冲后,输出一个脉冲。因此,这种方式可以作为分频器或用于产生实时时钟中断。
(2)特点
不用重新设置计数初值,计数到0后自动装入初值,计数器能够连续工作,输出固定频率的脉冲。
计数过程可由门控信号GATE控制。当GATE为0时,暂停计数。当GATE变为1后,下一个CLK脉冲使计数器回复初值,重新开始计数。
在计数过程中可以改变计数初值,这对正在进行的计数过程没有影响。但当计数到1时输出变低,过一个CLK周期输出又变高,计数器将按新的计数值计数。所以对方式2改变计数初值时,在下一次计数有效。
4、方式3——方波发生器
(1)工作过程
写入控制字后,输出为高电平。GATE为高电平时(电平触发!),在写入计数初值后就开始计数,输出保持为高。当计数到一半计数初值时,输出变为低,直到计数为0,输出又变为高,重新开始计数。
(2)特点
当计数初值N为偶数时,输出端的高低电平持续时间相等,各为N/2个CLK脉冲周期;当计数初值N为奇数时,输出端的高电平持续时间比低电平持续时间多一个脉冲周期。即高电平持续(N+1)/2个脉冲周期,低电平持续(N-1)/2个脉冲周期。
当GATE为1时,允许计数;当GATE=0时,停止计数。如果在OUT为低电平期间GATE=0,OUT将立即变高。当GATE变高以后,在下一个CLK脉冲来到时,计数器将重新装入初始值,开始计数。在这种情况下通过门控信号使计数器实现同步,称为硬件同步。
如果GATE信号一直为高电平,在写入控制字和计数值后,将在下一个CLK脉冲来到时装入计数初值,这种情况称为软件同步。
在计数期间写入一个新的计数初值,如果在输出信号半周期结束之前没有收到GATE脉冲,则要在现行输出半周期结束后才按新的计数初值开始计数。
在写入新计数初值之后在现行输出半周期结束之前GAET=0,OUT立即变为高,计数器停止工作,当GATE=1后,将在下一个CLK脉冲来到时立即装入新的计数初值并开始计数。
5、方式4——软件触发的选通信号发生器
(1)工作过程
写入控制字后,输出端OUT变成高电平,以此作为初始电平。
当写入计数初值后开始计数,称为软件触发(前提条件是GATE为高电平)。
当计数到0后,输出变低,经过一个CLK周期,输出又变高,计数器停止计数。这种方式计数也是一次性的,只有在输入新的计数值后,才开始新的计数过程。若设置的计数初值为N,则是在写入了计数初值后经过N个CLK脉冲,才输出一个负脉冲。一般将此负脉冲作为选通信号。
(2)特点
当GATE=1时,允许计数;当GATE=0时,禁止计数。所以,要做到软件触发,GATE应保持为1。
在计数过程中,若改变计数初值,则在本次计数结束,下一周期开始按新的计数初值开始计数。这称为软件再触发。16位数,在设置第一个字节后停止计数,在设置第二个字节后开始计数。
6、方式5——硬件触发的选通信号发生器
(1)工作过程
写入控制字后,输出端出现高电平,写入计数初值后,计数器并不立即开始计数,而是要由门控脉冲的上升沿来启动计数,称为硬件触发。当计数到0时,输出变低,又经过一个CLK周期,输出恢复为高电平。这样在输出端得到一个负脉冲选通信号。计数器停止计数后要等到下次门控脉冲触发,才能再惊喜计数。
(2)特点
若设置计数初值为N,则在门控脉冲触发后,进过N个CLK脉冲,才输出一个负脉冲。
在计数过程中,若GATE端又出现一个脉冲进行触发,则使计数器重新开始计数,但对输出状态没有影响。
如果在计数过程中改变计数值,只要没有门控信号的触发,就不影响本次计数过程。当计数到0后,若右有新的门控信号的触发,则按新的计数初值计数。
方式4 | 方式5 |
---|---|
每次要靠软件设置计数初值后才能计数(软件触发)。 | 计数初值只需设置一次,但是每次计数要靠门控信号的触发(硬件触发)。 |
软件更改计数初值后立即起作用。 | 软件更改计数初值后要有新的门控信号的触发才能起作用。 |
- 例1:设8086系统中8253的三个计数器的端口地址为060H,062H和064H,控制口地址为066H,要求计数器0为方式 1,按BCD计数;计数初值为1800D,计数器1为方式0,按二进制计数;计数初值为1234H,计数器2为方式3,按二进制计数;当计数初值为065H时,试分别写出计数器0,1,2的初始化程序。
计数器0的初始化:
计数0的控制字:00100011B=23H
MOV AL,23H ;计数器0的控制字
OUT 0 66H,AL ;控制字写入8253的控制器
MOV AL,18H ;取计数初值的高8位,低8位00可不送
OUT 060H,AL ;计数初值送计数器0端口
计数器1和初始化:
计数器1的控制字:01110000B=70H
MOV AL,70H ;计数器的控制字:方式0,送高8位和低8位,二进制计数
OUT 066H,AL ;控制字写入8253的控制器
MOV AL,034H ;取计数初值的低8位
OUT 062H,AL ;计数初值的低8位,写入计数器1端口
MOV AL, 12H ;取计数初值的高8位
OUT 062H,AL ;计数初值的高8位写入计数器1端口
计数器2的初始化:
计数器2的控制字:10010110B=96H
MOV AL,96H ;计数器2的控制字96H:方式3,只送低8位,二进制计数
OUT 066H,AL ;控制字写入8253的控制口
MOV AL,056H ;计数初值的低8位
OUT 064H,AL ;计数初值的低8位写入计数器2的端口
例2:要求读出计数器2的当前计数值,并检查是否为全“1”。
8253在读取计数器的当前计数值时,必须分两步进行。首先发一锁存命令(即控制字中RL1RL0=00),将当前计数 值锁存到输出锁存器中。第二步执行读操作,即用IN指令将锁存器中内容读入CPU。
假设计数初值只有低8位,设其程序段如下(控制口地址为066H,计数器2的口地址为064H):
KEEP:MOV AL,80H ;计数器2的锁存命令
OUT 066H,AL ;锁存命令写入控制寄存器
IN AL,064H ;读输出锁存器中的当前计数值(从计数器2端口读)
CMP AL,0FFH ;比较当前计数值是否为全“1”
JME KEEP ;非全“1”继续读
HLT ;为全“1”暂停 - 8253的应用举例
例1:将8253的计数器1作为5ms定时器,设输入时钟频率为200kHz,试编写8253的初始化程序。
(1)计数初值N计算
已知输入时钟CLK频率为200kHz,则时钟周期为T=1/f=1/200kHz=5μs,于是计数初值N为:N=5ms/T=5ms/5μs=1000。
(2)确定控制字
按题意选计数器1,按BCD码计数,工作于方式0,由于计数初值N=1000,控制字D5D4应为11,于是8253的控制字 为:01110001B=71H。
(3)选择8253各端口地址
设计数器1的端口地址为3F82H,控制口地址为3F86H。
(4)初始化程序如下
MOV AL,71H ;控制字
MOV DX,3F68H ;控制口地址
OUT DX,AL ;控制字送8253控制寄存器
MOV DX,3F82H ;计数器1端口地址
MOV AL,00 ;将计数初值N=1000的低8位写入计数器1
OUT DX,AL
MOV AL,10 ;将N的高8位写入计数器1
OUT DX,AL
例2:以8086为CPU的某微机系统中使用了一块8253芯片,其通道端口地址为308H, 30AH,30CH,控制口地址为30EH,3个通道使用同一输入时钟,频率为2MHz,要求完成如下功能:
利用计数器0采用硬件触发,输出宽度等于时钟周期的单脉冲,定时常数为36H;
利用计数器1输出频率为2kHz的对称方波;
利用计数器2产生宽度为0.6ms的单脉冲,
试设计该定时系统硬件电路和初始化程序。
(1)硬件电路设计
硬件电路设计主要是地址译码电路设计及时8253与CPU间的连接。根据给定的端口地址可知,地址总线低位部分的 A9~A0分别为:A9A8=11,A7~A4=0000,A3A2A1=100~111,A0=0,由它们经译码器译码产生8253的片选信号, 8253的数据线D7~D0必须与系统数据总线的低8位相连,8253的端口的选择信号A1A0应连系统地址的A2A1。根据上 述要求,译码器应选3-8译码器74LS138。该译码器有3个代码输入端(C,B,A),输入3位代码决定译码信号从 Y0~Y7中哪一个输出,本例中显然应以Y2输出。
(2)初始化编程
根据题意要求,对3个通道的工作方式,计数初值确定如下:
由CLK0~CLK2=2MHz可得,时钟周期T=1/f=1/2MHz=0.5μs。
选计数器0:选择方式5,门控信号GATE应接一正跳变信号,OUT端当计数为0时产生一个宽度等于时钟周期的单脉 冲。计数系数为36,用BCD计数。所以,计数器0的控制字应为00011011B=1BH。
选计数器1:选择方式3,GATE按+5V,CLK1=2MHz输出方波频率为2kHz,所以,计数常数N1=2MHz/2kHz=1000,采用 BCD计数,于是计数器1的控制字为:01110111B=77H。
选计数器2:选择方式1,以构成一个单稳态电路,输出脉冲宽度由计数常数N2决定,计数常数N2=600μs/0. 5μs=1200,采用BCD计数,于是计数器2的控制字为:10110011B=B3H。
根据以上分析可得3个计数通道的初始化程序如下。
计数通道0的初始化程序:
MOV DX,30EH ;8253的控制口地址
MOV AL,1BH ;计数通道0的控制字,低8位,方式5,BCD计数
OUT DX,AL ;控制字写入控制口
MOV DX,308H ;计数器0的端口地址
MOV AL,036H ;计数初值的低8位
OUT DX,AL ;低字节写入计数器0端口
计数通道1的初始化程序:
MOV DX,30EH ;8253的控制口地址
MOV AL,77H ;计数通道1的控制字,先写低字节,后写高字节,方式3,BCD计数
OUT DX,AL ;控制字写入控制口
MOV DX,30AH ;计数通道1的端口地址
MOV AL,00H ;计数初值的低字节
OUT DX,AL ;低字节写入计数通道1
MOV AL,10D ;计数初值的高字节
OUT DX,AL ;高字节写入计数通道1
计数通道2的初始化程序