51单片机功能模块学习笔记 — 定时器

一.定时器

1. 简介

C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。

确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。

 

标准C512个定时器/计数器:T0T1。他们的使用方法一致。C52相比C51多了一个T2

 

2. 基础介绍

定时器的本质原理就是:每经过1个机器周期,计数存储器的值就加1。因此当使用定时器时,就必须掌握时钟周期和机器周期的关系。

1)时钟周期

时钟周期 :晶振频率的倒数。如果使用的是11.0592M的晶振,那么就是 1 / (11.0592x10^6) 秒   

注:1MHz = 10^6Hz

2)机器周期

机器周期 :标准51下,机器周期 =12倍的时钟周期。即:12 / (11.0592x10^6) 秒 。有的增强51单片机,1个机器周期等于4倍的时钟周期,还有的更短。

 

3.定时器的寄存器

1)计数存储寄存器THx&TLx

定时器和计数器工作,都依赖于计数。计数则是由计数存储器THx和TLx这2个8位寄存器完成的。

 

对于计数器,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。

 

对于定时器,每隔1个机器周期 加 1,假如(只是假如)一个机器周期为 1ms , 当加到1000次时,我们就认为经过了1s,这就是定时器定时依据。

 

Ø T0和T1都拥有一对8bit计数存储寄存器。他们的复位值都是0。

T0 对应:TH0 ,TL0

T1 对应 : TH1 , TL1

 

sfr TL0 = 0x8A; // TL中的L是LOW的意思,代表低位,同理H代表HIGH高位。2个8位组合起来就形成了一个16位的计数器。
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
 

Ø 当计数器加满后,再加1,就溢出了,溢出后自动归0。且溢出时,溢出标识位TFx 就会自动变为1(T0的溢出标志位TF0,T1的溢出标志位TF1)。如果启用了对应的中断,单片机会调用中断处理函数。

 

Ø TH0 和 TL0 以 16位 模式工作,那它的计数范围为   [0 , 65535 ]  ,  也就是累加 65536次发生溢出。 每累加一次是  12 / (11.0592x10^6) 秒。

那么从 0 累加到溢出 历时  ≈ 0.071s = 71ms 。

 

为了避免误差,可以延时 10的整数倍ms,以便用倍数控制更长的延时时间。所以,我么要给 TH0 和  TL0赋一个初始值,使他们的溢出周期(TH0,TL0从初始值到溢出所用的时间)减少到 10ms。举个例子来说,如果我的延时周期为200ms,那么定时器的应该定时100ms,但是定时器最大的定时时间也只为71ms,所以我们可以先定时10ms,再循环10次,也就是10*10ms = 100ms;

 

 

 

 

2)工作模式寄存器TMOD

通过TMOD来配置T0和T1的工作模式。


Ø C/T:计数器,定时器功能选择位。 1为计数器模式, 0 为定时器模式


Ø M0M1


Ø GATE 选通门:

GATE=0,只要TR=1,计数器就开始工作; GATE=1,只有INT=TR= 1”时,计数器工作;一般情况下GATE0

 

                             

 

 

(3)控制寄存器TCON



Ø TF1:定时器/计数器1的溢出标志位。

1表示计数存储器溢出,0表示计数存储器正常计数。

 0方式:①通过代码修改TF10

           ②当通过中断机制来使用定时器/计数器1时,进入中断处理函数后自动归0

 

 

Ø TR1:定时器/计数器1的启动和停止位。1表示启动,0表示停止。

 

 

Ø IE1,IE0 外部中断INT1,INT0的请求标志:

 当单片机检测到INT引脚上有下降沿时,IE=1 申请中断.进入中断服务程序时,硬件 自动清除IE标志.

 

 

Ø IT1,IT0 外中断触发类型控制:

    IT=1,外中断信号的下降沿触发IE标志;

 

    IT=0,外中断信号的低电平触发IE标志。

 

 

 

4.定时器的实验历程

 

(1)说明:实验通过定时器控制LED灯每隔100ms闪烁一次

 

Ø 具体实现代码

void Timer1_Init(void)
{
    TMOD |= 0x10  ;        //使用模式1
    TH0 = (65536 - 10000)/256;     //取高8位   
    TL0 = (65536 - 10000)%256;     //取低8位   共定时10ms
    TR1 = 1;          //打开定时器1开关
    EA = 1;           //打开中断总开关
    ET1 = 1;          //打开定时器中断1的开关
}



void Timer1_Isr(void) interrupt 3    //interrupt后面跟的数字是中断号,需要注意的是不同定时器对应不同的中断号
{
    static unsigned char i = 0;    

    TH0 = (65536 - 10000)/256;     //重载初值
    TL0 = (65536 - 10000)%256;

    i++;
    if(i == 11)      //100ms反转一次
    {
        i = 0;
        LED2 = !LED2;
    }
    
} 







猜你喜欢

转载自blog.csdn.net/csdnxmj/article/details/79182452