计算机的定时和计数通常是一回事。 提供定时和计数能力的芯片是 8253/8254

8253引脚定义

内部结构

三个计数器结构相同,相互独立

  • CLK 外部时钟信号
  • Gate 门控制信号
  • Out 对外输出信号

CPU 通过数据总线控制总线和 8253 挂接。

$A_1$$A_0$功能
00Counter0
01Counter1
10Counter2
11控制端

对 8253/8254 编程

  1. 写入方式字
  2. 写入初值
$D_7$ $D_6$$D_5$ $D_4$$D_3$ $D_2$ $D_1$$D_0$
计数器读写格式工作方式数制
读写格式
  • 00 锁存当前值
  • 01 写低8位,高8位置0
  • 10 写高8位,低8位置0
  • 11 先写低8位,再写高8位

数制:

  • 0 二进制
  • 1 BCD

当初值为类似 2000 时,使用 BCD 有效提高写入速度(低8位为0,高8位为 0010 0000)

计算初值

$$ \text{定时时间} T_{out} = \text{计数初值}n \times 计数时钟周期 T_{CLK} $$ $$ \text{计数初值} n = \frac{T_{out}}{T_{CLK}} = \frac{f_{CLK}}{f_{out}} $$

写入端口

使用 INOUT 命令进行编程

1
2
IN AX/AL, port
OUT port, AX/AL

如果地址大于255,则需要间接寻址:

1
2
3
MOV DX, port
IN AL/AX, DX
OUT DX, AL/AX

地址先写入 DX 内。

计数器工作方式

一共有6种工作方式

  1. 方式0 只能触发一次的负脉冲
  2. 方式 1重复触发的单稳态脉冲
  3. 方式2 分频器
  4. 方式3 放波发生器
  5. 方式4 软件触发单脉冲
  6. 方式5 硬件触发单脉冲
工作方式功能GATE信号控制OUT输出波形重新计数
方式0计数期间低电平输出低时暂停,高时继续计数写入初值后 OUT 变,开始计数。计数结束后OUT变高重新写入初值后立即重新计数
方式1计数期间低电平输出上升沿触发重新计数(重新装入初值)输出宽度为n个周期的低电平(不连续,需要手动进行重新计数)输出不连续(需要手动再次写入初值)
方式2周期性输出负脉冲高电平连续输出周期为n个CLK,宽度为1CLK的负脉冲输出连续(自动重新计数)
方式3周期性输出方波高电平连续输出比例为1:1或近似1:1的方波输出连续(自动重新计数)
方式4软件触发输出单脉冲高电平写入初值后OUT变高,n个CLK后输出1个CLK负脉冲软件触发继(手动写入初值)
方式5硬件触发输出单脉冲上升沿计数写入初值后OUT变高,n个CLK后输出1个CLK负脉冲硬件触发(GATE上升沿重新计数)