标题：8253芯片
基本概述
intel8253是NMOS工艺制成的可编程计数器/定时器，有几种芯片型号，外形引脚及功能都是兼容的，只是工作的最高计数速率有所差异，例如8253（2.6MHz），8253-5(5MHz)  8253内部结构框图
8253内部有三个计数器，分别称为计数器0、计数器1和计数器2，他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字，互相之间工作完全独立。每个计数器通过三个引脚和外部联系，一个为时钟输入端CLK，一个为门控信号输入端GATE，另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器，还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。
执行部件实际上是一个16位的减法计数器，它的起始值就是初值寄存器的值，而初始值寄存器的值是通过程序设置的。输出锁存器的值是通过程序设置的。输出锁存器OL用来锁存计数执行部件CE的内容，从而使CPU可以对此进行读操作。顺便提一下，CR、CE和OL都是16位寄存器，但是也可以作8位寄存器来用。  
工作原理
8253具有3个独立的计数通道，采用减1计数方式。在门控信号有效时，每输入1个计数脉冲，通道作1次计数操作。当计数脉冲是已知周期的时钟信号时，计数就成为定时。
一、8253内部结构
8253芯片有24条引脚，封装在双列直插式陶瓷管壳内。
1.数据总线缓冲器
数据总线缓冲器与系统总线连接，8位双向，与CPU交换信息的通道。这是8253与CPU之间的数据接口，它由8位双向三态缓冲存储器构成，是CPU与8253之间交换信息的必经之路。
2.读/写控制  
读/写控制分别连接系统的IOR#和IOW#， 由CPU控制着访问8253的内部通道。接收CPU送入的读/写控制信号， 并完成对芯片内部各功能部件的控制功能， 因此， 它实际上是8253芯片内部的控制器。A1A0：端口选择信号，由CPU输入。8253内部有3个独立的通道，加上控制字寄存器，构成8253芯片的4个端口，CPU可对3个通道进行读/写操作3对控制字寄存器进行写操作。 这4个端口地址由最低2位地址码A1和A0来选择。如表所示。
3.通道选择
(1) CS#——片选信号，由CPU输入，低电平有效，通常由端口地址的高位地址译码形成。
(2) RD#、WR#——读/写控制命令，由CPU输入， 低电平有效。RD#效时，CPU读取由A1A0所选定的通道内计数器的内容。WR#有效时，CPU将计数值写入各个通道的计数器中， 或者是将方式控制字写入控制字寄存器中。CPU对8253的读/写操作。
4.计数通道0～2
每个计数通道内含1个16位的初值寄存器、减1计数器和1个16位的（输出）锁存器。8253内部包含3个功能完全相同的通道，每个通道内部设有一个16位计数器，可进行二进制或十进制（BCD码）计数。采用二进制计数时， 写入的初值范围为0000H~0FFFFH，最大计数值是0000H，代表65536。 采用BCD码计数时，写入的初值范围为0000~9999，最大计数值是0000，代表10000。与此计数器相对应，每个通道内设有一个16位计数值锁存器。必要时可用来锁存计数值。（特别说明：8253计数器的值先减1再判断是否为0，为0就中断了，所以最大初始值为0，这样减1以后，不为0，所以为最大的，取决于CF标志位）
当某通道用作计数器时，应将要求计数的次数预置到该通道的计数器中、被计数的事件应以脉冲方式从CLK端输入， 每输入一个计数脉冲，计数器内容减“1”，待计数值计到“0”。 OUT端将有输出。表示计数次数到。当某个通道用作定时器时。 由CLK输入一定频率的时钟脉冲。根据要求定时的时间长短确定所需的计数值。并预置到计数器中，每输入一个时钟脉冲，计数器内容减“1”， 待计数值计到“0”。OUT将有输出，表示定时时间到。允许从CLK输入的时钟频在1～2MHz范围内。因此，任一通道作计数器用或作定时器用，其内部操作完全相同，区别仅在于前者是由计数脉冲进行减“1”计数。 而后者是内时钟脉冲进行减“1”计数。作计数器时， 要求计数的次数可直接作为计数器的初值预置到减“1”计数器中。作定时器时， 计数器的初值即定时系数应根据要求定时的时间进行如下运算才能得到：
定时系数=需要定时的时间/时钟脉冲周期
①设置通道：向方式控制字寄存器端口写入方式选择控制字，用于确定要设置的通道及工作方式；
②计数/定时：向通道写入计数值，启动计数操作；
③读取当前的计数值：向指定通道读取当前计数器值时，8253将计数器值存入锁存器，从锁存器向外提供当前的计数器值，计数器则继续作计数操作。
④计数到：当计数器减1为0时，通过引脚OUTi向外输出“到”的脉冲信号。
计数初值输入存放在初值寄存器中，计数开始或重装入时被复制到计数器中。 
锁存器在非锁存状态，其值随计数器的变化而变化；一旦锁存了计数器的当前值，直到锁存器值被读取后才能解除锁存状态。  
5.方式选择控制字
8253的初始化编程就是对其工作方式的确定。具体实现就是在8253上电后，由CPU向8253的控制寄存器写入一个控制字，就可以规定8253的工作方式、计数值的长度以及计数所用的数制等，另外根据要求将计数值写入8253的相应通道。
8253的一个方式控制字只决定一个技术通道的工作模式。
二、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信号，才能保证各通道的正常操作。
7.读取计数器的当前值
⑴直接读计数器：输出锁存器在非锁存状态会跟随计数器计数的变化而变化，直接读计数器是从锁存器得到计数器的当前值。但由于计数器处于工作状态，读出值不一定能稳定。
⑵先锁存再读取：①通过方式选择控制字对指定通道(SC1、SC0)的计数值锁入锁存器(RL1RL0=00)， 锁存器一旦锁存了当前计数值，就不再随计数器变化直到被读取。②读计数器通道（有锁存器）。