本人最近学习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后再跳到中断函数。