1、第三节 可编程计数定时控制器 82538253 具有 3 个独立的计数通道,采用减 1 计数方式。在门控信号有效时,每输入 1 个计数脉冲,通道作 1次计数操作。当计数脉冲是已知周期的时钟信号时,计数就成为定时。一、8253 内部结构8253 芯片有 24 条引脚,封装在双列直插式陶瓷管壳内。1.数据总线缓冲器数据总线缓冲器与系统总线连接,8 位双向,与 CPU 交换信息的通道。这是 8253 与 CPU 之间的数据接口,它由 8 位双向三态缓冲存储器构成,是 CPU 与 8253 之间交换信息的必经之路。2.读写控制读写控制分别连接系统的 IOR#和 IOW#, 由 CPU 控制着访问 82
2、53 的内部通道。接收 CPU 送入的读写控制信号, 并完成对芯片内部各功能部件的控制功能, 因此, 它实际上是 8253 芯片内部的控制器。A1A0:端口选择信号,由 CPU 输入。8253 内部有 3 个独立的通道和一个控制字寄存器, 它们构成 8253 芯片的 4 个端口,CPU 可对 3 个通道进行读写操作 3 对控制字寄存器进行写操作。 这 4 个端口地址由最低 2 位地址码 A1A0 来选择。如表 9.3.1 所示。3.通道选择(1) CS#片选信号,由 CPU 输入,低电平有效,通常由端口地址的高位地址译码形成。(2) RD#、WR#读写控制命令,由 CPU 输入, 低电平有效。
3、 RD#效时,CPU 读取由 A1A0 所选定的通道内计数器的内容。WR#有效时,CPU 将计数值写入各个通道的计数器中, 或者是将方式控制字写入控制字寄存器中。CPU 对 8253 的读写操作如表 9.3.2 所示。4.计数通道 02每个计数通道内含 1 个 16 位的初值寄存器、减 1 计数器和 1 个 16 位的(输出)锁存器。8253 内部包含 3个功能完全相同的通道,每个通道内部设有一个 16 位计数器,可进行二进制或十进制(BCD 码)计数。采用二进制计数时, 最大计数值是 FFFFH, 采用 BCD 码计数时。 最大计数值是 9999。与此计数器相对应, 每个通道内设有一个 16
4、 位计数值锁存器。必要时可用来锁存计数值。当某通道用作计数器时,应将要求计数的次数预置到该通道的计数器中、被计数的事件应以脉冲方式从CLK 端输入, 每输入一个计数脉冲,计数器内容减“1”,待计数值计到 “0”。 OUT 端将有输出。表示计数次数到。当某个通道用作定时器时。 由 CLK 输入一定频率的时钟脉冲。根据要求定时的时间长短确定所需的计数值。并预置到计数器中,每输入一个时钟脉冲,计数器内容减“1”, 待计数值计到 “0”。OUT 将有输出,表示定时时间到。允许从 CLK 输入的时钟频在 12MHz 范围内。因此,任一通道作计数器用或作定时器用,其内部操作完全相同,区别仅在于前者是由计数
5、脉冲进行减“1”计数。 而后者是内时钟脉冲进行减 “1”计数。作计数器时, 要求计数的次数可直接作为计数器的初值预置到减“1”计数器中。作定时器时, 计数器的初值即定时系数应根据要求定时的时间进行如下运算才能得到:定时系数需要定时的时间时钟脉冲周期设置通道:向方式控制字寄存器端口写入方式选择控制字,用于确定要设置的通道及工作方式;计数/定时:向通道写入计数值,启动计数操作;读取当前的计数值:向指定通道读取当前计数器值时,8253 将计数器值存入锁存器,从锁存器向外提供当前的计数器值,计数器则继续作计数操作。计数到:当计数器减 1 为 0 时,通过引脚 OUTi 向外输出“ 到”的脉冲信号。计数
6、初值输入存放在初值寄存器中,计数开始或重装入时被复制到计数器中。 锁存器在非锁存状态,其值随计数器的变化而变化;一旦锁存了计数器的当前值,直到锁存器值被读取后才能解除锁存状态。5.方式选择控制字二、8253 的通道工作方式8253 中各通道可有 6 种可供选择的工作方式, 以完成定时、计数或脉冲发生器等多种功能。8253 的各种工作方式如下:1.方式 0:计数结束则中断工作方式 0 被称为计数结束中断方式,它的定时波形如图 9.3.4 所示。当任一通道被定义为工作方式 0 时, OUTi 输出为低电平;若门控信号 GATE 为高电平,当 CPU 利用输出指令向该通道写入计数值 WR#有效时,O
7、UTi 仍保持低电平,然后计数器开始减“1” 计数, 直到计数值为“0”,此刻 OUTi 将输出由低电平向高电平跳变,可用它向 CPU 发出中断请求,OUT i 端输出的高电平一直维持到下次再写入计数值为止。在工作方式 0 情况下,门控信号 GATE 用来控制减“1”计数操作是否进行。当 GATE=1 时,允许减“1” 计数;GATE=0 时,禁止减“1”计数; 计数值将保持 GATE 有效时的数值不变, 待 GATE 重新有效后,减“1”计数继续进行。显然,利用工作方式 0 既可完成计数功能, 也可完成定时功能。当用作计数器时,应将要求计数的次数预置到计数器中,将要求计数的事件以脉冲方式从
8、CLKi 端输入, 由它对计数器进行减“1” 计数,直到计数值为0,此刻 OUTi 输出正跳变, 表示计数次数到。当用作定时器时,应把根据要求定时的时间和 CLKi 的周期计算出定时系数,预置到计数器中。从 CLKi,输入的应是一定频率的时钟脉冲,由它对计数器进行减“1” 计数, 定时时间从写入计数值开始,到计数值计到“0”为止,这时 OUTi 输出正跳变,表示定时时间到。有一点需要说明,任一通道工作在方式 0 情况下, 计数器初值一次有效,经过一次计数或定时后如果需要继续完成计数或定时功能,必须重新写入计数器的初值。2.方式 1:单脉冲发生器工作方式 1 被称作可编程单脉冲发生器,其定义波形
9、如图 9.3.5。进入这种工作方式, CPU 装入计数值 n后 OUTi 输出高电平, 不管此时的 GATE 输入是高电平还是低电平, 都不开始减“1”计数,必须等到 GATE 由低电平向高电平跳变形成一个上升沿后,计数过程才会开始。与此同时,OUT i 输出由高电平向低电平跳变,形成了输出单脉冲的前沿,待计数值计到“0”, OUTi 输出由低电平向高电平跳变,形成输出单脉冲的后沿, 因此,由方式 l 所能输出单脉冲的宽度为 CLKi 周期的 n 倍。如果在减“1”计数过程中, GATE 由高电平跳变为低电乎,这并不影响计数过程,仍继续计数;但若重新遇到 GATE 的上升沿,则从初值开始重新计
10、数, 其效果会使输出的单脉冲加宽,如教材图 9-22(b)中的第 2 个单脉冲。这种工作方式下,计数值也是一次有效,每输入一次计数值,只产生一个负极性单脉冲。3.方式 2:速率波发生器工作方式 2 被称作速率波发生器,其定时波形如图 9.3.6 所示。进入这种工作方式, OUTi 输出高电平,装入计数值 n 后如果 GATE 为高电平,则立即开始计数, OUTi 保持为高电平不变; 待计数值减到“1”和“0” 之间, OUTi 将输出宽度为一个 CLKi 周期的负脉冲,计数值为“0” 时,自动重新装入计数初值 n,实现循环计数,OUT i将输出一定频率的负脉冲序列, 其脉冲宽度固定为一个 CL
11、Ki 周期, 重复周期为 CLKi 周期的 n 倍。如果在减“1”计数过程中,GATE 变为无效(输入 0 电平),则暂停减“1”计数,待 GATE 恢复有效后,从初值 n 开始重新计数。这样会改变输出脉冲的速率。如果在操作过程中要求改变输出脉冲的速率,CPU 可在任何时候,重新写人新的计数值, 它不会影响正在进行的减“1”计数过程,而是从下一个计数操作用期开始按新的计数值改变输出脉冲的速率。4.方式 3:方波发生器工作方式 3 被称作方波发生器,其定时波型如图 9.3.7 所示。任一通道工作在方式 3, 只在计数值 n 为偶数,则可输出重复周期为 n、占空比为 1:1 的方波。进入工作方式
12、3,OUT i 输出低电平, 装入计数值后,OUT i 立即跳变为高电平。如果当 GATE 为高电平, 则立即开始减“1”计数,OUT i 保持为高电平,若 n 为偶数,则当计数值减到 n/2 时,OUT i 跳变为低电平,一直保持到计数值为“0”,系统才自动重新置入计数值 n,实现循环计数。这时 OUTi 端输出的周期为 nCLKi 周期,占空比为 1:1 的方波序列; 若 n 为奇数, 则 OUTi 端输出周期为 nCLKi 周期,占空比为(n+1)/2)/(n-1)/2)的近似方波序列。如果在操作过程中, GATE 变为无效,则暂停减 “1”计数过程,直到 GATE 再次有效,重新从初值
13、 n 开始减“l”计数。如果要求改变输出方波的速率, 则 CPU 可在任何时候重新装入新的计数初值 n,并从下一个计数操作周期开始改变输出方波的速率。5.方式 4:软件触发方式计数工作方式 4 被称作软件触发方式,其定时波形如图 9.3.8 所示。进入工作方式 4,OUT i 输出高电平。 装入计数值 n 后, 如果 GATE 为高电平,则立即开始减 “1”计数,直到计数值减到“0”为止,OUT i 输出宽度为一个CLKi 周期的负脉冲。由软件装入的计数值只有一次有效,如果要继续操作, 必须重新置入计数初值 n。如果在操作的过程中,GATE 变为无效,则停止减 “1”计数, 到 GATE 再次
14、有效时,重新从初值开始减“1” 计数。显然,利用这种工作方式可以完成定时功能,定时时间从装入计数值 n 开始,则 OUTi 输出负脉冲(表示定时时间到),其定时时间nCLK 周期。 这种工作方式也可完成计数功能,它要求计数的事件以脉冲的方式从CLKi 输入,将计数次数作为计数初值装入后,由 CLKi 端输入的计数脉冲进行减“1”计数,直到计数值为“0” ,由OUTt 端输出负脉冲(表示计数次数到)。 当然也可利用 OUTj 向 CFU 发出中断请求。 因此工作方式 4 与工作方式 0 很相似,只是方式 0 在 OUTi 端输出正阶跃信号、方式 4 在 OUTi 端输出负脉冲信号。6.方式 5:
15、硬件触发方式计数工作方式 5 被称为硬件触发方式,其定时波形如图 9.3.9 所示。进入工作方式 5, OUTi 输出高电平, 硬件触发信号由 GATE 端引入。 因此,开始时 GATE 应输入为 0, 装入计数初值 n 后,减“1”计数并不工作,一定要等到硬件触发信号由 GATE 端引入一个正阶跃信号,减 “1”计数才会开始,待计数值计到“0”, OUTi 将输出负脉冲,其宽度固定为一个 CLKi 周期,表示定时时间到或计数次数到。这种工作方式下,当计数值计到“0”后, 系统将自动重新装入计数值 n,但并不开始计数, 一定要等到由GATE 端引入的正跳沿,才会开始进行减“1”计数, 因此这是
16、一种完全由 GATE 端引入的触发信号控制下的计数或定时功能。如果由 CLKi 输入的是一定频率的时钟脉冲,那么可完成定时功能,定时时间从 GATE 上升沿开始,到 OUTi 端输出负脉冲结束。如果从 CLKi 端输入的是要求计数的事件,则可完成计数功能,计数过程从GATE 上升沿开始,到 OUTi 输出负脉冲结束。 GATE 可由外部电路或控制现场产生,故硬件触发方式由此而得名。如果需要改变计数初值, CPU 可在任何时候用输出指令装入新的计数初值 m,它将不影响正在进行的操作过程, 而是到下一个计数操作周期才会按新的计数值进行操作。从上述各工作方式可看出,GATE 作为各通道的门控信号,对
17、于各种不同的工作方式,它所起的作用各不相同。在 8253 的应用中,必须正确使用 GATE 信号,才能保证各通道的正常操作。7.读取计数器的当前值直接读计数器:输出锁存器在非锁存状态会跟随计数器计数的变化而变化,直接读计数器是从锁存器得到计数器的当前值。但由于计数器处于工作状态,读出值不一定能稳定。先锁存再读取:通过方式选择控制字对指定通道(SC1、SC0) 的计数值锁入锁存器 (RL1RL0=00), 锁存器一旦锁存了当前计数值,就不再随计数器变化直到被读取。读计数器通道(有锁存器)。三、8253 应有举例例 1:设 fCLK=1MHz,端口地址 40H46H,40H 为 0 通道,42H
18、为 1 通道,用 0 通道产生 500Hz 的方波。计数初值 N=fCLK/fOUT=1000000/500=2000=7D0H初始化编程:选二进制计数、方式 3、先写低后写高,方式控制字为:00110110B;初始化编程:MOV AL,00110110B OUT 46H,ALMOV AL,0D0HOUT 40H,ALMOV AL,07HOUT 40H,AL例 2:设 fCLK=1MHz,端口地址 40H46H,40H 为 0 通道,42H 为 2 通道,用 2 通道产生周期 1 秒的负脉冲信号。计数初值 N=fCLK/fOUT=1000000/165536,因此需用 2 个通道。用 0 通对
19、 fCLK 进行分频产生低频方波信号(设产生 500Hz=1F4H), 作为 2 通道的时钟。初始化编程:MOV AL,00110110B ;设置 0 通道为方波发生器OUT 46H,ALMOV AL,0D0H ;定时初值 2000=7D0HOUT 40H,ALMOV AL,07HOUT 40H,ALMOV AL,10110100B ;设置 2 通道为速率波发生器OUT 46H,ALMOV AL,0F4H ;定时初值 500=1F4HOUT 44H,ALMOV AL,01HOUT 44H,AL例 3:同上例,读出通道 2 的当前计数值并存放在 AX 中。编程:MOV AL,10000000B ;锁存通道 2 的当前值OUT 46H,AL ;D3D0 任意IN AL,44H ;读低字节MOV AH,ALIN AL,44H ;读高字节XCHG AL,AH