第九章 可编程计数器8253.docx
《第九章 可编程计数器8253.docx》由会员分享,可在线阅读,更多相关《第九章 可编程计数器8253.docx(22页珍藏版)》请在冰点文库上搜索。
第九章可编程计数器8253
第九章可编程定时计数器8253
一概述
⒈定时器和计数器
定时控制在微机系统中极为重要
①定时器由数字电路中的计数电路构成,通过记录高精度晶振脉冲信号的个数,输出准确的时间间隔;
②计数电路如果记录外设提供的具有一定随机性的脉冲信号时,它主要反映脉冲的个数(进而获知外设的某种状态),常又称为计数器。
⒉定时功能的实现方法
①软件延时——利用微处理器执行一个延时程序段实现;
②不可编程的硬件定时——采用分频器、单稳电路或简易定时电路控制定时时间;
③可编程的硬件定时——软件硬件相结合、用可编程定时器芯片构成一个方便灵活的定时电路。
二8253定时计数器的内部结构和外部特性
⒈概述
①3个独立的16位计数器通道;
②每个计数器有6种工作方式;
③按二进制或十进制(BCD码)计数。
⒉内部结构
内部结构图
①数据总线缓冲器
是8253与CPUDB连接的8位双向三态缓冲器,CPU通过它向8253写方式控制字到控制字寄存器中,写计数初值到计数通道,读取计数通道的当前计数值。
②读/写控制逻辑
控制8253内部操作。
当
无效,8253的DB处于高阻状态,当
有效,
和A1、A0、
、
组合,对3个计数通道、控制字寄存器进行读/写操作,见下表。
8253读写操作及端口选择表
注意:
CPU对控制字寄存器只能写,不能读;
CPU对计数通道写的是计数初值,读的是当前计数值。
③控制字寄存器
8253初始化编程时,CPU写控制字到控制字寄存器,以选择计数通道及相应的工作方式。
④数通道0~2
8253内部包括3个功能完全相同和操作完全独立的计数通道,每个计数通道由16位减法计数器、16位计数初值寄存器和16位计数值锁存器组成。
初始化时,向计数通道装入的计数初值,先送到计数初值寄存器中保存,然后送到减法计数器。
计数器启动后,减法计数器对CLK的下降沿进行减1计数,在未锁定时把结果送入16位计数值锁存器中。
当计数值减到0时,输出OUT信号,一次计数结束。
计数初值寄存器的内容,在计数过程中保持不变。
计数初值寄存器和计数值锁存器占用一个端口地址(即该计数通道口地址),CPU读取计数通道的当前计数值来自计数值锁存器。
各通道可工作在计数器方式,此时被计数的事件以脉冲方式从CLK输入;
各通道可工作在定时器方式,此时确定频率的时钟脉冲从CLK输入。
计数初值=定时时间÷CLK周期
各通道的启动、禁止、允许计数与门控信号GATE有关,GATE的作用OUT的输出波形随各通道工作方式不同而不同。
④计数器结构示意图
计数初值存于预置寄存器;
在计数过程中,减法计数器的值不断递减,而预置寄存器中的预置不变;
输出锁存器用于写入锁存命令时,锁定当前计数值。
⒊8253的引脚功能
①与CPU相连的引脚
D7~D0:
双向三态DB;
:
读,
:
写,低电平有效;
:
片选;
A1A0:
片内端口选择。
②计数通道引脚
CLK2~CLK0:
计数脉冲输入;
OUT2~OUT0:
当计数值减到0时,OUT有输出,输出波形取决于通道工作方式;
GATE2~GATE0:
门控信号输入,是控制计数器工作的一个外部信号,它的作用是用来禁止、允许或启动计数过程的。
每个计数通道均有6种不同工作方式,GATE信号的控制作用不同。
GATE信号总是在CLK的上升沿被采样。
三8253的工作方式
Intel8253的每个计数通道都有6种工作方式可供选用。
这6种工作方式主要有5点不同。
一是启动计数器的触发方式和时刻不同;二是计数过程中门控信号GATE对计数操作的影响不同;三是OUT输出波形不同;四是在计数过程中重新写入计数初值对计数过程的影响不同;五是计数过程结束,减法计数器是否恢复计数初值并自动重复计数过程不同。
上述五点不同,有相互关联,学习时应灵活运用。
⒈方式0—计数结束时中断
当写入控制字后,OUT立即变为低电平;启动计数方式:
软启动。
即仅当GATE为高电平时,在写入计数初值后的第一个CLK下降沿到来时,计数初值寄存器的内容装入到减法计数器中,此后减法计数器对每一个CLK下降沿作减法计数,直到计数结束。
在计数过程中,OUT一直维持低电平,直至减法计数器减到0时,OUT变高。
见图9.1~9.3。
图9.1方式0波形图
图9.2方式0时GATE信号的作用
图9.3方式0计数过程中改变计数值
具有以下特点:
①计数器只计一遍。
当计到0时,减法计数器不恢复计数初值,不开始重新计数,且OUT保持高电平。
只有重新写入计数初值后,OUT才变低,开始新的计数;
②启动计数方式:
软启动。
③GATE为低电平时,计数暂停,当GATE变高后就接着计数。
在计数过程中,GATE的变化不影响OUT的状态。
④计数过程中可重新写入计数初值。
如果是8位计数初值,在写入新的计数初值后,计数器将按新的计数初值重新开始计数;如果是16位计数初值,在写入第一个字节后,计数器停止计数,在写入第二个字节后,计数器按照新的计数初值开始计数。
⑤8253没有中断控制电路,也没有专用中断请求线。
若要中断,则可用OUT的正跳变作为中断请求信号。
⒉方式1—可重复触发的单稳态触发器
图9.4方式1波形图
当写入控制字后,OUT立即变高,计数初值写入后,计数器并不开始计数,启动计数方式是硬启动。
即要有GATE上升沿触发,在GATE信号上升沿之后的第一个CLK下降沿到来时将计数初值装入减法计数器,OUT立即变低,然后开始减1计数过程。
在整个计数过程中,OUT维持低电平,直至计到0,OUT变高。
因此OUT输出一个单拍负脉冲。
若想再输出一个单拍负脉冲,必须再次用GATE上升沿触发,否则OUT维持高电平。
见图9.4~9.6。
图9.5方式1时GATE信号的作用
图9.6方式1在计数过程中改变计数值
具有以下特点:
①启动计数方式是硬启动。
②若初值为N,则OUT输出的单拍负脉冲低电平宽度为N个CLK周期;
③当计到0后,可再次用GATE触动启动计数器计数,输出一个同样宽度的单负脉冲,而不必再次送计数初值;
④在计数过程中,若计数器没有减到0,又有GATE上升沿触发,则OUT仍为低,计数器重新计数,直至计到0,OUT变高,其作用使OUT输出的单负脉冲宽度加宽。
⑤在计数过程中,若写入一个新的计数初值,这时计数过程不受影响,要等GATE再次触发后,才按新的计数初值重新开始计数。
⒊方式2—频率发生器
当写入控制字后,OUT立即变高,写入计数初值后,如果GATE为高,则计数器立即开始计数。
在计数过程中,OUT维持高电平,对每个计数脉冲作减1计数直至计到1时,OUT由高变低,经过一个CLK周期,OUT恢复为高,若GATE仍为高,计数器又开始重新计数。
见图9.7。
图9.7方式2波形图
具有以下特点:
①启动计数方式是硬启动或软启动。
②能够连续工作。
若CLK为一定频率的时钟脉冲,计数初值为N,只要保持GATE为高电平,则OUT输出波形的周期为N个CLK周期,其中高电平宽度为N-1个CLK周期,低电平宽度为1个CLK周期,见图9.7。
③若在计数过程中,GATE变为低电平,则计数器立即停止计数。
在GATE变为高后的下一个CLK使减1计数器恢复计数初值,重新开始计数。
④在计数期间,如果向计数器写入新的计数初值,这对正在进行的计数过程没有影响,但在计到1输出一个CLK宽度的负脉冲后,计数器将按新的计数初值开始计数。
⒋方式3—方波发生器
与方式2基本相同,也具有自动装入计数初值的能力,OUT输出波形也是周期性的,唯一不同的是OUT输出波形占空比不同。
若初值N为偶数,在装入计数初值后,每一个CLK使减法计数器减2,当减到0,一方面OUT输出改变状态,另一方面又重新装入计数初值开始新的计数,OUT输出波形为方波,其重复周期为N个CLK周期;若初值N为奇数,则在装入计数初值后,第一个CLK使减法计数器减1,以后每个CLK使计数器减2,当计到0,OUT输出改变状态,同时重新装入计数初值,这以后第一个CLK使计数器减3,以后每一个CLK使计数器仍减2,直至计到0,OUT恢复高电平,重复上述过程。
OUT输出波形重复周期为N个CLK周期,其中高电平宽度为(N+1)/2个CLK周期,低电平宽度为(N-1)/2个CLK周期。
见图9.8、9.9。
图9.8方式3计数值为偶数时的波形图
图9.9方式3计数值为奇数时的波形图
具有以下特点:
和方式2类似,唯一不同的是OUT输出重复波形占空比不同。
⒌方式4—软件触发
当写入控制字后,OUT立即变为高电平,启动计数方式是软启动,启动计数后则计数器开始减1计数,当计到0时,OUT变低,经过一个CLK周期,OUT输出一个宽度为一个CLK周期的负脉冲,见图9.10。
图9.10方式4波形图
具有如下特点:
①启动计数为软启动;
②计数初值一次有效,只有再次输入计数初值,才开始新的计数;
③在计数过程中,若GATE变低,则停止计数,待GATE变高后,不是继续计数,而是恢复计数初值重新计数,GATE不影响OUT;
④若在计数过程中,写入一个新的计数初值,对本次计数过程无影响,而是等到计数过程结束,新初值才装入到减法计数器,使下一次计数按新的初值进行。
⒍方式5—硬件触发
当写入控制字后,OUT立即变为高电平,启动计数为硬启动,启动计数后,作减1计数,当计到0时,OUT变低,经过一个CLK周期,OUT又变高,停止计数,待到下一次GATE触发,才能再次从初值开始计数。
见图9.11。
图9.11方式5波形图
具有以下特点:
①启动计数为硬启动;
②输出波形与方式4相同;
③在计数过程中,若有GATE触发,则计数器重新从初值开始计数,但不影响OUT;
④在计数过程中,若写入一个新的计数初值,只要没有GATE触发,不影响计数过程。
现行计数计到0后,若有GATE触发,则按新的计数初值开始计数。
但在计数过程中,若写入一个新的计数初值后,有GATE触发,则立即按新的计数初值重新开始计数。
⒍各种方式下的输出波形
四8253编程
⒈方式控制字
写到控制字寄存器。
①格式
D7
D6
D5
D4
D3
D2
D1
D0
SC1
SC0
RL1
RL0
M2
M1
M0
BCD
②说明
SC1SC0:
计数器选择,00:
计数通道0;01:
计数通道1;
10:
计数通道2;11:
非法。
RL1RL0:
规定CPU向计数通道写入的计数初值格式或规定CPU读取计数通道锁存器当前计数值格式。
计数器可写入8位数据,也可写入16位数据,而写入的8位数据又可分为两种格式:
仅写低8位,则高8位自动置0,或仅写高8位,则低8位自动置0。
写入16位数据时,应先写入低8位,后写入高8位。
若RL1RL0=00,锁存计数器当前值,使锁存器不随计数器值变化而变化;
RL1RL0=01,只读/写低8位数据;
RL1RL0=10,只读/写高8位数据;
RL1RL0=11,读/写16位数据,先读/写低8位,后读/写高8位。
M2M1M0:
工作方式选择
若M2M1M0=000,方式0;
M2M1M0=001,方式1;
M2M1M0=×10,方式2;
M2M1M0=×11,方式3;
M2M1M0=100,方式4;
M2M1M0=101,方式5。
BCD:
BCD=1,计数器按BCD计数,计数初值0000~9999;
BCD=0,计数器按二进制计数,计数初值0000~FFFFH。
计数初值为0000时最大,对于BCD计数,0000代表10000;
计数初值为0000时最大,对于二进制计数,0000代表10000H。
注意:
计数初值必须跟在控制字之后,即先写控制字,后写计数初值。
说明:
8088中的8253的通道0、1、2和控制字寄存器端口地址为40H、41H、42H、43H。
五8253的初始化编程
初始化编程包括如下步骤:
①写入通道控制字,规定通道的工作方式
②写入计数值,若规定只写低8位,则高8位自动置0,若规定只写高8位,
则低8位自动置0。
若为16位计数值则分两次写入,先写低8位,后写高8位。
例1:
设8253的端口地址为:
04H~07H,要使计数器1工作在方式0,仅用8位二进制计数,计数值为128,进行初始化编程。
控制字为:
01010000B=50H
初始化程序:
MOVAL,50H
OUT07H,AL
MOVAL,80H
OUT05H,AL
例2:
设8253的端口地址为:
F8H~FBH,若用通道0工作在方式1,按BCD码计数,计数值为5080H,进行初始化编程。
控制字为:
00110011B=33H
初始化程序:
MOVAL,33H
OUT0FBH,AL
MOVAL,80H
OUT0F8H,AL
MOVAL,50H
OUT0F8H,AL
例3:
设8253的端口地址为:
04H~07H,若用通道2工作在方式2,按二进制计数,计数值为02F0H,进行初始化编程。
控制字为:
10110100B=0B4H
初始化程序:
MOVAL,0B4H
OUT07H,AL
MOVAL,0F0H
OUT06H,AL
MOVAL,02H
OUT06H,AL
六8253的应用举例
例9.1用8253监视一个生产流水线,每通过100个工件。
蜂鸣器响6s。
频率为1000HZ。
①硬件连接:
硬件接口示意图如图9.1所示,工件从光源与光敏电阻之间通过时,在晶体管的发射极上会产生一个脉冲,此脉冲作为8253计数通道0的计数脉冲,当通道0计数满100后,由OUT0输出负脉冲,经反相后作为8259A的一个中断请求信号,在中断服务程序中,启动8253计数通道1工作,由OUT1连续输出1000HZ的方波,持续6s后停止输出。
②控制字设置:
通道0计数器工作于方式2,采用BCD计数,因计数初值为100,采用RL1RL0=10(读/写计数器的高8位),则方式控制字为00100101B。
通道1计数器工作于方式3,CLK1接2MHZ时钟,要求产生1000HZ的方波,则计数初值应为2000000÷1000=2000,采用RL1RL0=10(只读/写高8位),BCD计数,则方式控制字为01100111B。
例9.1图8253的应用
③程序编制:
假设8253通道0的地址为40H,通道1的地址为42H,控制口地址为46H。
8255A的A口地址为80H。
则主程序为:
┇
MOVAL,01H;置PC0为1
OUT86H,AL
MOVAL,25H;通道0初始化
OUT46H,AL
MOVAL,01H;计数初值高8位,低8位自动清零
OUT40H,AL
STI;开中断
LOP:
HLT;等待中断
JMPLOP
中断服务程序为:
┇
MOVAL,03H;置PC1为1,使通道1的GATE1置1,启动计数
OUT86H,AL
MOVAL,67H;通道1初始化
OUT46H,AL
MOVAL,20H;计数初值高8位,低8位自动清零
OUT42H,AL
CALLDL6s;延时6s
MOVAL,02H;通道1的GATE1置0,停止计数
OUT86H,AL
┇;向8259A发中断结束命令
IRET
例9.28253在IBMPC系列机上的应用
扬声器控制:
⏹计数器2的输出控制扬声器的发声音调
⏹计数器2只能工作在方式3,才能输出一定频率的方波,经滤波后得到近似的正弦波,进而推动扬声器发声
⏹扬声器还受控于并行接口(8255芯片)
⏹必须使PB0和PB1同时为高电平,扬声器才能发出预先设定频率的声音
8255A的PC口(62H)
7
6
5
4
3
2
1
0
8253计数器2
(43H)
放大器
AND
8255A的PB口(61H)
7
6
5
4
3
2
1
0
扬声器与系统的连接
说明:
各计数器的时钟频率均为1.19318MHz
模拟电话铃程序如下:
CSEGSEGMENTASSUMECS:
CSEG
RINGPROCFAR
PUSHDS
XORAX,AX
PUSHAX
MOVBP,8;循环计数值,响铃8次
AGAIN:
MOVCX,30;产生600和1500Hz的声音30次
NEXT:
MOVDX,600;频率=600Hz
MOVAX,30;时间=30ms
MOVBL,3;允许产生声音
CALLSOUND
MOVDX,1500;频率=1500Hz
MOVAX,30;时间=30ms
CALLSOUND
LOOPNEXT;循环
MOVDX,100;频率100Hz
MOVBL,1;不允许产生声音
MOVAX,2000;时间2S
MOVBL,1
CALLSOUND
DECBP
JNZAGAIN;循环8次
RET
RINGENDP
SOUNDPROC
PUSHCX
PUSHSI
MOVSI,DX;频率送SI
MULDX;频率×时间=周期数
MOVCX,1000
DIVCX
MOVCX,AX;周期数作为循环计数送CX
MOVAL,10110110B;将8253计数器2设置为方式3
OUT43H,AL
MOVDX,0012H;1193180的低位
MOVAX,34DCH;1193180的高位
DIVSI;1193180/频率=计数值
OUT42H,AL;送计数值的低位
MOVAL,AH;送计数值的高位
OUT42H,AL
INAL,61H读8255A的B口
ANDAL,11111100B;清掉最低2位
ORAL,BL;根据BL设置是否产生声音
OUT61H,AL
ZERO:
INAL,61H;读8255A的C口
TESTAL,00100000B;8253计数器2的输出变高?
JZZERO没有,等待
ONE:
INAL,61H;
TESTAL,00100000B;8253计数器2的输出变低?
JNZONE;没有,等待
LOOPZERO;周期数减1,不为0继续
POPSI
POPCX
RET
SOUNDENDP
CSEGENDS
ENDRING
例9.3读取8253通道中的计数值
8253可用控制命令来读取相应通道的计数值,由于计数值是16位的,而读取的瞬时值,要分两次读取,所以在读取计数值之前,要用锁存命令,将相应通道的计数值锁存在锁存器中,然后分两次读入,先读低字节,后读高字节。
当控制字中,D5、D4=00时,控制字的作用是将相应通道的计数值锁存的命令,
锁存计数值在读取完成之后,自动解锁。
如要读通道1的16位计数器,编程如下:
地址40H~43H。
MOVAL,40H;
OUT43H,AL;锁存计数值
INAL,41H
MOVCL,AL;低八位
INAL,41H;
MOVCH,AL;高八位