380 likes | 566 Views
第八章 可编程定时 / 计数器 8253. 实现定时或延时控制有三种方法: 软件定时: 即让 CPU 执行一段不完成任何其他功能的程序段,由于执行每条指令都需要时间,则执行一个程序段就需要一定的时间,通过改变指令执行的循环次数来控制定时时间 不可编程硬件定时器: 采用中小规模器件,外接定时元件 —— 电阻和电容构成。
E N D
第八章 可编程定时/计数器8253 实现定时或延时控制有三种方法: • 软件定时:即让CPU执行一段不完成任何其他功能的程序段,由于执行每条指令都需要时间,则执行一个程序段就需要一定的时间,通过改变指令执行的循环次数来控制定时时间 • 不可编程硬件定时器:采用中小规模器件,外接定时元件——电阻和电容构成。 • 可编程硬件定时器:就是其工作方式、定时值和定时范围可以很容易由软件来确定和改变。计数器一旦开始工作后,CPU就可以去做别的工作了,等计数器计到预定时间,便自动形成一个输出信号,用来向CPU提出中断请求。这种方法不但显著提高了CPU的利用率,而且定时时间由软件设置,使用十分灵活,加上定时时间精确,使用十分广泛。
可编程定时器/计数器8253 8253可编程定时器/计数器的主要性能: • 有3个独立的16位计数器 • 工作方式可编程控制 • 计数脉冲频率0~2MHz • 可以按二进制或BCD码计数 • 使用单一+5V电源 • 一、8253的内部结构和功能 • 二、8253的引脚功能 • 三、8253的工作方式 • 四、8253应用举例
0 1 2 一、8253的内部结构和功能 当用8253作外部事件计数器时,在CLK脚上所加的计数脉冲是由外部事件产生的,这些脉冲的间隔可以是不相等的。如果用它作定时器,则CLK引脚上应数入精确的时钟脉冲,这时8253所能实现的定时时间=计数脉冲周期×预置的计数初值 这个八位的三态、双向缓冲器用于将8253与系统总线相连,接收CPU输出的方式控制字或计数初值,发送CPU从计数器读出的计数值。 读写逻辑接收来自系统总线的控制信号,以产生控制整个器件工作的控制信号。 在初始化编程时用于寄存在CPU写入的控制字以决定各通道的工作方式。此寄存器只能写入不能读出。
二、8253的引脚功能 D7~D0:双向三态数据线,CPU用输入、输 出指令对8253进行读/写操作的信息都经8 位数据总线传送。 CLK0~CLK2:计数输入,要求加在CLK引脚 的时钟脉冲频率不大于2MHz。 GATE0~GATE2:门控输入,当GATE引脚为 低时,禁止计数器工作;只有GATE引脚为 高时,才允许计数器工作 OUT0~OUT2:计数器0~2的输出,其输出 波形取决于工作方式 A1、A0:寻址3个计数器和控制寄存器(三 个计数器的控制寄存器共用一个端口地址) RD、WR和CS:分别为读、写和片选信号, 均为低电平有效
CS RD WR 8253的端口选择
三、8253的工作方式 1、控制字寄存器 2、工作方式 • 方式0——计数结束中断方式 • 方式1——可重复触发的单稳态触发器 • 方式2——频率发生器(n分频器) • 方式3——方波发生器 • 方式4——软件触发的选通信号发生器 • 方式5——硬件触发的选通信号发生器
BCD=1时,采用BCD码计数,写入计数器的初值用BCD码表示,初值范围为0000~9999H,其中0000表示最大值10000,即104。如预制初值n=1200H时,表示一个十进制数1200。BCD=1时,采用BCD码计数,写入计数器的初值用BCD码表示,初值范围为0000~9999H,其中0000表示最大值10000,即104。如预制初值n=1200H时,表示一个十进制数1200。 BCD=0时,采用BCD码计数,写入计数器的初值用二进制数表示,初值范围为0000~FFFFH,其中0000表示最大值65536,即216。如预制初值n=1200H时,表示一个十进制数4608。
(m=5) 5 2 0 4 3 1 A B INTR 方式0:计数结束中断 CLK (n=4) 4 3 1 0 2 GATE OUT n INTR • 方式0的工作特点: • 计数到零后,不能自动恢复计数初值,OUT输出端保持高电平。 • 计数过程中,如果GATE=0,则暂停计数,直到GATE变高后再接着计数。 • 在计数过程中可改变计数值。若是8位计数,写入新的计数值后,计数器按新值开始计数;若是16位计数,写入第一个字节后,计数器停止计数,在写入第二个字节后,按新的初值计数。
例 方式1:可重复触发的单稳态触发器 CLK (n=4) (m=5) 4 3 1 0 2 5 5 4 2 1 4 3 3 2 0 GATE 单脉冲宽度 单脉冲宽度 OUT • 方式1的工作特点: • 可重复触发。计数到零后,不用再次送计数值,只要给它触发脉冲,即可产生一个同样宽度的单稳脉冲。 • 计数过程中,若装入新的计数初值,则当前输出不受影响。只有再次触发后,计数才开始按新值输出脉冲宽度。 • 计数过程中,外部的GATE触发沿提前到来,则下一个CLK脉冲下降沿,计数器开始重新计数,这将使输出单稳脉冲比原先设定的计数值加宽了。
方式2:频率发生器(n分频器) CLK n=4 n=3 0 3 1 0 4 3 3 1 2 4 4 2 3 1 4 2 0 0 3 2 1 GATE OUT 重复周期 • 方式2的工作特点: • 计数器写入控制字和计数初值后,如GATE一直处于高电平,那么,在下一个脉冲开始计数器计数。 • 不用重复置数。计数器能够连续工作,输出OUT是输入CLK的n(初值)分频。 • 计数过程可由GATE信号控制。GATE变低将使计数暂停且OUT立即为高;在GATE变高后的下一个CLK下降沿计数器重新从初值开始计数。 • 计数过程中可改变初值。如果GATE一直处于高电平,则重装计数初值不影响现行计数过程;下一个过程,才按新值计数。
例 方式3:方波发生器 CLK n=4 n=5 4 5 4 2 0 0 4 5 4 2 4 4 4 2 0 2 5 2 0 4 0 GATE 0 2 4 OUT 重复周期 重复周期 • 特点: • 当计数初值n为偶数时,每个CLK脉冲使计数值减2,当计到零时,一方面使输出改变状态,另一方面,又重新装入计数值、开始新的计数。当n为奇数时,且OUT为高时,第一个脉冲使计数减1,然后依次减2;当OUT为低时,先使计数减3,然后依次减2。 • GATE=1,允许计数;GATE=0,禁止计数。如果在输出为低期间, GATE=0,输出将立即变高,停止计数;当GATE变高后,计数器将重新装入初值并开始计数。
方式4:软件触发的选通信号发生器 CLK n=4 0 4 3 1 2 OUT n=4 GATE 0 4 3 1 2 4 OUT • 特点: • 只计数一次 • GATE=1,允许计数;GATE=0,禁止计数。 • 在计数过程中改变计数初值,则按新计数值重新开始计数。如果是二字节数,则在写入第一个字节时停止计数;写入第二个字节后,按新的计数初值开始计数。
CLK GATE 0 4 3 1 2 OUT(n=4) GATE 4 3 4 3 1 0 2 OUT(n=4) 例 方式5:硬件触发的选通信号发生器 • 写入控制字后,输出为高。写入计数初值后并不立即开始计数,而是由GATE信号的脉冲上升沿触发启动。当计数到零后时,输出一个CLK周期宽度的负脉冲,然后输出变高,停止计数。直至下次GATE脉冲的触发才能计数。 • 在计数过程中,外部的GATE触发沿提前到来,则下一个CLK脉冲下降沿,计数器开始重新计数。
8253工作方式特点: 方式0,在写入控制字后,输出端即变低,计数结束后,输 出端由低变高,常用该输出信号作为中断源。 方式1,用来产生单脉冲。 方式2,用来产生序列负脉冲,每个负脉冲的宽度与CLK脉冲 的周期相同。 方式3,用来产生连续的方波。方式2和方式3都实现对时钟 脉冲进行n分频。 方式4和方式5的波形相同,都在计数器回0后,从OUT端输出 一个负脉冲,其宽度等于一个时钟周期。 方式0、1和4,计数初值装进计数器后,仅一次有效。方式2,3和5,在减1计数到0值后,8253会自动将计数值重装进计数器。
启动计数器的触发方式 • 软件触发方式:只要GATE信号为高电平,在写入计数初值后的下一个CLK脉冲的下降沿到来时,计数初值从计数初值寄存器送到减1计数器中,启动计数。 • 硬件触发方式:即写入计数初值后,计数器并不开始计数。而是在GATE信号上升沿到来后的第一个CLK下降沿到来时,才将计数初值从计数初值寄存器送到减1计数器中,启动计数。 • 在六种工作方式中属于软件触发方式的有方式0和方式4,属于硬件触 • 发方式的有方式1和方式5。 • 注意:方式2和方式3既可用于软件触发,也可用于硬件触发。具体地讲,在计数过程中,若GATE变为低电平,计数器停止计数。在GATE正跳变后,重新启动计数并从计数初值开始,因此当计数通道用作对外部事件计数时,GATE正跳变可用作对外部事件的同步控制信号
四、8253应用举例 1. 初始化编程 2. 读取8253的计数值 3. 应用举例
1. 初始化编程 初始化编程:刚接通电源时,诸如8253之类的可编程外围接口芯片通常都处于未定义状态,在使用之前,必须用程序把他们初始化为所需的特定模式,这个过程称为初始化编程。 初始化步骤: (1)写入控制字 用输出指令向控制字寄存器写入一个控制字,以选定计数器通道,规定该计数器的工作方式和计数格式。写入控制字还起到复位作用,使输出端out变为规定的初始状态,并使计数器清0 (2)写入计数初值 用输出指令向选中的计数器端口地址中写入一个计数初值,初值设置时要符合控制字中有关格式的规定。初值可以是8位数据,也可以是16位数据。
D7 D6 D5 D4 D3 D2 D1 D0 0 0 1 1 0 0 1 0 二进制计数 先写低8位 计数器0 方式1 再写高8位 例:对计数器0初始化。工作与方式1,按二进制计数,计数值为5080H。 确定控制字: 计数值低8位为80H, 高8位为50H。设端口 地址为2A0H~2A3H, 则初始化程序为: MOV DX,2A3H ;控制端口地址为2A3H MOV AL,32H ;00110010B OUT DX,AL ;送方式控制字到控制寄存器 MOV DX,2A0H ;计数器0端口地址为2A0H MOV AL,80H OUT DX,AL ;先写低8位计数值到计数器 MOV AL,50H OUT DX,AL ;再写高8位计数值到计数器0
2. 读取8253的计数值 当8253计数值是16位时,CPU要分两次读入,通常做法有两种: (1)利用GATE信号使计数过程暂停 (2)利用命令控制字(SC1 SC0 000000B)将待读计数值锁存至其锁存器,这种方法不能影响计数过程。注意,控制字应写入控制端口。CPU读取此锁存器后,锁存自动解除。 例:读取计数器0的 16位计数值,采用锁存器锁存方式,其程序为: MOV AL,00H MOV DX,2A3H OUT DX,AL MOV DX,2A0H IN AL,DX XCHG AL,AH ;暂存AH IN AL,DX ;读取计数器0高8位数据 XCHG AL,AH ;AX中为计数器0的16位计数值 ;命令控制字送控制口 ;读取计数器0低8位数据
3、应用举例 • 用8253产生各种定时波形 • 控制LED的点亮或熄灭
8253初始化方法: • 控制字 • 计数初值: n=定时时间t时钟频率fc =定时时间t/时钟脉冲周期Tc 如: fc=1MHZ,最大计数初值: 65536 一个定时器最大定时时间: N/fc=65536/ 106 =0.065536s
用8253产生各种定时波形 在某个以8086为CPU的系统中使用了一块8253芯片, 8253的4个端口地址分别为310H、312H、314H、和316H,所用的时钟脉冲频率为1MHZ。要求3个计数通道分别完成以下功能: (1)通道0工作于方式3,输出频率为2KHZ的方波; (2)通道1产成宽度为480us的单脉冲; (3)通道2用硬件方式触发,输出单脉冲,时间常数为26。
对三个通道的初始化程序 ;通道0初始化程序 MOV DX,316H;控制口地址 MOV AL,00110111B ;通道0控制字,先读写低字节,后高字节,方式3,BCD计数 OUT DX,AL;写入方式字 MOV DX,310H;通道0口地址 MOV AL,00H;低字节 OUT DX,AL;先写入低字节 MOV AL,05H;高字节 OUT DX,AL;后写入高字节
;通道1初始化程序 MOV DX,316H MOV AL,01110011B ;通道1方式字,先读写低字节,后高字节,方式1,BCD计数 OUT DX,AL MOV DX,312H;通道1口地址 MOV AL,80H;低字节 OUT DX,AL MOV AL,04H;高字节 OUT DX,AL
;通道2初始化程序 MOV DX,316H MOV AL,10011011B ;通道2方式字,只读写低字节,方式5,BCD计数 OUT DX,AL MOV DX,314H;通道2口地址 MOV AL,26H;低字节 OUT DX,AL ;只写入低字节
控制LED的点亮或熄灭 例:用8253来控制一个LED发光二极管的点亮和熄灭,要求点亮10秒钟后再让它熄灭10秒钟,8253的各端口地址为81H、83H、85H和87H。
初始化程序 MOV AL,00110101B ;通道0控制字,先读写低字节,后高字节,方式3,BCD计数 OUT 87H,AL MOV AL,00H;计数初值低字节 OUT 81H,AL MOV AL,50H;计数初值高字节 OUT 81H,AL MOV AL,01110111B ;通道1控制字,先读写低字节,后高字节,方式3,BCD计数 OUT 87H,AL MOV AL,00H;计数初值低字节 OUT 83H,AL MOV AL,80H;计数初值高字节 OUT 83H,AL
例 用8253监视一个生产流水线,每通过100个工件。蜂鸣器响6s。频率为1000HZ。 ① 硬件连接:硬件接口示意图如图所示,工件从光源与光敏电阻之间通过时,在晶体管的发射极上会产生一个脉冲,此脉冲作为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。 ③ 程序编制:假设8253通道0的地址为40H,通道1的地址为42H,控制口地址为46H。8255A的A口地址为80H,工作于方式0输出。
则主程序为: MOV AL,25H ;通道0初始化 OUT 46H,AL MOV AL,01H ;计数初值高8位,低8位自动清零 OUT 40H,AL STI ;开中断 LOP: HLT ;等待中断 JMP LOP 中断服务程序为: MOV AL,01H ;通道1的GATE1置1,启动计数 OUT 80H,AL MOV AL,67H ;通道1初始化 OUT 46H,AL MOV AL,20H ;计数初值高8位,低8位自动清零 OUT 42H,AL CALL DL6s ;延时6s MOV AL,00H ;通道1的GATE1置0,停止计数 OUT 80H,AL ┇ ;向8259A发中断结束命令 IRET
例 8253通道2接有一发光二极管,要使发光二极管以点亮2s,熄灭2s的间隔工作,8253各通道端口地址分别为40H、42H、 44H、46H,其电路硬件图如图10. 21所示,试编程完成以上工作。 根据要求8253通道2输出一个周期为4s的方波。从图10. 21可知通道1的CLK1输入时钟周期为1μs,若通道1工作为定时,其输出最大定时时间为1×65536μs,仅为65.5ms,因而使用一个通道达不到定时时间4s的要求。此时,采用通道级连的办法,将通道1的输出OUT1作为通道2的输入脉冲。 8253的通道1工作于方式2,其输出端OUT1的输出为相对于1MHZ频率的分频脉冲,若选定OUT1输出脉冲周期为4ms,则通道1的计数初值应为4000。周期为4ms的脉冲作为通道2的输入,要求输出端OUT2的波形为方波且周期为4s,因此通道2应工作于方式3,计数初值为1000。通道1的控制字为01100101B,通道2的控制字为10100111B。
由于计数初值的低8位0,因此采用只读/写高8位的方法,初始化程序如下:由于计数初值的低8位0,因此采用只读/写高8位的方法,初始化程序如下: ┇ MOV AL,65H ;通道1控制字,只读/写高8位,BCD计数制 OUT 46H,AL MOV AL,0A7H ;通道2控制字,只读/写高8位,BCD计数制 OUT 46H,AL MOV AL,40H ;通道1计数初值高8位,低8位自动置0 OUT 42H,AL MOV AL,10H ;通道2计数初值高8位,低8位自动置0 OUT 44H,AL ┇
例 某系统利用8253-5定时器/计数器通道0产生1KHz的重复方波,问通道0应工作在什么工作方式?若CLK0=2MHz,试写出通道0的初始化程序。设8253-5端口地址为2F0H、2F2H、2F4H、2F6H。 解:(1)因为只有方式3可产生重复方波,所以计数通道0应工作在方式3。 (2)首先计算计数初值: N = (2*106)/(1*103)= 2000 其次确定方式控制字,由于采用BCD计数,只读/写高八位,因而方式控制字为00100111B。 最后编写程序。注意:由于端口地址为2F0H、2F2H、2F4H、2F6H,是16位地址,因此必须采用端口寻址中的DX寄存器间接寻址。程序如下: MOV DX,2F6H ;通道0初始化 MOV AL,00100111B OUT DX,AL MOV DX,2F0H ;写入计数初值高8位,低8位自动清零 MOV AL,20H OUT DX,AL
例 将8253的三个计数器级连,假设时钟输入为1MHz,画出级连图,并求: 一、各计数器均取最大计数初值,8253的各计数器的定时脉 宽为多少? 二、要求得到毫秒,秒,时三种定时脉宽,计数器的初值为 多少? (1)定时脉宽: 定时器0:T=65536*1us 定时器1:T=65536*65536 定时器2: T=65536*65536*65536 (2)初值 N0=1ms/1us=1000 N1=1s/1ms=1000 N2=3600s/1s=3600
作业 8-1 8-3 8-4