微型计算机原理与接口技术
文章目录
可编程定时器/计数器
可编程定时/计数器接口芯片8253 (和8254差不多)
Intel 8253 (或 8254)是一个可编程定时/计数器(PIT-Programmable Interval Timer)芯片,用于解决计算机中通常碰到的时间控制问题,即在软件的控制下产生精确的时间延迟。该芯片提供了3个独立的16位计数器通道。每个通道可工作在不同的工作方式下,并且这些工作方式均可以使用软件来设置。
8254 是Intel 公司生产的可编程间隔定时器。 是8253 的改进型, 比8253 具有更优良的性能。
8254是8253的更新产品,主要功能基本一样,只是8254芯片増加了回读命令。
8254 具有以下基本功能:
- 有3 个独立的16 位计数器。
- 每个计数器可按二进制或十进制(BCD) 计数。
- 每个计数器可编程工作于6 种不同工作方式。
- 8254 每个计数器允许的最高计数频率为10MHz(8253 为2MHz) 。
- 8254 有读回命令(8253 没有) , 除了可以读出当前计数单元的内容外, 还可以读出状态寄存器的内容。
- 计数脉冲可以是有规律的时钟信号, 也可以是随机信号。
功能
定时或计数实现方法
-
微机经常要用来对外部事件进行定时控制或对外部事件发生的次数进行记录,即所谓的定时或计数控制。
-
一般来说,实现定时或计数通常可采用三种方法:
- 方法1—由专门设计的硬件电路(数字电路)来实现
- 优点:定时或计数与CPU并行地进行。
- 缺点:通用性和灵活性差(因为若要改变定时/计数要求就必须改变电路参数)。
- 方法2—用软件即通过编制一段程序来实现
- 该软件控制方法是利用执行一条指令所需的时钟状态的个数来统计执行一段程序所花费的状态数,再乘以一个时钟周期的时间便得到定时的时间。
- 该方法一般用在延时时间不长切使用次数不多的场合。
- 优点:通用性和灵活性较好地进行。
- 缺点:定时或计数占用CPU的工作时间。
- 方法3—用可编程定时/计数器的输出来实现
- 按要求对了编程定时/计数器设置参数。该方法具有以上两种方法的优点。
- 方法1—由专门设计的硬件电路(数字电路)来实现
-
可编程定时/计数器的基本功能(两方面)
- 作为计数器,在设置好计数初值后,便开始减1计数,减到“0”时,输出一个信号;
- 作为定时器,在设置好定时常数后,便开始减1计数,并按定时常数不断地输出为时钟周期整数倍的定时间隔。
- 计数器与定时器的差别在于:计数器计数到零时便输出一个信号并结束,而定时器则不断的产生信号。
- 计数器与定时器的共同点在于:他们的工作过程没有根本区别,都是基于计数器的“1”操作
-
计数器与定时器的主要用途:
- 在多任务的分时系统中用作中断信号。实现程序的切换。
- 为I/O设备提供一个精确的定时信号。
- 作为一个可编程的波特率发生器。
- 实现时间延迟等。
基本原理
- 在定时/计数器的基本原理图中,有四个寄存器和一个计数执行单元CE。
- 四个寄存器都可被访问, 他们分别是:
- 二个输出端口——初值寄存器CR和控制寄存器
- 二个输入端口——计数输出寄存器/锁存器OL和状态寄存器
- 其中:
- CE不与CPU有直接联系
- CE总是从初值寄存器CR中获得计数初值
- 只有把CE的内容传到计数输出寄存器OL中, CPU才能读出某个时候的计数值
- 计 数 初 值 = f c l k ÷ f o u t 计数初值 = f_{clk} \div f_{out} 计数初值=fclk÷fout
8253的内部结构
-
8253有三个相互独立的结构完全相同的计数电路,分别称做计数器0、计数器1、计数器2。每个计数电路/通道包含:
- 一个8位的控制寄存器(存放计数器的工作模式控制字);
- 一个16位的初值寄存器(CR,8253工作前要对它设置初值);
- 一个16位的计数执行单元(CE,接收CR送来的内容,并对该内容执行减1操作);
- 一个16位的输出锁存器(OL,锁存CE的内容,使CPU能从中读出一个稳定的计数值);
-
CPU可以通过输入/输出指令对8253的内部寄存器进行访问。
- 每个计数器通过3个引腿和外部联系;
- 一个时钟输入端CLK(计数输出脉冲端)
- 一个门控信号输入端GATE
- 一个输出端OUT(输出信号端)
- 每个计数器通过3个引腿和外部联系;
8253的管脚分配
-
与CPU相连接的读写逻辑电路信号有:
- WR—写信号。有效时,表示CPU正对8253的某个计数器写入计数初值或对控制寄存器写入控制字。
- RD—读信号。有效时,表示CPU正对8253的某个计数器进行读操作。
- CS—片选信号。只有在它保持为低电平时,WR,RD才会被确认,否则将被忽略。
-
A
1
、
A
0
A_1、A_0
A1、A0—片内寄存器地址信号。用来对3个计数器和控制寄存器进行寻址。当
A
1
A
0
A_1A_0
A1A0=11时,通过读/写控制逻辑电路选中控制寄存器,写入控制字。
- 当 A 1 A 0 A_1A_0 A1A0=11时,第一次写入的一定作为控制字,此后写入的作为命令。
注意: WR和RD是针对CPU来说, 由CPU进行读写
-
三个计数器都有的外部输入/输出信号:
- CLK—计数器的时钟输入信号。用于输入定时基准脉冲或计数脉冲信号。在计数过程中,此引腿上每输入一个时钟信号,计数值减1,所以说,计数器是记录脉冲个数的计数器,而且计数器受到门控信号的控制。
- GATE—计数器的门控输入信号。由外部通过该引腿控制启动或禁止计数器的操作。
- OUT—时间到或计数结束输出信号。当计数器计数到0时,在该引腿必定有输出。在不同的模式下,可输出不同电平的信号。
- D0~D8—与CPU相连接的双向数据线。可传输向计数器写入的计数初值,向控制寄存器写入的控制字,或从计数器中读取的计数值等数据。
8253的编程
8253的命令字和状态字
- 方式选择命令字(方式控制字)
作用 : 选择一个计数器, 确定工作方式, 并规定初值的写入顺序和计数初值(一串0,1代码)的数制。
(1)计数器选择
D7 D6=00 选择 0 # 0^{\#} 0#计数器
=01 选择 1 # 1^\# 1#计数器
=10 选择 2 # 2^\# 2#计数器
=11 标志该命令字是 “读出命令”, 即读出控制字标志
(2)读/写方式选择
D5 D4=00 标志该命令为 “锁存命令”,即表示锁存计数器的当前计数值, 以便读出检查。
=01 初值写入时, 只写低8位, 高8位自动补0。计数值读出时, 只能读低8位
=10 初值写入时, 只写高8位, 低8位自动补0。计数值读出时, 只能读高8位。
=11 初值写入 / 计数值读出的顺序为先低8位,后高8位。
(3)工作方式选择
D3 | D2 | D1 | 选中的计数器工作方式 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
× | 1 | 0 | 2 |
× | 1 | 1 | 3 |
1 | 0 | 0 | 4 |
1 | 0 | 1 | 5 |
(4)数制选择
D0=0, 计数初值为二进制数;D0=1 ,初值为BCD码数。
计数初值为二进制时, 初值范围:
0000H~FFFFH
,0000H
表示65536,FFFFH
表示65535(所以最大初值为65536或0)计数初值为BCD码时, 初值范围:
0000H~9999H
其中0000H
表示10000; 即最大值为10000.
- 锁存命令
D7 D6为锁存对象。
= 00, 锁存 0 # 0^{\#} 0#当前计数值
= 01, 锁存 1 # 1^{\#} 1#当前计数值
= 10, 锁存 2 # 2^{\#} 2#当前计数值
- 读出命令
- 在读回命令中允许同时使D5和D4位为0, 即计数值和状态字都要读回。 但两者都要用同一个计数器端口, 输入顺序是区别两者的方法。此时, 第一次输入指令读入的一定是状态字;接着的一条或两条输入指令将读入计数值。
- 状态字(选学)
说明:
对8254一个计数器的初始化编程步骤:
-
向控制寄存器写入方式选择命令字。
-
目的: 选择一个计数器, 并确定其工作方式和计数值(或计数初值)的读/写顺序。
-
向选择的计数器写入计数初值。
-
注意:如果方式选择命令字D0 = 0, 则初值应是二进制, 否则初值应是BCD码数。
例题
-
设8253的口地址为40H ~ 43H, 要求2#计数器工作在方式3, 计数初值=4000, 请写出2#的初始化程序段。
解1: 设初值为二进制, 初值写入顺序为先低8位后高8位。
MOV AL, 10110110B
OUT 43H, AL
MOV AX, 4000
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
解2: 设初值为二进制, 写入顺序为仅写高8位。
MOV AL, 10100110B
OUT 43H, AL
MOV AL, 40
OUT 42H, AL
注意: 解2是错误的, 因为:4000=0FA0H, 其低8位不等于0。
解3: 设初值为BCD码, 写入顺序为先低后高。
MOV AL, 10110111B
OUT 43H, AL
MOV AL, 0
OUT 42H, AL
MOV AL, 40H
OUT 42H, AL
解4: 设初值为BCD码, 仅写高8位。
MOV AL, 10100111B
OUT 43H, AL
MOV AL, 40H
OUT 42H, AL
注意: 4000的BCD码数应写成4000H
, 解3、解4是正确的。
其中43H相当于11读出命令端口, 42H相当于10选中2#寄存器; 首先要读取命令才能去选工作的寄存器.这道题数制选择是关键; 它决定读/写方式的选择.初值是4000, BCD码为4000H; 二进制为0FA0H.
-
当计数初值 ≤ 9999时, “初值”选为二进制或BCD码都可以
当计数初值 > 9999时, “初值”只能选为二进制。
-
程序中如何表示BCD码数?
设初值=1234(十进制)
则 MOV AX, 1234H 是正确的
写成 MOV AX, 1234 是错误的
-
方式选择命令, 锁存命令,读出命令必须写入控制口。
-
关于锁存命令
当程序员要了解计数器的当前计数值时, 先向控制口写入锁存命令, 然后从选择的计数器端口读取当前计数值。
- 关于读出命令
读出命令也是锁存命令, 如果在锁存计数值的同时, 也锁存状态, 那么在随后对计数器读出时, 先读出的是状态字, 后读的是计数值。
例子:要求计数器0工作于方式3;输出方波的重复频率为2KHz,计数脉冲输入为2.5MHz,采用BCD计数,试写出初始化程序段。
解答: 计算计数初始值: N = f c l k ÷ f o u t = 2.5 M H z ÷ 2 K H z = 1250 N =f_{clk} \div f_{out}= 2.5MHz\div 2KHz=1250 N=fclk÷fout=2.5MHz÷2KHz=1250
方式控制字为00110111=37H,即计数器0,写16位,方式3,BCD计数。
设8253的端口地址为80H、81H、82H、83H。
则初值化程序段为:
MOV AL,37H ;写入方式控制字
OUT 83H,AL
MOV AL,50H ;写入计数初始值低8位
OUT 80H,AL
MOV AL,12H ;写入计数初始值高8位
OUT 80H,AL
8253的工作方式
8253可用6种模式工作,不论用那种模式工作,都会遵守下面几条基本规则:
①
先写控制字,一旦写入,所有控制逻辑电路立即复位,输出端OUT进入初始状态(高电平或者低电平)
②
软件启动: GATE端为高电平 置入计数初值后的第2个CLK脉冲的下降
硬件启动:GATE端有一个上升沿 对应CLK脉冲的下降沿
③
在时钟脉冲CLK的上升沿时,对门控信号GATE被采样在时钟脉冲CLK的下降沿时,计数器做减1计数。
④
初值自动重装的功能: 当计数值减到规定的数值后, 计数初值将会自动地装入计数器重新进行计数。
方式0——计数结束中断方式(软件启动)
- 方式0不具备“初值自动重装”的功能
- 当写入控制字CW后,OUT信号变为低电平。
- 当将计数初值写入计数初值寄存器CR后,利用下一个CLK脉冲的下降沿将CR的内容装入计数执行单元CE中,再从下一个CLK脉冲的下降沿开始,CE执行减1计数过程。
- 在计数期间输出OUT一直保持低电平,直到CE中的剩余计数值为零时才能使OUT变为高电平。
- 在此方式中,当GATE为高电平(GATE=1)时开放计数,当GATE为低电平(GATE=0)时禁止计数。
方式1——硬件可重触发单脉冲方式(硬件启动 )
-
由GATE的上升沿起触发作用,将CR内容装入CE开设计数。
-
其具体过程如下:
- 当写入控制字后,OUT信号变为高电平,并维持高电平不变,
- 写入计数值后,并不开始计数,当GATE的上升沿带来时,边沿触发器受到触发,下一个时钟脉冲的下降沿时,OUT端为低电平,计数值到达0以前一直维持低电平。
- 当计数值减到0时, OUT输出高电平, 在OUT端输出一个负脉冲, 负 脉 冲 宽 度 = 计 数 初 值 × C L K 脉 冲 周 期 = ( 即 N 个 时 钟 周 期 ) 负脉冲宽度=计数初值\times CLK脉冲周期 = (即N个时钟周期) 负脉冲宽度=计数初值×CLK脉冲周期=(即N个时钟周期)
方式2——周期性定时器方式(软/硬件启动 )
其具体过程如下:
-
当写入控制字后,OUT信号变为高电平,若GATE为高电平,则开始计数,
-
当CE为001H时,OUT信号变为低电平,宽度为一个时钟,然后CR内容自动装入CE,又重新计数,着个过程一直重复下去。(有初值自动重装功能; 输出波形为周期脉冲)
方式3——方波方式(软/硬件启动)
- 它除了OUT输出方波信号之外,和方式2完全相同。(也有自动重装功能)
- 典型用法是作为波特率发生器。
-
当计数初值为偶数时, 每来一个CLK脉冲, 计数值减2, 当计数值减到0时输出端改变极性, 内部完成初值自动重装, 继续计数。输出为 1 : 1 1:1 1:1 的方波, 正负脉冲的宽度均为 N / 2 N/2 N/2 个时钟(CLK)周期
-
如果计数初值为奇数
- 输 出 正 脉 冲 宽 度 = T C K L × ( N + 1 ) / 2 输出正脉冲宽度 =T_{CKL} \times (N+1)/2 输出正脉冲宽度=TCKL×(N+1)/2
- 输 出 负 脉 冲 宽 度 = T C K L × ( N − 1 ) / 2 输出负脉冲宽度 = T_{CKL} \times (N-1)/2 输出负脉冲宽度=TCKL×(N−1)/2
- 实际装入的初值以及自动重装的初值均为编程时写入的初值减1
- 在输出正脉冲期间, 每一个 T C K L T_{CKL} TCKL使计数值减2, 当计数值减到 − 2 -2 −2时, 输出端变成低电平, 内部完成初值重装, 重装的初值为编程时写入的初值减1
- 在输出负脉冲期间, 每一个 T C K L T_{CKL} TCKL使计数值减2, 当计数值减法 0 0 0时, 输出端变成高电平, 内部完成初值重装, 重装的初值为编程时写入的初值减1。
方式4——软件触发选通方式(软件启动)
-
它和方式0十分相似。
- 当GATE = 1时, 允许计数; 当GATE = 0时, 停止计数。
-
当写入控制字后,OUT变为高,在写入计数初值后的一个CLK脉冲开始减1计数。
-
若写入CR初值为N, 则经过 N + 1 N+1 N+1个CLK脉冲,才产生1个选通脉冲(低电平)。
- 与方式0比较,
- 主要区别是OUT端输出负脉冲的宽度不同
- 在方式0中是N+1个CLK脉冲周期之和,但在方式4中是一个CLK脉冲周期。
- 其次是计数期间的输出极性相反
- 方式0是低电平输出,方式4是高电平输出。
方式5——硬件触发选通方式(硬件启动)
-
它和方式1十分相似,只不过是计数为0时产生负极性的选通脉冲。
-
其具体过程如下:
- 当写入控制字后,OUT信号变为高电平,
- 写入计数值后,维持高电平不变,仅在GATE由低变高后的第一个CLK脉冲将CR内容下入CE,并开始计数,
- 当CE为0时,OUT输出低电平,宽度为一个时钟。
8253的工作方式小结
-
8253的六种工作方式可归为两类,
- 一个是充当频率发生器,
- 另一类主要是作计数器来使用。
-
下面我们就从这个角度来讨论总结OUT和GATE门的作用。
与频率发生器有关的工作方式:
-
8253有两种方式与频率发生器有关,即方式2和发生3,(软硬件启动方式)
-
对OUT端,方式2提供给用户的是负脉冲,方式3提供给用户的是方波。
-
在这个两种方式下,GATE信号要始终保持为高。
与计数器有关的工作方式
-
对于计数器类,有方式0、1和方式4、5。
-
启动计数器的方式有两种,
- 一种是CPU把时间常数写入相应通道后,计数器就开始工作,我们可以称之为软件启动方式,在这种启动方式下,GATE要始终保持为高电平,所以方式0和方式4可以称为软件启动方式。
- 另一种是硬件启动计数器,即CPU把时间常数写入计数器后,即使GATE为高电平,计数器并不工作。只有GATE发生跳变,其上升沿启动计数器工作,所以方式1和方式5就可以称为硬件启动方式。
-
计数器溢出时,OUT有两种输出形式,要么是电平,要么是负脉冲。前者有方式0方式1,后者有方式4和方式5。
补充:
脉冲信号一般是周期信号,电平信号一般是非周期性的; 其实他们没什么关系,它们有个共同点,即都是电压信号。脉冲信号可由信号发生器产生,也可以对可编程的芯片编程产生想要的脉冲。电平信号,有高电平、低电平; 高变低叫下降沿,低变高叫上升沿。一般也是由芯片输出的,同样是由编程控制的。
8253/8254的6种工作方式
方式0 | 方式1 | 方式2 | 方式3 | 方式4 | 方式5 | |
---|---|---|---|---|---|---|
功能 | 计数结束输出 正跃变信号 | 单脉冲发生器 | 频率发生器 | 方波发生器 | 单脉冲发生器 | 单脉冲发生器 |
启动方式 | 写入计数值 (软件)启动 | 外部触发 (硬件启动) | 写入计数值 (软硬件启动) | 写入计数值 (软硬件启动) | 写入计数值 (软件启动) | 外部触发 (硬件启动) |
输出波形 | 写入计数值N后, 经过N+1个CLK输出为高 | 宽度为N个 CLK周期的负脉冲 | 宽度为一个CKL周期的负脉冲 | 1.N偶数时; 正负脉宽均为N/2个周期 2.N奇数时;正:(N+1)/2; 负:(N-1)/2 | 宽度为一个CLK周期的负脉冲 | 宽度为一个CLK周期的 负脉冲初值重数 |
初值重数 | —— | —— | 初值自动重装 | 初值自动重装 | —— | —— |
计数过程中改变 计数初值 | 立即有效 | 外部触发后有效 | 计数到1后有效 | 外部触发有效; 计数结束后有效 | 立即有效 | 外部触发后 |
GATE = 0 | 停止计数 | —— | 停止计数 | 停止计数 | 停止计数 | —— |
上升沿 | —— | 启动计数 | 启动计数 | 启动计数 | —— | 启动计数 |
GATE = 1 | 允许计数 | —— | 允许计数 | 允许计数 | 允许计数 | —— |
Intel 8254与8253兼容,是8253的改进型,因此它的操作方式以及引脚与8253完全相同。它的改进主要反映在两个方面:一是8254的计数频率很高,可达10 MHz;二是8254多了一条读回命令.
8253应用举例
例1:设 f C L K = 1 M H z f_{CLK}=1MHz fCLK=1MHz,端口地址40H~46H,40H为0通道,42H为1通道,用0通道产生500Hz的方波。
说明:计数初值N : N = f C L K / f O U T = 1000000 / 500 = 2000 = 011111010000 B = 7 D 0 H N=f_{CLK}/f_{OUT}=1000000/500=2000=0111 1101 0000B =7D0H N=fCLK/fOUT=1000000/500=2000=011111010000B=7D0H
初始化编程:选二进制计数、方式3、先写低后写高,方式控制字为00110110B = 36H
例2:设8086系统中8253的三个计数器的端口地址为060H,062H和064H,控制口地址为066H,要求计数器0为方式 1,按BCD计数;计数初值为1800D,计数器1为方式0,按二进制计数;计数初值为1234H,计数器2为方式3,按二进制计数;当计数初值为065H时,试分别写出计数器0,1,2的初始化程序。
答案:
计数器0的初始化:00100011B=23H
MOV AL,23H ; 计数器0的控制字
OUT 066H,AL ;控制字写入8253的控制器
MOV AL,18H ; 取计数初值的高8位,低8位 ( 00可不送) OUT 060H,AL ; 计数初值送计数器0端口
计数器1和初始化:
计数器1的控制字:01110000B=70H
MOV AL, 70H ; 计数器的控制字:方式0, 送高8位和低8位,二进制计数
OUT 066H,AL ; 控制字写入8253的控制器
MOV AL,034H ; 取计数初值的低8位
OUT 062H,AL ; 计数初值的低8位,写入计数器1端口
MOV AL, 12H ; 取计数初值的高8位
OUT 062H,AL ; 计数初值的高8位写入计数器1端口
计数器2的初始化:
计数器2的控制字:10010110B=96H
MOV AL,96H ; 计数器2的控制字96H:方式3,只送低8位,二进制计数
OUT 066H,AL ;控制字写入8253的控制口
MOV AL,056H ;计数初值的低8位
OUT 064H,AL ;计数初值的低8位写入计数器2的端口
例3:要求读出计数器2的当前计数值,并检查是否为全“1”。
8253在读取计数器的当前计数值时,必须分两步进行。首先发一锁存命令(即控制字中RL1RL0=00),将当前计数值锁存到输出锁存器中。第二步执行读操作,即用IN指令将锁存器中内容读入CPU。
假设计数初值只有低8位,设其程序段如下(控制口地址为066H,计数器2的口地址为064H)
KEEP:MOV AL,80H ;计数器2的锁存命令 OUT 066H,AL ;锁存命令写入控制寄存器 IN AL,064H ;读输出锁存器中的当前计数值 CMP AL,0FFH ;比较当前计数值是否为全“1” JME KEEP ;非全“1”继续读 HLT ;为全“1”暂停
例4:将8253的计数器1作为5ms定时器,设输入时钟频率为200kHz,试编写8253的初始化程序。
(1)计数初值N计算
已知输入时钟CLK频率为200kHz,则时钟周期为T=1/f=1/200kHz=5μs,于是计数初值N为:N=5ms/T=5ms/5μs=1000。
(2)确定控制字
按题意选计数器1,按BCD码计数,工作于方式0,由于计数初值N=1000,控制字D5D4应为11,于是8253的控制字 为01110001B=71H
(3)选择8253各端口地址
设计数器1的端口地址为3F82H,控制口地址为3F86H。
(4)初始化程序如下MOV AL,71H ; 控制字 MOV DX,3F68H ; 控制口地址 OUT DX,AL ; 控制字送8253控制寄存器 MOV DX,3F82H ; 计数器1端口地址 MOV AL,00 ; 将计数初值N=1000的低8位写入计数器1 OUT DX,AL ; MOV AL,10 ; 将N的高8位写入计数器1 OUT DX,AL ;
例5: 以8086为CPU的某微机系统中使用了一块8253芯片,其通道端口地址为308H, 30AH,30CH,控制口地址为30EH,3个通道使用同一输入时钟,频率为2MHz,要求完成如下功能:
①利用计数器0采用硬件触发,输出宽度等于时钟周期的单脉冲,定时常数为36H;
②利用计数器1输出频率为2kHz的对称方波;
③利用计数器2产生宽度为0.6ms的单脉冲,
初始化程序。
根据题要求,对3个通道的工作方式,计数初值确定:由CLK0~CLK2=2MHz可得,时钟周期T=1/f=0.5μs
选计数器0:选择方式5,门控信号GATE应接一正跳变信号,OUT端当计数为0时产生一个宽度等于时钟周期的单脉冲。计数系数为36,用BCD计数。所以,计数器0的控制字应为00011011B=1BH。
选计数器1:选择方式3,GATE按+5V,CLK1=2MHz输出方波频率为2kHz,所以,计数常数N1=2MHz/2kHz=1000,采用 BCD计数,于是计数器1的控制字为:01110111B=77H。
选计数器2:选择方式1,以构成一个单稳态电路,输出脉冲宽度由计数常数N2决定,计数常数N2=600μs/0.5μs=1200,采用BCD计数,于是计数器2的控制字为:10110011B=B3H。计数通道0的初始化程序:
MOV DX,30EH ;8253的控制口地址 MOV AL,1BH ;计数通道0的控制字,低8位,方式5,BCD计数 OUT DX,AL ;控制字写入控制口 MOV DX,308H ;计数器0的端口地址 MOV AL,036H ;计数初值的低8位 OUT DX,AL ;低字节写入计数器0端口
计数通道1的初始化程序:
MOV DX,30EH ;8253的控制口地址 MOV AL,77H ;计数通道1的控制字,先写低字节,后写高字节,方式3,BCD计数 OUT DX,AL ;控制字写入控制口 MOV DX,30AH ;计数通道1的端口地址 MOV AL,00H ;计数初值的低字节 OUT DX,AL ;低字节写入计数通道1 MOV AL,10D ;计数初值的高字节 OUT DX,AL ;高字节写入计数通道1
计数通道2的初始化程序
MOV DX,30EH ;8253的控制口地址 MOV AL,B3H ;计数通道2的控制字,先写低字节, 后写高字节,方式1,BCD计数 OUT DX,AL ;控制字写入控制口 MOV DX,30CH ;计数通道的端口地址 MOV AL,00H ;计数初值的低字节 OUT DX,AL ;低字节写入计数通道 MOV AL,12D ;计数初值的高字节 OUT DX,AL ;高字节写入计数通道2
例6: 8253控制LED。要求:LED点亮10秒,熄灭10秒
分析: 8253的地址线与CPU高8位数据线D8——D15相连,8253的各端口的地址为81H、83H、85H、87H。
OUT1输出占空比为1**😗*1的方波, 8253端口1工作在方式3。
通道0初始化程序:
MOV AL, 00110101B OUT 87,AL MOV AL,00H OUT 81,AL MOV AL,50H OUT 81,AL
通道1初始化程序:
MOV AL, 01110111B OUT 87,AL MOV AL,00H OUT 83,AL MOV AL,80H OUT 83,AL
例7:设定时器0、定时器1工作于方式2,外部提供一个时钟,频率 f = 2 M H Z f =2MHZ f=2MHZ。要求定时器1每 5 m s 5ms 5ms产生一个脉冲,定时器0每 5 s 5s 5s产生一个脉冲。
1). 一个定时器的最大定时时间:
65536 / ( 2 × 106 ) = 0.032768 s = 32.768 m s 65536/(2\times106)=0.032768 s=32.768ms 65536/(2×106)=0.032768s=32.768ms
2). 将定时器1的 C L K 1 CLK_1 CLK1接 2 M H Z 2MHZ 2MHZ时钟,计数初值:
计数初值 n 1 = t 1 × f 1 = 5 m s × 2 × 1 0 6 = 10000 n_1 = t_1 \times f_1 = 5ms \times 2\times10^6 = 10000 n1=t1×f1=5ms×2×106=10000
3).将定时器1的 O U T 1 OUT_1 OUT1端接到定时器0的 C L K 0 CLK_0 CLK0端,定时器0的计数初值:
f 0 = 1 5 m s × 1 0 − 3 = 200 H z f_0 = \frac{1}{5ms\times10^{-3}} = 200Hz f0=5ms×10−31=200Hz
n 0 = f 0 × 5 s = 200 × 5 = 1000 n_0 = f_0\times 5s = 200 \times 5 = 1000 n0=f0×5s=200×5=1000