STC89C52RC的定时器/计数器

目录

一、STC89C52RC的定时器/计数器

二、定时器/计数器的工作方式如何选择

三、使用Timer0实现1秒定时

四、使用Timer1实现计数器功能

一、STC89C52RC的定时器/计数器

STC89C52RC芯片内置了2个定时器/计数器(Timer0和Timer1),这两个模块可以用于实现定时和计数功能。

这两个定时器/计数器模块的主要特性如下:

定时器和计数器模式可选,可通过软件控制模式选择。

可以设置计数/定时的初值和重装载值,通过设置初值和重装载值可以实现不同的计数/定时功能。

可以通过软件或硬件触发启动定时器/计数器,并可以根据需要启用或禁用定时器/计数器中断。

可以设置定时器/计数器的时钟源和分频系数,以适应不同的应用场景。

扫描二维码关注公众号,回复: 15234808 查看本文章

需要注意的是,在使用Timer0和Timer1时,需要根据具体的应用需求设置不同的定时器/计数器模式、时钟源、分频系数和初值等参数。并且,在启用定时器/计数器中断时,还需要设置相应的中断向量表和中断服务程序。

二、定时器/计数器的工作方式如何选择

STC89C52RC芯片中的定时器/计数器共有四种工作方式,分别是模式0、模式1、模式2和模式3,下面分别介绍它们的工作方式及适用场景:

模式0:13位定时器模式

在模式0下,定时器/计数器的计数值为TH0和TL0组成的13位数值,当计数器溢出时,TH0和TL0将重新装载初值。在这种模式下,定时器/计数器的计数精度相对较低,适用于计数范围比较小的场合。

模式1:16位定时器模式

在模式1下,定时器/计数器的计数值为TH0和TL0组成的16位数值,当计数器溢出时,TH0和TL0将重新装载初值。在这种模式下,定时器/计数器的计数精度较高,适用于计数范围比较大的场合。

模式2:8位自动重装载定时器模式

在模式2下,定时器/计数器的计数值为TH0组成的8位数值,当计数器溢出时,TH0将重新装载初值,并置位TF0标志位。在下一个计数周期,定时器/计数器将继续计数,直到再次溢出,重复上述操作。在这种模式下,定时器/计数器的计数精度较高,同时能够自动重新装载初值,适用于需要周期性定时的场合。

模式3:16位自动重装载定时器模式

在模式3下,定时器/计数器的计数值为TH0和TL0组成的16位数值,当计数器溢出时,TH0和TL0将重新装载初值,并置位TF0标志位。在下一个计数周期,定时器/计数器将继续计数,直到再次溢出,重复上述操作。在这种模式下,定时器/计数器的计数精度较高,同时能够自动重新装载初值,适用于需要周期性定时的场合,计数范围较大。

三、使用Timer0实现1秒定时

在STC89C52RC芯片中,Timer0可以用来实现定时功能。具体步骤如下:

将TMOD寄存器的低四位设置为0001,表示使用Timer0的模式1,即16位定时器模式。

设置Timer0的初值,即将TL0和TH0寄存器清零,并将计数值赋给TH0寄存器。

开始计时,即打开定时器中断开关(ET0)和总中断开关(EA)。

在中断服务程序中,每当Timer0计数到0时,重新设置初值,并执行定时操作。

下面是一段示例代码,实现每隔1秒LED闪烁一次的功能:
 

#include <reg52.h>

sbit led = P1^0; // LED连接到P1.0

void timer0_isr() interrupt 1 { // Timer0中断服务程序
    TH0 = 0xFC; // 重新设置初值
    TL0 = 0x66;
    led = ~led; // LED翻转
}

void main() {
    TMOD = 0x01; // 设置Timer0为模式1
    TH0 = 0xFC; // 设置Timer0的初值为65536-110592/12/2=252,即0xFC
    TL0 = 0x66;
    EA = 1; // 打开总中断开关
    ET0 = 1; // 打开Timer0中断开关
    TR0 = 1; // 启动Timer0
    while(1) {}
}


在上述代码中,TH0和TL0寄存器的初值为252,即0xFC。这是因为STC89C52RC的时钟频率为11.0592MHz,而Timer0的计数时钟频率为时钟频率的1/12,即921.6kHz。当计数器达到0时,计数器的值为65536,即0x10000,需要重新设置初值为252,这样定时时间就是1秒。由于定时器中断的时间精度和系统时钟频率有关,可能存在一定的误差,实际应用中需要根据需要进行调整。

四、使用Timer1实现计数器功能

在STC89C52RC芯片中,Timer1可以用来实现计数器功能。具体步骤如下:

将TMOD寄存器的高四位设置为0010,表示使用Timer1的模式2,即8位自动重装计数器模式。

设置Timer1的初值,即将TL1和TH1寄存器清零,并将计数值赋给TH1寄存器。

开始计数,即打开定时器中断开关(ET1)和总中断开关(EA)。

在中断服务程序中,每当Timer1计数到0时,将计数器的值加1。

下面是一段示例代码,实现每隔1秒计数器加1,当计数器的值达到10时,停止计数:

#include <reg52.h>

sbit led = P1^0; // LED连接到P1.0
unsigned char counter = 0; // 计数器

void timer1_isr() interrupt 3 { // Timer1中断服务程序
    TH1 = 0x3C; // 重新设置初值
    TL1 = 0xAF;
    counter++; // 计数器加1
    if(counter == 10) { // 计数器达到10时停止计数
        ET1 = 0; // 关闭Timer1中断开关
        led = 0; // 关闭LED
    }
}

void main() {
    TMOD = 0x20; // 设置Timer1为模式2
    TH1 = 0x3C; // 设置Timer1的初值为15536
    TL1 = 0xAF;
    EA = 1; // 打开总中断开关
    ET1 = 1; // 打开Timer1中断开关
    TR1 = 1; // 启动Timer1
    while(1) {
        led = 1; // 点亮LED
    }
}


在上述代码中,TH1和TL1寄存器的初值为15536,即0x3CAF。这是因为STC89C52RC的时钟频率为11.0592MHz,而Timer1的计数时钟频率为时钟频率的1/12,即921.6kHz。当计数器达到0时,计数器的值为65536,即0x10000,需要重新设置初值为0x3CAF,这样计数器的溢出时间就是1秒。

猜你喜欢

转载自blog.csdn.net/m0_61107092/article/details/130234899