51单片机定时器设置问题之个人看法

本人最近学习51单片机,以下是教程网址,在7-37课中,讲到定时器时第一遍不是太明白,看到下面的评论中也有不少人一头雾水,本人现将自己的理解概述如下:

教程网址:http://www.51zxw.net/show.aspx?id=37655&cid=473

先贴代码:

#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P1^0;
u8 timer;
void main (void)
{    
    TMOD = 0x01;
    TH0 = (65535-50000)/256;
    TL0 = (65535-50000)%256;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
    while (1)
    {
        ;
    }  
 
}
void timer0_service(void) interrupt 1
{
    TH0 = (65535-50000)/256;
    TL0 = (65535-50000)%256;
    timer ++;
    if(timer==20)
    {
        timer=0;
        led=~led;
    }
}

橙黄色的while循环语句很多人不明白为什么加上去之后就能实现定时呢?下面是个人理解:

首先要确认的是:main函数是扫描执行的,如果不加while语句,那么在TR0=1这条语句执行完后,程序会有两个分支同时进行,第一个分支是:重新执行main函数,给定时器赋初值;第二个分支是:定时器开始计时,记到50ms就会跳到中断函数 timer0_service,但是第一个分支的时间要比第二个分支的时间短,也就是说,第二个分支中,定时器还没能计时50ms,程序就已经跳到主函数的赋值语句中了,这就导致定时器还没计时50ms就被重新赋予初值,从而无法跳到中断函数 timer0_service,而加上while语句后,程序就会在此一直等待,而不执行第一个分支,使得定时器计时50ms后再跳到中断函数。

猜你喜欢

转载自blog.csdn.net/andrewhxc/article/details/81257650