8052定时器T2的用法 - 图文

更新时间:2024-03-07 11:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

定时器T2的用法

声明,定时器T2只有52以上的芯片才有,51没有的。

1 C- D- I; e# z7 i9 Y8 {:

, X- ?' h- F- |' f P\

捕捉模式

在捕捉模式时,两种操作模式由T2CON中的EXEN2位选择。如果EXEN2=0,Timer2作为一个16位向上定时或计数器,当溢出时将T2CON中的TF2置1。这个标志位可以产生一个中断。如果EXEN2=1,Timer2起同样的作用,但是,外部输入端T2EX上的下降延也可以使TH2和TL2中的值捕捉到RCAP2H和RCAP2L中,另外,T2EX上的下降延可以将EXF2置1,像TF2一样,也可以产生一个中断。捕捉模式详见图5。

自动重载模式

Timer2在指定为16为自动重载模式时可以编程为加计数或减计数,此功能由T2MOD中的DCEN位

决定。DCEN=0,计数器向上计数,默认置为0,DCEN=1时,Timer2的加或减由T2EX的值决定。

& H* p: |* l# t/ m1 W7 [7 t& Y

图6显示Timer2在DCEN=0时自动向上计数。在这个模式时,T2CON的EXEN2为可以选择两种操作。EXEN2=0,Timer2向上计数到0FFFFH时将TF2为置1,溢出可以把RCAP2H和RCAP2L中的16为值重新加载到定时寄存器中。捕捉模式时RCAP2H和RCAP2L中的值由软件预先设定。EXEN2=1,既可以由溢出重载也可以由T2EX引脚的下降延触发重载。TF2和EXF2都可以产生中断。设置DCEN=1时Timer2可以向上或向下计数,如图6所示,此模式下,T2EX脚控制计数方向。T2EX如果为1,Timer2向上计数。计数器到0FFFFH时溢出并将TF2置1。溢出可以使RCAP2H和RCAP2L中的16为值重新加载到定时寄存器中。T2EX如果为0,Timer2向下计数,当TH2和TL2中的值和RCAP2H和RCAP2L相等时向下溢出。溢出使TF2置1并将0FFFFH重新加载到计时寄存器中。

- s0 @5 E8 |2 N4 s

4 v- y: ^# ?/ f\q: O/ z) O8 k0 i

波特率发生器

通过设置T2CON中TCLK或RCLK位选择Timer2位波特窥测发生器Timer2作为发送和接收时可以应用于不同的波特率,设置TCLK或RCLK位使Timer2工作在波特率发生器模式,如图8所示。

波特率发生器模式和重载模式相似,TH2中值的溢出将使软件预设的16位寄存器值重载到计数器中。

波特率1、3模式由Timer2的溢出速率决定,由下面的等式表示 模式1、3波特率=(Timer2计数值)/16

定时器可以指定为计数或定时模式,在许多应用中,被设置成定时模式,Timer2的定时操作和波特率发生器的操作不同,作为定时器,它每机器周期(1/12个晶振周期)增加1,作为波特率发生器它每个状态时间(1/2晶振周期)增加1。波特率公式如下: 模式1、3=晶振频率

; f* w& A: @( \\7 |3 O8 s* z4 p

波特率

32×(65536-RCAP2H,RCAP2L)

这里(RCAP2H,RCAP2L)是RCAP2H和RCAP2L作为16为无符号整数。

Timer2作为波特率发生器如图8,这个只有在TCLK或者RCLK=1是才有效。需要注意的是TH2的的溢出不会将TF2置1,也不会产生中断,如果这时EXEN2置1,T2EX引脚的下降延将会使TF2置1并不会引发(RCAP2H,RCAP2L)到(TH2,TL2)的重载,那样,当Timer2作为波特率发生器时,T2EX可以作为一个外部中断使用。

当Timer2在波特率发生器模式作为定时器运行时(TR1=1),TH2,TL2不能进行读写,在这种情况下,计时器每个状态时间增加1,对其读写的结果将会不正确RACAP2寄存器可以读不可以写,因为写可能引起交迭重载或者重载出错。在处理Timer2的RACAP2寄存器前必须停止计时(TR2=0)。

3 e\S3 n% W; o\{9 n

可编程时钟输出

P1.0可以输出50%占空比的可编程时钟,如图9所示。这个引脚,除了作为普通的IO口,还有另外两个交替功能,它可以编程为Timer2的外部输入脚或者占空比50%的可变时钟输出,在晶振16M时频率范围从61Hz到4MHz。

Timer2指定为时钟发生器,必须将C/T2为清0并将T2OE位置1。TR2启动或停止计时器。输出频率取决于晶振频率和Timer2的捕捉寄存器的重载值,如下面公式所示。

时钟输出频率=晶振频率/4×(65536-(RCAP2H,RCAP2L))

在时钟输出模式,Timer2溢出不会产生中断,它可以同时作为波特率发生器和时钟输出使用,然而,当他们都使用(RCAP2H,RCAP2L)时,波特率和时钟输出频率不能取决于独自的设置参数。

8052 T2 用法详解

1、要精确定时,必须使用定时器的自动装载方式。本实验使用T2定时器,让它工作在16bit自动 装载方式,这时,有另一个位置专门装着16位预装载值,当T2溢出时,预装载值立即被装入, 这就保证了精确定时。

2、T2定时器是一个16位定时器,最长的溢出时间也就几十毫秒,要定时1秒,就需要用一个变量 来保存溢出的次数,积累到了一定的次数后,才执行一次操作。这样就可以累加到1秒或者更 长的时间才做一次操作。

3、当T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的。 4、T2定时器预装载值的计算:

设晶振为12MHz,每秒钟可以执行1000000(12000000/12)个机器周期。而T2每次溢出时最多 经过了65536个机器周期。我们应该尽量让T2定时器的溢出中断的次数最少,这样对主程序的干扰 也就最小。

选择每秒中断14次,每次溢出1000000/14=71428.57个机器周期,不为整数且超出65536个机器周期,无效。

选择每秒中断16次,每次溢出1000000/16=62500个机器周期,小于65536个机器周期,有效。 选择每秒中断20次,每次溢出1000000/20=50000个机器周期,小于65536个机器周期,有效。 通过上面的计算,我们可以发现,我们可以选择的方式有很多,但是最佳的是每秒中断16次,每次 溢出62500个机器周期,那么赋给T2定时器的初值应为65536-62500=3036,转换成十六进制值为 0x0BDC。

***************************************************************************************** /*********定时2中断服务子函数**************/ void timer2_init() { RCAP2L=(65536-62500)%6; RCAP2H=(65536-62500)/256; TR2=1; }

void isr_init() { ET2=1; EA=1; }

void Timer2_Server(void) interrupt 5 {

TF2=0;

deda++; //计数

if(deda<8){flag1=1;}else{flag1=0;} if(deda==16){sec++;deda=0;} if(sec==60){min++;sec=0;} if(min==60){hor++;min=0;} if(hor==24){hor=0;} }

在时钟输出模式,Timer2溢出不会产生中断,它可以同时作为波特率发生器和时钟输出使用,然而,当他们都使用(RCAP2H,RCAP2L)时,波特率和时钟输出频率不能取决于独自的设置参数。

8052 T2 用法详解

1、要精确定时,必须使用定时器的自动装载方式。本实验使用T2定时器,让它工作在16bit自动 装载方式,这时,有另一个位置专门装着16位预装载值,当T2溢出时,预装载值立即被装入, 这就保证了精确定时。

2、T2定时器是一个16位定时器,最长的溢出时间也就几十毫秒,要定时1秒,就需要用一个变量 来保存溢出的次数,积累到了一定的次数后,才执行一次操作。这样就可以累加到1秒或者更 长的时间才做一次操作。

3、当T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的。 4、T2定时器预装载值的计算:

设晶振为12MHz,每秒钟可以执行1000000(12000000/12)个机器周期。而T2每次溢出时最多 经过了65536个机器周期。我们应该尽量让T2定时器的溢出中断的次数最少,这样对主程序的干扰 也就最小。

选择每秒中断14次,每次溢出1000000/14=71428.57个机器周期,不为整数且超出65536个机器周期,无效。

选择每秒中断16次,每次溢出1000000/16=62500个机器周期,小于65536个机器周期,有效。 选择每秒中断20次,每次溢出1000000/20=50000个机器周期,小于65536个机器周期,有效。 通过上面的计算,我们可以发现,我们可以选择的方式有很多,但是最佳的是每秒中断16次,每次 溢出62500个机器周期,那么赋给T2定时器的初值应为65536-62500=3036,转换成十六进制值为 0x0BDC。

***************************************************************************************** /*********定时2中断服务子函数**************/ void timer2_init() { RCAP2L=(65536-62500)%6; RCAP2H=(65536-62500)/256; TR2=1; }

void isr_init() { ET2=1; EA=1; }

void Timer2_Server(void) interrupt 5 {

TF2=0;

deda++; //计数

if(deda<8){flag1=1;}else{flag1=0;} if(deda==16){sec++;deda=0;} if(sec==60){min++;sec=0;} if(min==60){hor++;min=0;} if(hor==24){hor=0;} }

本文来源:https://www.bwwdw.com/article/22pa.html

Top