8253初始化程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8253的初始化编程
8253的初始化编程内容:一是首先向控制寄存器写入控制字,以选定计数通道(三个中之一),规定该计数的工作方式和计数方式以及计数初值的长度和装入顺序(初值
写入方式);二是向已选定的计数器按控制字的要求写入计数初值。
8253初始化的要求:
(1)对每个计数器,控制字必须写在计数值之前。
这是因为计数器的读/写格式由它
的控制字决定。
(2)计数值必须按控制字所规定的格式写入。
若控制字规定只写8位,只需写入一次(8位)计数值即可(规定写低8位则高8位自动置0,规定写高8位则低8位自动置0);规定写16位时必须写两次,先写低8位,后写高8位。
当初值为0时,也要分两写入,因在二进制计数时,“0”表示65336,在BCD码计数时“0”表示
10000=104。
(3)对所有方式计数器都可以在计数过程中或计数结束后改变计数值,重写计数值也必须遵守控制字所规定的格式,并且不会改变当前计数器的工作方式。
(4)计数值不能直接写到减1计数器中,而只能写入计数值寄存器中,并由写操作之后的下一个CLK脉冲将计数值寄存器的内容装入减1计数器开始计数。
(5)初始化编程必须明确各个计数器的控制字和计数值不是写到同一个地址单元。
各个计数器的控制字各自独立确定,但它们都写入同一个端口地址(控制字寄存器)中,各个计数器的计数值则根据需要独立确定并写入各自计数器的相应寄存器中。
例1:设8086系统中8253的三个计数器的端口地址为060H,062H和064H,控制
口地址为066H,要求计数器0为方式 1,按BCD计数;计数初值为1800D,计数器1为方式0,按二进制计数;计数初值为1234H,计数器2为方式3,按二进制计数;当计数初值为065H时,试分别写出计数器0,1,2的初始化程序。
计数器0的初始化:
计数0的控制字:00100011B=23H
MOV AL,23H ;计数器0的控制字
OUT 0 66H,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的端口
例2:要求读出计数器2的当前计数值,并检查是否为全“1”。
8253在读取计数器的当前计数值时,必须分两步进行。
首先发一锁存命令(即控制字中RL1RL0=00),将当前计数值锁存到输出锁存器中。
第二步执行读操作,即用IN 指令将锁存器中内容读入CPU。
假设计数初值只有低8位,设其程序段如下(控制口地址为066H,计数器2的口地址为064H):
KEEP:MOV AL,80H ;计数器2的锁存命令
OUT 066H,AL ;锁存命令写入控制寄存器
IN AL,064H ;读输出锁存器中的当前计数值(从计数器2端口读)
CMP AL,0FFH ;比较当前计数值是否为全“1”
JME KEEP ;非全“1”继续读
HLT ;为全“1”暂停
8253的应用举例
例1:将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
例2:以8086为CPU的某微机系统中使用了一块8253芯片,其通道端口地址为
308H, 30AH,30CH,控制口地址为30EH,3个通道使用同一输入时钟,频率为
2MHz,要求完成如下功能:
利用计数器0采用硬件触发,输出宽度等于时钟周期的单脉冲,定时常数为36H;
利用计数器1输出频率为2kHz的对称方波;
利用计数器2产生宽度为0.6ms的单脉冲,
试设计该定时系统硬件电路和初始化程序。
(1)硬件电路设计
硬件电路设计主要是地址译码电路设计及时8253与CPU间的连接。
根据给定的端口
地址可知,地址总线低位部分的 A9~A0分别为:A9A8=11,A7~A4=0000,
A3A2A1=100~111,A0=0,由它们经译码器译码产生8253的片选信号, 8253的数
据线D7~D0必须与系统数据总线的低8位相连,8253的端口的选择信号A1A0应连
系统地址的A2A1。
根据上述要求,译码器应选3-8译码器74LS138。
该译码器有3
个代码输入端(C,B,A),输入3位代码决定译码信号从 Y0~Y7中哪一个输出,本例中显然应以Y2输出。
(2)初始化编程
根据题意要求,对3个通道的工作方式,计数初值确定如下:
由CLK0~CLK2=2MHz可得,时钟周期T=1/f=1/2MHz=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。
根据以上分析可得3个计数通道的初始化程序如下。
计数通道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
计数通道2初始化程序:
MOV AL,B0H ;计数通道2的控制字
OUT 05FH,AL ;控制字写入控制器
MOV AL,068H ;计数初值的低8位
OUT 05DH,AL ;计数初值的低8位写入计数通道2。