8253概述
8253芯片是可编程计数器/定时器。这种芯片外形引脚都是兼容性的。8253内部有三个计数器,分别称为计数器0、计数器1和计数器2,他们的机构完全相同。
每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。
8253各通道的工作方式
8253中各通道可有6种可供选择的工作方式, 以完成定时、计数或脉冲发生器等多种功能。8253的各种工作方式如下:
1.方式0:计数结束则中断
工作方式0被称为计数结束中断方式。当任一通道被定义为工作方式0时, OUTi输出为低电平;若门控信号GATE为高电平,当CPU利用输出指令向该通道写入计数值WR#有效时,OUTi仍保持低电平,然后计数器开始减“1”计数, 直到计数值为“0”,此刻OUTi将输出由低电平向高电平跳变,可用它向CPU发出中断请求,OUTi端输出的高电平一直维持到下次再写入计数值为止。
在工作方式0情况下,门控信号GATE用来控制减“1”计数操作是否进行。当GATE=1时,允许减“1”计数;GATE=0时,禁止减“1”计数; 计数值将保持GATE有效时的数值不变, 待GATE重新有效后,减“1”计数继续进行。
显然,利用工作方式0既可完成计数功能, 也可完成定时功能。当用作计数器时,应将要求计数的次数预置到计数器中,将要求计数的事件以脉冲方式从CLKi端输入, 由它对计数器进行减“1”计数,直到计数值为0,此刻OUTi输出正跳变, 表示计数次数到。当用作定时器时,应把根据要求定时的时间和CLKi的周期计算出定时系数,预置到计数器中。从CLKi,输入的应是一定频率的时钟脉冲,由它对计数器进行减“1”计数, 定时时间从写入计数值开始,到计数值计到“0”为止,这时OUTi输出正跳变,表示定时时间到。
有一点需要说明,任一通道工作在方式0情况下, 计数器初值一次有效,经过一次计数或定时后如果需要继续完成计数或定时功能,必须重新写入计数器的初值。
2.方式1:单脉冲发生器
工作方式1被称作可编程单脉冲发生器。进入这种工作方式, CPU装入计数值n后OUTi输出高电平, 不管此时的GATE输入是高电平还是低电平, 都不开始减“1”计数,必须等到GATE由低电平向高电平跳变形成一个上升沿后,计数过程才会开始。与此同时,OUTi输出由高电平向低电平跳变,形成了输出单脉冲的前沿,待计数值计到“0”, OUTi输出由低电平向高电平跳变,形成输出单脉冲的后沿, 因此,由方式l所能输出单脉冲的宽度为CLKi周期的n倍。
如果在减“1”计数过程中, GATE由高电平跳变为低电乎,这并不影响计数过程,仍继续计数;但若重新遇到GATE的上升沿,则从初值开始重新计数, 其效果会使输出的单脉冲加宽,如教材图9-22(b)中的第2个单脉冲。
这种工作方式下,计数值也是一次有效,每输入一次计数值,只产生一个负极性单脉冲。
3.方式2:速率波发生器
工作方式2被称作速率波发生器。进入这种工作方式, OUTi输出高电平,装入计数值n后如果GATE为高电平,则立即开始计数,OUTi保持为高电平不变; 待计数值减到“1”和“0”之间, OUTi将输出宽度为一个CLKi周期的负脉冲,计数值为“0”时,自动重新装入计数初值n,实现循环计数,OUTi将输出一定频率的负脉冲序列, 其脉冲宽度固定为一个CLKi周期, 重复周期为CLKi周期的n倍。
如果在减“1”计数过程中,GATE变为无效(输入0电平),则暂停减“1”计数,待GATE恢复有效后,从初值n开始重新计数。这样会改变输出脉冲的速率。
如果在操作过程中要求改变输出脉冲的速率,CPU可在任何时候,重新写入新的计数值, 它不会影响正在进行的减“1”计数过程,而是从下一个计数操作用期开始按新的计数值改变输出脉冲的速率。
4.方式3:方波发生器
工作方式3被称作方波发生器。任一通道工作在方式3, 只在计数值n为偶数,则可输出重复周期为n、占空比为1:1的方波。
进入工作方式3,OUTi输出低电平, 装入计数值后,OUTi立即跳变为高电平。如果当GATE为高电平, 则立即开始减“1”计数,OUTi保持为高电平,若n为偶数,则当计数值减到n/2时,OUTi跳变为低电平,一直保持到计数值为“0”,系统才自动重新置入计数值n,实现循环计数。这时OUTi端输出的周期为n×CLKi周期,占空比为1:1的方波序列; 若n为奇数, 则OUTi端输出周期为n×CLKi周期,占空比为((n+1)/2)/((n-1)/2)的近似方波序列。
如果在操作过程中, GATE变为无效,则暂停减“1”计数过程,直到GATE再次有效,重新从初值n开始减“l”计数。
如果要求改变输出方波的速率, 则CPU可在任何时候重新装入新的计数初值n,并从下一个计数操作周期开始改变输出方波的速率。
5.方式4:软件触发方式计数
工作方式4被称作软件触发方式。进入工作方式4,OUTi输出高电平。 装入计数值n后, 如果GATE为高电平,则立即开始减“1”计数,直到计数值减到“0”为止,OUTi输出宽度为一个CLKi周期的负脉冲。由软件装入的计数值只有一次有效,如果要继续操作, 必须重新置入计数初值n。如果在操作的过程中,GATE变为无效,则停止减“1”计数, 到GATE再次有效时,重新从初值开始减“1”计数。
显然,利用这种工作方式可以完成定时功能,定时时间从装入计数值n开始,则OUTi输出负脉冲(表示定时时间到),其定时时间=n×CLK周期。 这种工作方式也可完成计数功能,它要求计数的事件以脉冲的方式从CLKi输入,将计数次数作为计数初值装入后,由CLKi端输入的计数脉冲进行减“1”计数,直到计数值为“0”,由OUTt端输出负脉冲(表示计数次数到)。 当然也可利用OUTj向CFU发出中断请求。 因此工作方式4与工作方式0很相似,只是方式0在OUTi端输出正阶跃信号、方式4在OUTi端输出负脉冲信号。
6.方式5:硬件触发方式计数
工作方式5被称为硬件触发方式。进入工作方式5, OUTi输出高电平, 硬件触发信号由GATE端引入。 因此,开始时GATE应输入为0, 装入计数初值n后,减“1”计数并不工作,一定要等到硬件触发信号由GATE端引入一个正阶跃信号,减“1”计数才会开始,待计数值计到“0”, OUTi将输出负脉冲,其宽度固定为一个CLKi周期,表示定时时间到或计数次数到。
这种工作方式下,当计数值计到“0”后, 系统将自动重新装入计数值n,但并不开始计数, 一定要等到由GATE端引入的正跳沿,才会开始进行减“1”计数, 因此这是一种完全由GATE端引入的触发信号控制下的计数或定时功能。如果由CLKi输入的是一定频率的时钟脉冲,那么可完成定时功能,定时时间从GATE上升沿开始,到OUTi端输出负脉冲结束。如果从CLKi端输入的是要求计数的事件,则可完成计数功能,计数过程从GATE上升沿开始,到OUTi输出负脉冲结束。GATE可由外部电路或控制现场产生,故硬件触发方式由此而得名。
如果需要改变计数初值, CPU可在任何时候用输出指令装入新的计数初值m,它将不影响正在进行的操作过程, 而是到下一个计数操作周期才会按新的计数值进行操作。
从上述各工作方式可看出,GATE作为各通道的门控信号,对于各种不同的工作方式,它所起的作用各不相同。在8253的应用中,必须正确使用GATE信号,才能保证各通道的正常操作。
8253初始化编程
8253初始化要求:
(1 )对每个计数器,控制字必须写在计数值之前。这是因为计数器的读/写格式由它的控制字决定。
(2 )计数值必须按控制字所规定的格式写入。若控制字规定只写8位,只需写入一-次(8位)计数值即可(规定写低8位则高8位自动置0,规定写高8位则低8位自动置0) ;规定写16位时必须写两次,先写低8位,后写高8位。当初值为0时,也要分两写入,因在二进制计数时,“0” 标65336 ,在BCD码计数时“0”表示10000=104.
(3)对所有方式计数器都可以在计数过程中或计数结束后改变计数值,重写计数值也必须遵守控制字所规定的格式,并且不会改变当前计数器的工作方式。
(4 )计数值不能直接写到减1计数器中,而只能写入计数值寄存器中,并由写操作之后的下一个CLK脉冲将计数值寄存器的内容装入减1计数器开始计数。
(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
MOVAL, 23H ;计数器0的控制字
OUT 066H,AL ;控制字写入8253的控制器
MOVAL, 18H ;取计数初值的高8位,低8位00可不送
OUT 060H , AL ;计数初值送计数器0端[ ]
计数器1和初始化:
计数器1的控制字: 0110000B=70H
MOVAL, 70H ;计数器的控制字:方式0,送高8位和低8位,二进制计数
OUT 066H ,AL ;控制字写入8253的控制器
MOV AL, 034H ;取计数初值的低8位
OUT 062H ,AL ;计数初值的低8位,写入计数器1端口]
MOVAL, 12H ;取计数初值的高8位
OUT 062H ,AL ;计数初值的高8位写入计数器1端D 1
计数器2的初始化:
计数器2的控制字: 10010110B=96H
MOV AL,96H ; 计数器2的控制字96H:方式3,只送低8位,二进制计数
OUT 066H , AL ;控制字写入8253的控制口
MOV AL, 056H ;计数初值的低8位
OUT064H,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, OFFH ; 比较当前计数值是否为全“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的初始化程序
MOV DX,30EH ;8253的控制口地址
MOV AL,B3H ;计数通道2的控制字,先写低字节,后写高字节,方式1,BCD计数
OUT DX,AL ;控制字写入控制口
MOV DX,30CH ;计数通道的端口地址
MOV AL,00H ;计数初值的低字节
OUT DX,AL ;低字节写入计数通道
MOV AL,12D ;计数初值的高字节
OUT DX,AL ;高字节写入计数通道2
计数通道2初始化程序:
MOV AL,B0H ;计数通道2的控制字
OUT 05FH,AL ;控制字写入控制器
MOV AL,068H ;计数初值的低8位
OUT 05DH,AL ;计数初值的低8位写入计数通道2
评论
查看更多