首先要通过软件对MCS-51系列单片机进行初始化。初始化包括下述几个步骤:
2)确定定时器初值:计算初值,并直接将初值写入寄存器THx、TLx。由于计数器采用加法计数,通过溢出产生中断标志,因此不能直接输入所需的“计数值”,而是要从计数器的最大值减去“计数值”才是应置入THx、TLx的初值。
3)根据需要,开放定时器中断:对寄存器IE置初值。
4)启动定时器:对寄存器TCON中的TR1或TR0置1,置1后计数器即按规定的工作方式和初值开始计数。
设计数器的最大值为M,在不同的工作方式中,M可以为213(方式0)、216(方式1)、28(方式2、3),则置入的初值可这样来计算,即计数方式时,初值=M-“计数值”;定时方式时,初值=M-
(“定时时间”/T)。其中,T为机器周期,是单片机时钟脉冲周期的12倍。若定时/计数器工作在方式1,则N=16,计数容量为65536。若从0开始计数,当计到第65536个
计数时,计数器内容由FFFFH变为1000H,因16位加一计数器只能容纳16位数,所以计数产生溢出,
定时/计数器的中断标志位(TF0或TF1)被置1,请求中断。与此同时,计数器内容变为0。定时/计
数器计数起点不一定要从0开始。计数起点可根据需要预先设定为0或任何小于计数容量的值。这个预
先设定的计数起点值称为“计数初值”(以下简称初值)。显然,从该初值开始计数,直到计数溢出,
计数容量为(2N-初值)。所以,当定时/计数器的工作方式确定后,其所能计的计数容量(2N-初值)
就由初值决定。定时/计数器作定时器用时的初值计算:定时时间=(2N-初值)×机器周期初值=2N-定时时间/机器周期其中,机器周期=12/fOSC。所以又有初值=2N-(定时时间×fOSC)/12。显然,初值为0时的定时时间最大,称最大定时时间。例5-1:设定时时间为2ms,机器周期Tp为2μs,可求得定时计数次数x。
解:设选用工作方式1,N=16,则应设置的定时计数初值。
(x)补=2N-x=216-x=65536-61000=64536=FC18H则将其分解成两个8位十六进制数,低8位18H装入TLx,高8位FCH装入THx中。
工作方式0、1、2的最大计数次数分别为8192、65536和256。对于外部事件计数模式,只需根据实际计数次数值以28、213、216为模求补,求补后变换成两个十六进制码即可。
例5-2:①若晶振频率为12MHz,当定时/计数器分别工作在工作方式为1、2的情况下的最大定时时间为多少?②求工作方式为1时定时时间为50ms的初值;③求工作方式为2时定时时间为200μs时的初值。
解:因晶振频率为12MHz,所以机器周期,即定时脉冲的周期就是1μs,即10-6s。方式1、2的N分别为16、8。
①由公式:定时时间=(2N-初值)×机器周期,分别求得:
方式1时,最大定时时间为65536μs=65.536ms。
方式2时,最大定时时间为256μs。
②当定时时间为50ms即50×10-3s,代入公式,初值=2N-定时时间/机器周期,求得初值为15536。
③当定时时间为200μs即200×10-6s,代入公式,初值=2N-定时时间/机器周期,求得初值为56。
例5-3:若晶振频率为6MHz,当定时/计数器工作方式为2时,初值为56时的定时时间。
解:因晶振频率为6MHz,所以,机器周期,即定时脉冲的周期就是2μs。因工作方式为2,所以,N=8。将它们和初值56代入公式,求得定时时间为400×10-6s=400μs。
可见,定时初值与单片机所选的晶振、定时/计数器的工作方式和所要求的定时时间有关。初值越大,定时时间越短。
图5-7 P1.0输出周期为400μs方波(www.xing528.com)
例5-4:如图5-7所示,若fOSC=12MHz,在P1.0输出周期为400μs方波,定时/计数器为工作方式2,问计数初值为多少?并编写初始化程序。
解:机器周期为12/fOSC=1μs
定时时间为(256-x)×1μs=200μs
则x=56=38H
定时/计数器为工作方式2,初始化程序如下:
MOV TMOD,#02H
SETB ET0
SETB EA
MOV TL0,#38H
MOV TH0,#38H
SETB TR0
例5-5:用定时/计数器1(T1)的工作方式1,采用查询方法设计一个定时1s的程序段。
解:问题分析,这是采用查询定时器/计数器1(T1)溢出标志方法设计延时子程序的例子,因采用12MHz的晶振频率,最大定时为65.536ms。要实现1s的定时,先用定时/计数器1做一个50ms的定时器,再循环20次。设置R0寄存器初值为20。每查询到定时器溢出标志为1时,则进行清溢出标志、重置定时器初值、判R0中内容减1后是否为0等操作。若非0返回LP1作循环,若为0(已循环20次)则结束子程序。因采用查询方法,而非中断方法,所以不要开通中断允许。在这种情况下,定时/计数器的溢出标志位TF1、TF0可由程序指令清0。程序设计如下:
DELAY:MOV R0,#20;置50ms定时循环计数初值
MOV TMOD,#10H;置T1工作方式1
MOV TH1,#03CH;置T1初值
MOV TL1,#0B0H
SETB TR1;启动T1
LP1:JB TF1,LP2;若查询溢出标志位TF1为1跳转到LP2
SJMP LP1;未到50ms定时继续加1计数
LP2:CLR TF1;清TF1为0
MOV TH1,#3CH;重置定时器初值
MOV TL1,#0B0H
DJNZ R0,LP1;未到1s继续循环
CLR TR1;关T1
SJMP $
END
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。