一
8254计数初值计算公式:N = f(clk) / f(out)
8254工作方式
方式0--计数结束输出正跃变信号
(1).计数过程中OUT为低,计数值减为9时,OUT变为高
(2).改变初值,则在写入新的计数初值后,计数器将以新的值为计数初值
(3).GATE = 1,允许计数;GATE = 0,暂停计数
方式1--单脉冲发生器
(1).GATE上升沿启动,计数期间OUT维持低电平,所以负脉冲宽度 = 计数初值XCLK脉冲周期
(2).改变初值只有当GATE再次出现0->1跃变后,计数器才能按新初值减1计数
计数过程中GATE有正脉冲,计数初值重新装载,计数重新开始
方式2--分频器(OUT端对GATE端信号N分频;具备初值自动重装)
(1).只在GATE为高时,计数器计数计数值为1时,OUT输出宽度为CLK周期的低电平信号之后初值重装,计数重新开始
(2).计数过程中GATE变低,则计数暂停,GATE的上升沿会导致计数器重新开始
(3).GATE为高电平时,写入新的计数初值,不会影响正在进行的计数,只有计数器见减到1后初值才能重装
方式3--方波发生器(具备初值自动重装)
每来一个CLK脉冲,计数值减2
(1).初值为偶数:当计数值为0时,OUT端反转,输出为1:1方波,正负脉冲宽度为N/2个CLK周期
(2).初值为奇数:实际装入初值为写入初值减一。输出正脉冲期间,当计数值减到-2时,OUT端变低,初值重装;输出负脉冲期间,当计数器减到0时,OUT端变高,初值重装
方式4--软件触发的单脉冲发生器
(1).只有当计数值减到0时,OUT才为低,负脉冲宽度为CLK周期
(2).GATE = 1,允许计数;GATE = 0,停止计数
(3).在计数过程中,如果改变计数值,则按新的计数值重新开始计数
方式5--硬件触发的单脉冲发生器
(1). 与方式1相似,区别在于:方式5输出的负脉中宽度为一个 CLK周期,而方式1的负脉冲宽度为N 倍的CLK周期
8254控制字
方式控制字
(1) D7D6:计数器选择:D7D6 = 00,选择0号计数器;
D7D6 = 01,选择1号计数器;
D7D6 = 10,选择2号计数器;
D7D6 = 11,读出控制字的标志。
(2) D5D4:读/写方式选择:D5D4 = 00,锁存计数器当前值;D5D4 = 01,写入时,只写低8位计数初值,高8位置0,读出时,只读低8位的当前计数值;D5D4 = 10,与 前相反;D5D4 = 11,先读/写低8位计数值,后读/写高8位。
(3) D3D2D1:000--计数器工作在方式0
001--计数器工作在方式1
X10--计数器工作在方式2
X11--计数器工作在方式3
100--计数器工作在方式4
101--计数器工作在方式5
(4) D0:数值选择--D0 = 0,计数初值被认为是二进制数
D0 = 1,计数初值被认为是十进制数
读出控制字
D7D6 = 11(必须为11) D0 = 0.
D5 = 0:锁存计数值,以便CPU读取
D4 = 0:将状态信息锁存入状态寄存器
D3~D1:计数器选择
8254状态字
D7 = 1:表示OUT引脚为高电平
(OUTPUT)D7 = 0:表示OUT引脚为低电平
(NULL COUT)D6 = 0,:表示计数初值已装入
eg1.系统使用外扩一片可编程定时器/计数器8254,输入时钟是1MHz。8254的初始化程序如下:
MOV
AL,01100101B
MOV
DX,203H
OUT
DX,AL
MOV
AL,1000H
MOV
DX,201H
OUT
DX,AL
由上述程序可知,设计时使用了8254的(1)号计数器,其口地址为(201)H,工作在方式(2),使用(十)进制计数,输出信号的频率为(1000)Hz。
8254在PC/AT中的使用
计数器0用于定时(55ms)中断
MOV
AL,00110110B
;方式3,二进制计数
OUT
43H,AL
;
MOV
AL,0
;初值为0000H
OUT
40H,AL
OUT
40H,AL
计数器1用于动态存储器刷新定时(每隔15us提出一次请求)
MOV
AL,01010100B
;方式2,只写低8位,二进制计数
OUT
43H,AL
MOV
AL,12H
;初值为18
OUT
41H,AL
计数器2用于产生约900Hz方波送至扬声器
MOV
AL,10110110B
;方式3,二进制计数
OUT
43H,AL
MOV
AX,0533H
;初值为533H
OUT
42H,AL
MOV
AL,AH
OUT
42H,AL