微机与接口技术笔记(5)
这章内容讲可编程定时器/计数器8253
概念
在计算机系统中使用的定时器/计数器归纳起来主要有三大类:软件定时器/计数器、硬件定时/计数器和可编程定时器/计数器。
软件定时器/计数器
软件定时器/计数器是实现系统定时控制或延时控制的最简单的方法。在计算机中CPU每执行一条指令所占用的周期(T状态)数是确定的,用汇编语言编写一段具有固定延时时间的循环程序,将该程序的每条指令的T状态数加起来,乘以系统的时钟周期,就是该程序执行一遍所需的延时时间。 设计者可选择不同的指令条数和不同的循环次数来实现不同的时间延迟。
硬件定时器/计数器
硬件定时器/计数器是指由硬件电路来实现的定时与计数。对于较长时间的定时一般用硬件电路来完成,采用硬件定时/计数器它的成本低,使用方便。
可编程定时器/计数器
可编程定时器/计数器,是一种软硬件结合的定时器/计数器,将定时器/计数器电路做成通用的定时器/计数器并集成到一个芯片上,定时器/计数器工作方式又可由软件来控制选择。这种定时器/计数器芯片可直接对系统时钟进行计数,通过写入不同的计数初值,可方便地改变定时与计数时间,在定时期间不占用CPU资源,更不需要CPU管理。Intel公司生产的8253就是这样的可编程定时器/计数器芯片。
8253的主要功能
8253具有三个独立的功能完全相同的16位减法计数器,24脚DIP封装,由单一的+5V电源供电。主要功能如下
- 每片8253上有三个独立的16位减法计数器,最大计数范围为0~65535。
- 每个计数器都可按二进制或二—十进制计数(BCD:用4位二进制数来表示1位十进制数中的0~9这10个数码)。
- 每个计数器都有六种不同的工作方式,都可以通过程序设置和改变。
- 每个计数器计数脉冲的频率最高可达2 MHz。
- 全部输入/输出与TTL电平兼容。
8253的读、写操作,对系统时钟没有特殊要求,因此可以应用于任何一种微机系统中,可作为可编程定时器、计数器还可以作分频器、方波发生器以及单脉冲发生器等。
引脚
8253引脚如图。8253芯片有24根引脚,没有复位信号RESET引脚。

各引脚信号定义如下:
- CS(21脚):片选信号,输入,低电平有效。它与译码器输出信号相连接,当为低电平时,8253芯片被CPU选中。
- A1(20脚)、A0(19脚):输入信号,用来对3个计数器和控制寄存器进行寻址,与CPU的系统地址线相连。当A1、A0为00、01、10、11时分别表示对计数器0、计数器1、计数器2和控制寄存器的访问。
当CPU为8位数据总线时,8253的A1、A0可与地址总线的A1、A0相连;当CPU为16位数据总线时,8253的A1、A0引脚分别与地址总线的A2、A1相连。 - WR(23脚):写引脚,输入,低电平有效。用于控制CPU对8253的写操作,此引脚与CPU系统控制总线的相连。
- RD (22脚):读引脚,输入,低电平有效,用于控制CPU对8253的读操作,此引脚与CPU系统控制总线的相连。
8253读/写逻辑信号组合功能及地址分配如表:
CS | WR | RD | A1 | A2 | 操作功能 |
---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 初值写入计数器0的初值寄存器CR0里 |
0 | 0 | 1 | 0 | 1 | 初值写入计数器0的初值寄存器CR1里 |
0 | 0 | 1 | 1 | 0 | 初值写入计数器0的初值寄存器CR2里 |
0 | 0 | 1 | 1 | 1 | 写控制字寄存器 |
0 | 1 | 0 | 0 | 0 | 读计数器0输出锁存器OL0的内容 |
0 | 1 | 0 | 0 | 1 | 读计数器0输出锁存器OL1的内容 |
0 | 1 | 0 | 1 | 0 | 读计数器0输出锁存器OL2的内容 |
CLK0~2:时钟,输入。CLK时钟信号用于控制计数器的减1操作,CLK可以是系统时钟脉冲,也可以由系统时钟分频或者是其他脉冲源提供,输入的时钟频率在1MHz~2MHz范围内。
GATE0~2:门控信号,输入,由外部信号通过GATE端控制计数器的启动计数和停止计数的操作。
OUT0~2:时间到或计数结束输出引脚。当计数器计数到0时,在OUT引脚有输出。在不同的模式下,可输出不同电平的信号。
内部结构
8253的内部结构由数据总线缓冲器、读/写逻辑电路、控制字寄存器和三个计数通道所组成。

数据总线缓冲器
数据总线缓冲器是8位、双向、三态的缓冲器,通过8根数据线D0~D7接收CPU向控制寄存器写入的控制字,向计数器写入的计数初值,也可把计数器的当前计数值读入CPU。
读/写逻辑电路
读/写控制逻辑电路从系统总线接收输入信号,经过译码,产生对8253各部分的控制信息。
控制字寄存器
当地址信号A1和A0都为1时,访问控制字寄存器。控制字寄存器接收从CPU发来的控制字,控制字决定了8253的工作方式、计数方式以及使用哪个计数器等。控制字寄存器只能写入不能读出。
计数通道
8253有3个相互独立的同样的计数电路,分别称作计数器0、计数器1和计数器2。
每个计数器包含一个8位的控制寄存器(控制单元),它存放计数器的工作方式控制字;一个16位的初值寄存器CR(时间常数寄存器),8253工作之前要对它设置初值;一个16位计数执行单元CE,它接收计数初值寄存器CR送来的内容,并对该内容执行减1操作;一个16位输出锁存器OL,它锁存CE的内容,使CPU能从输出锁存器内读出一个稳定的计数值。

8253的控制字和读写操作
8253的控制字
8253的控制字主要用于:
选择哪个计数器通道工作,决定用8位的计数值或是用16位的计数值,按二进制计数或按十进制计数(BCD码),工作在那种方式。
8253是由主机编程设定的,通过把一个8位的控制字写
入8253的控制字寄存器,使8253按照某种给定的方式工作。

8253控制字各位的详细意义如下:
- SC1、SC0用于选择工作的计数器。
- SC1SC0=00:选择计数器0工作。
- SC1SC0=01:选择计数器1工作。
- SC1SC0=10:选择计数器2工作。
- SC1SC0=11:无效。
- RW1、RW0 用于选择读写格式。
- RW1RW0=00:计数器锁存命令,把写本命令时的当前计数值锁存到输出锁存器OL中,以供CPU读 取。
- RW1RW0=01:8位计数,只读/写计数器低位字节,高位字节自动为0。
- RW1RW0 =10:16位计数,只读/写计数器高位字节,低位字节自动为0。
- RW1RW0 =11:16位计数,先读/写计数器低位字节,后读/写计数器高位字节。
- M2、M1、M0用于选择工作方式。
- M2M1M0=000: 使计数器工作于方式0。
- M2M1M0 =001:使计数器工作于方式1。
- M2M1M0 =010:使计数器工作于方式2。
- M2M1M0 =011:使计数器工作于方式3。
- M2M1M0 =100:使计数器工作于方式4。
- M2M1M0 =101:使计数器工作于方式5。
- BCD计数方式选择
- 当BCD位=0时,则计数器按二进制计数,其计数范围是16位二进制数,最大计数值为216=65536(对应计数初值为0000H);
- 当BCD位=1时,则计数器按十进制(BCD码)计数,其计数范围是四位十进制数,最大计数值为104=10000,对应计数初值为0000。
在赋初值时需要注意两点
当采用二进制计数时
如果初值N是8位二进制计数(计数值≤256),则在8253初始化编程的传送指令“MOV AL,N”中,立即数“N”可以写成任何进制数的形式;
如果初值N是16位二进制计数(计数值≤65536),一种方法是先把计算得到的十进制计数初值N转换成4位十六进制,然后分两次写入8253的指定端口,另一种方法是先把该十进制计数初值N直接传给AX, 然后分两次写入8253的指定端口。
例如:
1 | MOV AX, N ;N是16位二进制计数 |
采用十进制(BCD码)计数时
必须在8253初始化编程中把计算得到的十进制计数初值N加上后缀H,这样才能在传送指令执行后能够在AL(或AX)中得到十进制数N的BCD码表示形式,例如N=30
1 | MOV AL,30H |
如果初值N=2567,则需要分两次写入,即:
1 | MOV AX,2567H |
也可以按如下方法两次写入,即:
1 | MOV AL,67H |
8253的初始化编程(写操作)
8253没有复位信号,加电开机后,其工作方式是不确定的。因此需要对8253进行初始化,初始化步骤如下所示。
- 根据题目要求设计写出8253的控制字。
- 将控制字写入计数器的控制寄存器中。
- 写入定时或计数的初值。这里要注意的是如果计
数值为16位,则要CPU执行两次输出指令完成初值
的设置,即先写低字节,再写高字节。
设8253的片选信号接200H~207H,使用计数器1,工作于方式3(方波发生器), 二进制计数,计数初值为3000H,请编写初始化程序。
解:方法1:16位计数,先写低8位,后写高8位。根据题目写出控制字为01110110B(76H)。
1 | MOV DX,203H ;8253控制寄存器 |
方法2: 16位计数,只写高8位,低8位自动为0。
1 | MOV DX,203H ;8253控制寄存器 |
设8253的端口地址为208H~20FH,使用计数器0,工作于方式4,二进制计数;使用计数器2,工作于方式5,十进制计数。计数器0和计数器2的计数初值都等于十进制数值512(0200H),请编写初始化程序。
解:
1 | MOV AL,38H ;控制字00111000B,二进制计数、方式4、计数器0、先写低8位、后写高8位 |
1 | MOV AL,0BBH ;控制字10111011B,BCD、方式5、计数器2、先写低8位、后写高8位 |
8253当前计数值的读取(读操作)
为了对计数器的计数值进行实时检测,需将计数器中的计数值读回CPU。编程顺序如下。
- 输出锁存器锁存或停止计数,以保证当前计数值读出稳定。
- 读输出锁存器的读数。
当前的计数值读取:
一种方法是把当前计数值输出锁存器锁存,输出锁存器锁存是通过写入控制字,使D5、D4分别为0,使当前的计数值不受计数执行单元的变化而变化,保证CPU从锁存器读出一个稳定的计数值。此时计数执行单元作减1操作,计数过程不停止。另一种方法是通过GATE门控信号发一低电平信号,使计数执行单元不作减1操作,计数过程停止。
读输出锁存器的值,也有读8位和读16位的问题,若是读16位的数据,需分两次读出,先读低字节,再读高字节,即执行两次输入指令。
设8253的端口地址为208H~20FH,请编写程序读取计数器2的当前计数值。( 20BH:控制字寄存器端口地址,20AH:计数器2端口地址)
1 | MOV AL,80H ;计数器2的锁存命令 (10000000B) |
8253的工作方式
8253的工作方式有6种,不论哪种工作方式,都遵守如下几条基本原则。
- 控制字写入计数器时,所有的控制逻辑电路立即复位,输出端OUT进入初始状态。该初始状态与工作方式有关,设置成方式0时,OUT的初始状态为低电平,设置成其他工作方式,OUT的初始状态为高电平。
- 初始值写入初值计数器CR以后,要经过一个时钟脉冲的上升沿和下降沿,将初值送入计数执行单元,计数执行单元从下一个时钟开始进行计数。
- 通常,在时钟脉冲CLK的上升沿对门控信号GATE进行采样,各计数器的门控信号的触发方式与工作方式有关。在方式0、方式4中,门控信号为电平触发;方式1、方式5中,门控信号为上升沿触发;方式2、方式3中,即可用电平触发,也可用上升沿触发。
- 在时钟脉冲的下降沿计数器进行计数。
方式0 —— 计数到零产生中断请求
在方式0下,可利用OUT的上升沿作为中断请求信号。门控信号决定计数的启/停,影响是否暂停减一。装入初值决定计数过程重新开始,改变计算值是立即有效的,计数过程时序图所示。

方式1 —— 可重触发的单稳态触发器
方式1是在GATE门控信号的作用下才开始计数,计数过程时序所示。

方式2 —— 分频器
在方式2下,用门控信号达到同步计数的目的,方式2计数过程时序如图所示。

方式3 —— 方波发生器
方式3和方式2的工作过程类似,两者的主要区别是输出的脉冲
宽度不同,方式3计数过程时序图如图所示。GATE=1,允许计数,GATE=0,禁止计数。

简单来说就是没有0值,1下一个计数会自动重新装载初值,计数为偶数时前半部分out为高电平,后半部分为低电平,奇数时高电平多一个计数值。
方式4 —— 软件触发选通方式
方式4为软件触发选通方式,其计数过程时序图所示。

方式5 —— 硬件触发选通方式
方式5为硬件触发选通方式,完全由GATE端引入的触发信号控制定时和计数,其计数过程时序图所示。

六种工作方式小结
通过对上面的6种工作方式的分析,可以看出门控信号和写入新的初值会影响计数过程的进行,不同的工作方式,会得到不同的输出波形。在8253的应用中,必须正确使用门控信号和写入新的初值这种触发方式,才能保证各计数器的正常操作;必须了解输出波形的形态,才能正确应用到各种控制场合。为此,把6种工作方式作如下小结。
OUT的输出波形
在六种工作方式中,只有方式0在写入控制字后OUT输出为低电平,其他五种方式OUT输出都为高电平。方式2、方式4和方式5都是输出宽度为一个CLK周期的负脉冲,输出波形都相同,但方式2是连续工作的,方式4是由软件触发的,方式5是由硬件门控脉冲触发的。计数初值N与输出波形的关系见表。

GATE门控信号的作用
一般情况下,GATE信号为低电平时禁止计数,为高电平时允许计数,方式1和方式5则需要有由低变高的上升沿触发脉冲来启动计数。GATE信号对各种工作方式的影响如表所示。

计数初值的设置
任何一种工作方式,只有在写入计数初值后才能开始计数。门控信号GATE保持为高电平,方式0、方式2、方式3和方式4在写入计数初值后,计数过程就开始了;而方式1和方式5需要有外部GATE触发,才能开始计数。
计数过程中改变计数值的影响
8253在计数过程中写入新的计数初值,对计数过程的影响见表所示。

课后题
- 设8253计数器的时钟输入频率为1.91MHz,为产生25kHz的方波输出信号,应向计数器装入的计数初值为76。
- 在异步通信时,完整的一帧信息一般包括4个部分,传送过程中,它们的正确顺序是 起始位、数据位、校验位、停止位 。
- 在异步串行通信中,使用波特率来表示数据的传送速率,它是指
每秒钟传送的二进制数。 - 全双工和半双工通信的区别时什么?
全双工和半双工通信,双方既是发送器又是接收器。两者的区别在于全双工可以同时发送和接收。半双工不能同时双向传输,只能分时进行。 - 同步传输方式和异步传输方式的特点各是什么?
同步传输方式中发送方和接收方的时钟是统一的,字符与字符间的传输是同步无间隔的。异步传输方式并不要求发送方和接收方的时钟完全一样,字符与字符间的传输时异步的。 - RS-232C接口的信号电平采用什么逻辑?逻辑“1”和“0”电平各为多少?
RS-232C接口的信号电平采用负逻辑。将-15V-5V规定为逻辑“1”,+5V+15V 规定为“0”。