Skip to main content

11 可编程定时器/计数器

计算机系统中常常需要定时信号或者对外部信号进行计数。

一般定时操作可以通过软件和硬件两种方法实现:

  1. 软件定时:通过执行延时程序,通过计算程序运行的机器周期数来计算定时时间,CPU执行延时程序将增加时间开销,降低CPU效率,并且结果往往不准确
  2. 硬件定时:通过外加硬件实现,一般采用定时器/计数器

定时器与计数器的区别:

  1. 触发来源不同:定时器的触发来源是外部脉冲,而计数器的触发来源是时钟信号。
  2. 计数对象不同:定时器实际上也是计数器,只是计数是由固定周期的脉冲触发的,计数器只计数时间。

计算机系统中采用可编程定时/计数器有I8253和I8254,其中8254具备8253的全部功能。

8254内部结构#

8254内部有3个独立的16位计数器,每个计数器有6种工作方式,计数初值的数制可设定为二进制或BCD码,每个计数器允许的最高计数频率为10MHz,有读出命令。

  1. 数据总线缓冲器
  2. 读写逻辑
  3. 控制字寄存器
  4. 计数器

附:端口地址#

CS\overline{CS}等于0的前提下,

A1A0A_1A_0选中
000#计数器
011#计数器
102#计数器
11控制字寄存器

8254的工作方式#

方式0:计数结束输出正跃变信号

方式1:单脉冲发生器

方式2:分频器

方式3:方波发生器

方式4:软件触发的单脉冲发生器

方式5:硬件触发的单脉冲发生器

8254的控制字#

8254的控制字有两个,两个控制字共用一个控制口地址,由标识符区分

  1. 方式控制字:设置计数器的工作方式
  2. 读出控制字:设置读出命令

8254编程方法#

8254初始化编程#

8254是可编程芯片,使用之前需要进行初始化编程,分为两步:

  1. 向控制字寄存器写入方式控制字,对使用的计数器规定其工作方式等
  2. 向使用的计数器写入计数初值

8254读取当前计数值#

8254任一计数器的计数值,可用输入指令读取,由于计数器为16位,因而要分两次读。

8254编程实例#

EXA113.ASM
CODE SEGMENT    ASSUME CS:CODEBEG:    IN  AL, 61H    OR  AL, 03H    OUT 61H,AL    ;接通扬声器🔈    MOV DX, 12H    MOV AX, 34DEH ;计数初值    MOV CX, 800    DIV CX            OUT 42H,AL    ;先写低8位    MOV AL, AH    ;再写高8位    OUT 42H,ALSCAN:    MOV AH, 1    INT 16H       ;等待按键    JZ  SCAN    IN  AL, 61H    AND AL, 0FCH    OUT 61H,AL    ;关闭扬声器🔈    MOV AH, 4CH    INT 21HCODE ENDS    END BEG
Run