8253定时计数器实验
一、实验目的
1. 掌握8253的工作原理和六种工作方式;
2. 学会如何使用8253进行应用编程。
二、实验内容
1. 在实验台上连接所需导线。8255A芯片的PC6与8253的GATE0相连,8253的CLK0与时钟脉冲相连,8253的OUT0与示波器相连。
2. 编写程序,提供八个选择项,根据波特率的不同分为:110bps、150bps、300bps、600bps、1200bps、2400bps、4800bps和9600bps。当选择某一项时,在示波器中显示相应频率的方形波。
三、实验提示
定时/计数器8253是24脚双列直插式芯片,+5V电源供电。每个芯片内部有3格独立的计数器,每个计数器有自己的时钟输入CLK、计数输出OUT和门控信号GATE。通过编程选择计数器和设置工作方式,计数器既可作计数器用,也可作定时器用,故称定时/计数器。其引脚如图3-10 所示,内部结构如图3-11所示:
D0~D7:数据总线,为三态输出/输入线。
A1、A0:地址线,这两根地址线连接到系统地址总线的A1A0上,用于选择8253内部寄存器,以便对它们进行读写操作。
CLK:计数器时钟信号,输入信号。时钟信号的作用是在8253进行定时或计数工作时,每输入1个时钟脉冲信号CLK,便使计数值减1。
GATE:计数器门控信号,输入信号。是用来禁止、允许或开始计数过程的。
OUT:计数器输出信号,输出信号。OUT信号作用是:计数器工作是,每来1个时钟脉冲,计数器减1,当计数值减为0,就在输出线上输出一OUT信号,以示定时或计数已到。这个信号可作外部定时、计数控制喜好引到I/O设备,用来启动某种操作;也可作为定时、计数已到的状态信号供CPU检测,或作为中断请求信号使用。
8253芯片由数据总线缓冲器、读/写控制逻辑、控制命令寄存器和计数器组成。数据总线寄存器是一个三态、双向8位寄存器,用于将8253与系统数据总线D0~D7相连。数据总线缓冲器有3个基本功能:向8253写入确定8253工作方式得命令,向计数寄存器装入初值,读出计数器得初值或当前值;读/写逻辑由CPU发来得读/写信号和地址信号来选择读出或写入寄存器,并且确定数据传输得方向,是读出还是写入;控制命令寄存器接受CPU送来得控制字,这个控制字用来选择计数器及相应的工作方式,控制命令寄存器只能写入,不能读出;8253有三个独立的计数器,其内部结构完全相同,如图3-12 所示:
8253的计数器由16位计数初值寄存器、减1计数器和当前计数值锁存器组成。
8253是一个减1计数器,而不是加1计数器。因此,在它开始计数之前,一定要根据计数的要求,先计算出计数初值,并装入计数初值寄存器和减1计数器。计数初值与输入时钟频率(CLK)及输出波形(OUT)频率之间的关系为:
Ci = CLK/OUT
或 TC = CLK/OUT
8253的方式命令主要是对8253进行初始化,同时也可以对当前计数值进行锁存。8253初始化的工作有两点:一是向命令寄存器写入方式命令,以选择计数器,确定工作方式,指定计数器计数初值的长度和装入顺序以及计数初值的码制;二是向已选定的计数器按方式命令的要求写入计数初值。方式命令的格式如下:
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
计数器选择 |
读写字节数 |
工作方式 |
码制 |
D7D6(SC1SC0):用于选择计数器。SC1SC0=00,选择0号计数器;SC1SC0=01,选择1号计数器;SC1SC0=10,选择2号计数器;SC1SC0=11,不用。
D5 D4(RL1RL0):用来控制计数器读/写的字节数(1或2个字节)及读/写高低字节的顺序。
RL1RL0=00,为锁存命令,把由SC1SC0指定的计数器的当前值锁存在锁存寄存器中,以便去读取它;RL1RL0=01,仅读/写一个低字节;RL1RL0=10,仅读/写一个高字节;RL1RL0=11,读/写2个字节,先是低字节,后是高字节。
D3~D1(M2~M0):用来选择计数器的工作方式。M2 M1M0=000,0方式;M2 M1M0=001,1方式;M2 M1M0=010,2方式;M2 M1M0=011,3方式;M2 M1M0=100,4方式;M2 M1M0=101,5方式。
D0(BCD):用来指定计数器的码制,是按二进制还是按二~十进制数计数。BCD=0,二进制;BCD=1,二~十进制。
8253的每个计数器通道都有6中工作方式可供选用。区分这6种工作方式的主要标志有3点:一是输出波形不同;二是启动计数器的触发方式不同;三是计数过程中门控信号GATE对计数操作的控制不同。
各种方式的比较如表3-5所示:
工作 方式 |
GATE引脚输入状态所起的作用 |
OUT引脚 输出状态 |
|||
低电平 |
下降沿 |
上升沿 |
高电平 |
||
0 |
禁止 计数 |
暂停 计数 |
置入初值后,由WR上升沿 开始计数,由GATE的上升 沿继续开始计数 |
允许 计数 |
计数过程中输出低电平。计数至0,输出高电平(单次) |
1 |
不影响 计数 |
不影响 计数 |
置入初值后,由GATE的上 升沿触发开始计数,或重新 开始计数 |
不影响 计数 |
输出宽度为n个CLK的低电平(单次) |
2 |
禁止 计数 |
停止 计数 |
置入初值后,由写信号WR 的上升沿开始计数,由 GATE的上升沿重新开始计数 |
允许 计数 |
输出宽度为n个CLK、宽度为1个CLK的负脉冲(重复波形) |
3 |
禁止 计数 |
停止 计数 |
置入初值后,由写信号WR 的上升沿开始计数,由GATE 的上升沿重新开始计数 |
允许 计数 |
输出周期为n个CLK的方波(重复波形) |
4 |
禁止 计数 |
停止 计数 |
置入初值后,由WR的上升 沿开始计数,由GATE的上 升沿重新开始计数 |
允许 计数 |
计数至0,输出宽度为1个CLK的负脉冲(单次) |
5 |
不影响 计数 |
不影响 计数 |
置入初值后,由GATE的上 升沿触发开始计数或重新开 始计数 |
不影响 计数 |
计数至0,输出宽度为1个CLK的负脉冲(单次) |
表3-5 8253各个计数器6种工作方式的比较
从以上对比分析可知,一般,0方式,1方式和4方式,5方式选作计数器用(输出一个电平或一个脉冲),而2方式,3方式选作定时器用(输出周期脉冲或周期方波)。
8253初始化编程如图3-13所示:
四、实验流程图
五、参考程序
data segment
tc_table dw 678 ; 0=110bps
dw 497 ; 1=150b/s
dw 249 ; 2=300b/s
dw 124 ; 3=600b/s
dw 62 ; 4=1200b/s
dw 31 ; 5=2400b/s
dw 16 ; 6=4800b/s
dw 8 ; 1=9600b/s
temp db (?)
input_mes db 0dh,0ah ;系统提示信息
db 'Choices:'
db 0dh, 0ah
db ' 0: 110 BPS’s, 0dh, 0ah
db ' 1: 150 bps', 0dh, 0ah
db ' 2: 300 bps', 0dh, 0ah
db ' 3: 600 bps', 0dh, 0ah
db ' 4: 1200 bps', 0dh, 0ah
db ' 5: 2400 bps', 0dh, 0ah
db ' 6: 4800 bps', 0dh, 0ah
db ' 7: 9600 bps', 0dh, 0ah
db 'Please TAKES a choice (0-7) of baud-rate dispayed above! ', 0dh, 0ah
db 'or click [ESC] to quit', 0dh, 0ah
db 0dh, 0ah
db 'Please input your choice HERE:’ 0dh, 0ah,'$'
error_mes db 0dh, 0ah
db 'Input error! Please try again HERE:’ 0dh, 0ah,'$'
succ_mes db 'Now begin to generate baud, you can click other choice to change the RATE:’ 0dh, 0ah,'$'
data ends
code segment
ASSUME CS: CODE, DS: DATA
ok: mov dx,21bh ;8253命令口
mov al,036h ;8253方式命令, 0计数器,3工作方式,输出方波
out dx, AL
mov dx,203h ;8255命令口
mov al,80h ;8255方式命令
out dx, AL
mov al,0ch ;使PC6=0,关8253
out dx, AL
MOV AX, DATA
MOV DS, AX
choice: lea dx,input_mes ;提示选择波特率
MOV AH, 09H
int 21h
input: mov ah,08h ;等待键盘输入
int 21h
cmp al,1bh ;判断是否是esc键
jz quit
cmp al,'0' ;选择波特率是否正确?
jb error ;不正确,则转出错处理
CMP AL,'7'
JA ERROR
sub al,30h ;正确
mov temp,al ;则保存波特率代号
call load ;装入计数初值
jmp start ;启动8253波特率时钟发生器
error: mov ah,9h ;出错处理
lea dx, ERROR_mes
int 21h
jmp input ;重新选择波特率
start: mov dx,203h ;8255命令口
mov al,0dh ;使PC6=1,启动8253,产生波特率时钟
out dx, AL
lea dx, SUCC_mes
mov ah, 9H
int 21h
jmp choice ;不是,循环查Esc键
quit: MOV DX, 203H
mov al,0ch ;关闭8253
out dx, AL
mov ax,4c00h ;退出,返回DOS
int 21h
load proc near
PUSH AX
PUSH DX
PUSH SI
MOV DL, TEMP
shl dl,1 ;波特率代号乘2,存入在dx中
and dx,0fh ;只取dx的低4位
mov si,offset tc_table ;取定时常数表的首址→si
add si,dx ;si为定时常数表指针(首址+偏移量)
mov dx,218h ;计数器0的数据口
mov al,[si] ;装入计数初值低字节
out dx, AL
mov al,[si]+1 ;装入计数初值高字节
out dx, AL
pop si
pop dx
pop ax
ret
LOAD ENDP
CODE ENDS
END OK
六、实验结果