51单片机定时器使用

51单片机定时器

考试考完了,闲得无聊,正好手头有一块51学习板,捣鼓一下。控制任务如下:

P1.0 控制一个LED灯,亮0.5s,灭0.5s。

设计思路:这里我们只用定时器,不用软延时。51的定时器最多定时60ms,所以我们设置定时器每
50ms中断一次,通过在中断程序设置一个变量来统计中断次数,从而实现较长时间的定时。这里我们
是每500ms执行一次灯亮灯灭的动作,所以每10个中断等于500ms(50ms x 10)。第6行,全局变量
timer50msCount 就是中断次数。第19-23行,当timer50msCount 为10时,代表500ms时间到,把
P1.0 取反,动作一次。

这里有个繁琐的地方,定时器的初值需要手工计算。不过前人开发了一下小程序,直接拿过来用就可以了。
见下图。把自动生成代码中的第一行删掉就可以了。

下面是程序。

#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;

sbit P10 = P1 ^ 0;
// 第 6 行
uchar timer50msCount = 0;   

void Timer0Init(void);

void main()
{
    EA = 1;         // 开总中断
    ET0 = 1;        // 开定时器 0 中断
    Timer0Init();

    while (1)
    {
        // 每500ms允许if语句块中的程序
        // 19 - 23 行
        if (timer50msCount == 10)
        {
            timer50msCount = 0;
            P10 = ~P10;
        }
    }
}

void Timer0Init(void) //[email protected]
{
    TMOD &= 0xF0; // 设置定时器模式,这里为T0
    TMOD |= 0x01; // 设置定时器工作方式1,为16为定时器
    TL0 = 0x00;   // 设置定时器低位初值
    TH0 = 0x4C;   // 设置定时器高位初值
    TF0 = 0;      // 清楚TF0溢出标志位
    TR0 = 1;      // 启动定时器0开始计时
}


// 定时器0中断子程序
void timer0Interrupt() interrupt 1
{
    timer50msCount++;
    // 每次中断时,定时器初值为0,需重新设置定时器初值,保持50ms
    // 时间不变
    TL0 = 0x00;
    TH0 = 0x4C;
}

猜你喜欢

转载自www.cnblogs.com/TomDing/p/9060181.html