金沙滩51单片机定时器

标准的 51 单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写。

定时器的寄存器

T0和T1的控制由两个8位特殊功能寄存器完成:一个为定时器的方式选择寄存器TMOD用于确定定时器还是计数器工作模式;另一个叫做定时器控制寄存器TCON,可以决定定时器或计数器的启动、停止及进行中断控制。

  • TCON
    在这里插入图片描述
  • TMOD
    在这里插入图片描述
    在这里插入图片描述
    模式 1,是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535。
    模式 2,是 8 位自动重装载模式,计数范围 0~255。
    在这里插入图片描述

定时器的应用

第一步:设置特殊功能寄存器 TMOD,配置好工作模式。
第二步:设置计数寄存器 TH0 和 TL0 的初值。
第三步:设置 TCON,通过 TR0 置 1 来让定时器开始计数。
第四步:判断 TCON 寄存器的 TF0 位,监测定时器溢出情况。

写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是 12/11059200,假如要定时 20ms,就是 0.02 秒,要经过x 个机器周期得到 0.02 秒,我们来算一下 x*12/11059200=0.02,得到 x= 18432。16 位定时器的溢出值是 65536(因 65535 再加 1 才是溢出),于是我们就可以这样操作,先给 TH0 和 TL0一个初始值,让它们经过 18432 个机器周期后刚好达到 65536,也就是溢出,溢出后可以通过检测 TF0 的值得知,就刚好是 0.02 秒。那么初值y = 65536 - 18432 = 47104,转成 16 进制就是 0xB800,也就是 TH0 = 0xB8,TL0 = 0x00。这样 0.02 秒的定时我们就做出来了,细心的同学会发现,如果初值直接给一个 0x0000,一直到 65536 溢出,定时器定时值最大也就是 71ms 左右,那么我们想定时更长时间怎么办呢?

#include <reg52.h>

sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main()
{
    unsigned char cnt = 0;  //定义一个计数变量,记录T0溢出次数

    ENLED = 0;    //使能U3,选择独立LED
    ADDR3 = 1;
    ADDR2 = 1;
    ADDR1 = 1;
    ADDR0 = 0;
    TMOD = 0x01;  //设置T0为模式1
    TH0  = 0xB8;  //为T0赋初值0xB800
    TL0  = 0x00;
    TR0  = 1;     //启动T0
    
    while (1)
    {
        if (TF0 == 1)        //判断T0是否溢出
        {
            TF0 = 0;         //T0溢出后,清零中断标志
            TH0 = 0xB8;      //并重新赋初值
            TL0 = 0x00;
            cnt++;           //计数值自加1
            if (cnt >= 50)   //判断T0溢出是否达到50次
            {
                cnt = 0;     //达到50次后计数值清零
                LED = ~LED;  //LED取反:0-->1、1-->0
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/imxlw00/article/details/88135405