定时/计数器应用

四、定时/计数器应用

1.定时/计数器的初始化

由于定时/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始化的步骤一般如下:

(1)确定工作方式(即对TMOD赋值)。

(2)预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1)。

(3)根据需要开放定时/计数器的中断(直接对IE位赋值)。

(4)启动定时/计数器(若用软件启动,则可把TR0或TR1置“1”;若由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。

2.方式0和方式1的应用

方式1与方式0基本相同,只是方式1为16位计数器,而方式0为13位计数器。

【例5-5】利用定时器定时,使P1.0引脚输出周期为2ms的方波,设单片机晶振频率为6MHz,试编写程序实现。

解:(1)确定设计方案。输出2ms的方波可由间隔1ms的高低电平相间而成,因而只要每隔1ms对P1.0取反一次即可得到这个方波。

(2)选择定时器,确定工作方式。由于机器周期=12÷6MHz=2μs,设1ms需要计数值为N,则N=1ms÷2μs=500次,可采用方式0或方式1,这里假设采用T0工作于方式0实现1ms的定时。

TMOD初始化:TMOD=00000000B=00 H

(GATE=0,M1=0,M0=0,T1不用,对应TMOD的高4为均置0)

(3)预置T0的计数初值。T0的初值X为

X=213-500=8192-500=7692=1E0CH=1111000001100B

将此13位计数初值的高8位赋给TH0,低5位赋给TL0的低5位,即TH0=11110000B=0F0H,TL0=00001100B=0CH(高3位取0)。

(4)定时器中断控制。IE初始化:开放CPU中断,置EA=1,允许定时器T0中断,置ET0=1。

(5)启动定时器。TCON初始化:置TR0=1,启动T0工作。

程序清单如下:

【例5-6】已知某生产线的传送带上不断地有产品单向传送,产品之间有足够大间隔。使用光电开关统计一定时间内的产品个数。假定HL1红灯灭时停止统计,HL1红灯亮时才在上次统计结果的基础上继续统计,如图5-8所示,试用单片机完成该项产品的计数任务。

图5-8 传送带产品计数原理图

解:方案分析:图5-8中,当灯控开关S闭合时,HL1红灯亮,表示开始计数。光电开关VT的输入端加电信号使发光源HL2发光,此光照射到VT的受光器上后,因光电效应而产生了光电流,由受光器输出端引出,产生回路,从而在T1的外部输入引脚检测到高电平;当传输带上有产品通过时,产品对光束起到了遮挡的作用,因此受光器输出端不能产生回路,从而在T1的外部输入引脚检测到低电平。利用计数器的外部启动方式。便可以实现传送带产器计数。

(1)确定设计方案。如题所述,利用单片机定时器/计数器T1的方式1完成该项产品的计数任务。

(2)确定工作方式。T1作计数器,工作在方式1,采用外部启动方式,即门控位设为1,红灯HL1亮时进行计数。

TMOD初始化:TMOD=11010000B=D0H

(3)预置定时或计数的初值。任务是统计产品数量,可设计数器初始值为0;TH0=00H,TL0=00H。

(4)定时器中断控制。T1在方式1时,溢出产生中断,且计数器回零,故在中断服务程序中,需用R0计数中断次数,以保护累积计数结果。

IE初始化:总中断允许EA置1,定时器T1中断允许ET1置1。

(5)启动定时器。TCON初始化:启动位TR1置1。

程序清单如下:

【例5-7】设单片机时钟频率为6MHz,试编写定时1s的程序。

解:(1)确定设计方案。利用单片机定时器/计数器的定时功能实现1s的延时。采用循环程序法,每隔100ms中断一次,中断10次为1s。

(2)选择定时器,确定工作方式。选用T0作定时器,工作方式为1。

TMOD初始化:TMOD=00000001B=01H

(3)由于晶振频率为6MHz,一次计数的时间为2μs,因此需要计数50000次,才能完成100ms的定时,因此定时器初值X=65536-50000=15536=3CB0H,即TL0=0B0H,TH0=3CH。

(4)定时器中断控制。IE初始化:总中断允许位EA置1,定时器T0中断允许位ET0置1。

(5)启动定时器。TCON初始化:TR0置1,启动T0工作。

程序清单如下:

中断服务程序如下:

3.方式2的应用

方式2是定时器自动重新装载的操作方式,工作过程与方式0、方式1基本相同,只不过在溢出的同时,将8位二进制初值自动重新装载,即在中断服务子程序中,不需要编程赋初值。定时器T1工作在方式2时,可直接用作串行口波特率发生器。

【例5-8】使用定时器T0以工作方式2定时,在P1.0输出周期为200μs的连续方波脉冲,已知晶振频率fosc=6MHz。

解:(1)计算计数初值X。6MHz晶振频率下,一个机器周期为2μs,以TH0作重装载的预置寄存器,TL0作8位计数器,则:

(28-X)×12×1/6=100

得X=206=11001110B=CEH。把CEH分别装入TH0和TL0中。

(2)TMOD初始化:T0设定为方式2,则M1M0=10;为实现定时功能,软件启动定时器,GATE=0。定时器/计数器T1不用,有关位设定为0,因此TMOD寄存器初始化为0000 0010,即:02 H。

(3)由定时器控制器TCON中的TR0位控制定时的启动和停止,TR0=1启动,TR0=0停止。

(4)若使用中断方式,应开中断,EA位和ET0位置“1”;若使用查询方式,则关中断。

查询方式程序清单如下:

中断方式程序清单如下:

【例5-9】利用定时器T1的方式2对外部信号计数,要求每计满100次对P1.0端取反。

解:(1)计算计数初值X。

X=28-100

得  X=256-100=156=9CH

(2)方式字。

TMOD=0110****B=60H

中断方式程序清单如下:

4.方式3的应用

当定时器T0工作在方式3时,TH0和TL0分别是2个独立的8位定时器/计数器,且TH0占用定时器T1的溢出中断标志TF1和运行控制位TR1。

【例5-10】设某用户系统中已使用了两个外部中断源,并置定时器T1工作在方式2,作串行口波特率发生器用。现要求再增加一个外部中断源,并由P1.0输出一个5kHz的方波,设fosc=12MHz。

分析:本例目的有两个:①增加一个外部中断;②使P1.0输出一个方波。而给定的条件是:①两个外部中断源已被使用;②定时器T1已用于串行口波特率发生器。因此,利用定时/计数器T0,使之工作在方式3,其中TL0用于扩展外部中断源,TH0作定时器使用,以输出方波。

(1)设置初值。

1)要使TL0作为外部中断源使用,则置TL0为FFH,这样,只要T0的外部输入引脚来一个负跳变,就使TL0计数加1而溢出,从而向CPU发出中断请求。其功能与外部中断相同。

2)因为输出方波频率为5kHz,故方波周期为200μs,用TH0产生100μs的定时,故TH0的初值

(2)设定T0工作方式:令T0工作于方式3,TL0为计数方式;令T1工作于方式2,定时方式。因此TMOD设置如下:

TMOD=00100111B=27 H

程序清单如下:

5.GATE门控位的应用

GATE门控位用于设置定时/计数器的启动方式,GATE=1为外部启动方式,这时定时/计数器的启动受到两种信号的控制:TRi和外部中断输入引脚的控制;GATE=0为软件启动方式,这时只需TRi(i=0,1),就能启动定时/计数器。

【例5-11】要求利用MCS-51单片机测量脉冲信号高电平以及低电平持续的时间。设脉冲高电平(计数)长度值存于21H、20H中,低电平长度存于23H、22H中。电路连接如图5-9所示。

图5-9 脉冲信号测量电路图

分析:本例利用GATE功能来测量脉冲参数。当GATE=1时,为外部启动方式,这时定时/计数器的启动受到两种信号的控制:TRi和外部中断输入引脚的控制。现利用T0来测量脉冲高电平持续的时间,利用T1来测量低_电平持续的时间。只要在程序中置TRi为1,做好启动准备,一旦外部中断输入引脚变成高电平,即可实现定时器的启动。在程序中不断检测输入脉冲的电平变化,由软件控制TRi为0,使得定时器停止计数。如果让定时器的初值设为0,那么从启动到停止,经过的时间即为脉冲信号持续的时间。因此,保留在定时计数器THi、TLi上的数据就是脉冲电平的长度。

程序清单如下: