51或者52单片机 基于c语言的 定时器中断从哪里开始?

如下面的这个程序,定时器中断 是从EA=1;
ET0=1;
TR0=1; 这后面就开始呢?
还是从while那里开始定时器中断的?
附程序:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
uchar num;
uchar tt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
num=0;
tt=0;
TMOD=0x11;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断

TR0=1;//启动定时器0

wela=1;//开通位选
P0=0x00;//向位中输入00,全部选择
wela=0;//关闭位选,选择的结果不变,数码管全部亮
while(1)
{

if(tt==20)//看tt是否为20,如果不为20,则重新从while开始,则又进入了中断程序。再耗时50ms,tt再加一。以此类推,tt加到等于20时候,(共耗时1s?
//此时执行if里面的程序
{
d1=~d1;//灯动作反过来
tt=0;//tt回零
num++;//num自加一次
if(num==16)//这个影响到了是否是数码管由0显示到f,去掉这一行,则只能出现全零的数码管
//这个意思是,如果num不等于16,就直接执行dula段=1的指令,开始给每个数码管变换数字 num等于几,数码管就等于几(十六进制显示)直到显示到16了,if语句成立,
//执行num=0 回零的指令,使数码管重新开始显示。
num=0;
dula=1;
P0=table[num];
dula=0;
}
};//整个程序就在while里面进行循环了。就不出去了 , 每一次程序到这里,重新回到while开始的位置,再开始新一次的中断。

}
void time0() interrupt 1//定时器0工作 c语言的序号是1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;//耗时50ms tt自加一次
}

TMOD=0x11;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
你的这几句话,把定时器设置成工作方式1,总的初值是15536,当TR0 = 1的时候,开始计数,一直计到65535之后,再计一个数,变成了0,这个时候,触发中断,进到void time0() interrupt 1执行你的中断函数,
这个时候计数并没有停止,在你执行中断函数的过程中,仍然在计数,但是,你在中断里又把初值写成了15536,这样又开始从15536计数,当执行到t++完了之后,本次中断就退出,然后再次等待执行到65535,再计到0,又引发第二次中断,然后.....周而复始
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-26
定时器是从TR0 = 1那一行之后开始计时的,达到计时条件(这里是50000个机器周期)就产生中断。其它的理解是正确的追问

那就是从TR0=1;处开始,定时器就开始工作了。另外,我不是太明白,“产生中断”是什么意思呢?在这里指的是void time0() interrupt 1{...};执行一次完毕么?

追答

产生中断是指:当EA = 1,ET0 = 1时,如果计数器计数到65535之后,再过一个计时周期,则计时器溢出,此时TF置位就产生中断了,程序就会跳转到
void time0() interrupt 1//定时器0工作 c语言的序号是1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;//耗时50ms tt自加一次
}
执行,执行完成后再返回原来的位置

本回答被提问者采纳
第2个回答  2013-01-26
TR0=1;这一句启动定时器,定时器开始计时,等定时时间一到才开始中断。
第3个回答  2013-01-26
定时器是从TR0 = 1那一行之后开始计时的 计数器/定时器 中断 实质是利用加一的计数器(16位) 由高8位和低八位 两个寄存器组成 中断 就是计数, 计满后溢出TF0=1向cpu申请中断 就是停止计数执行void time0() interrupt 1{...}里面的语句。 具体你可以看看定时器0方式1逻辑结构图。希望能够看懂
第4个回答  2013-02-02
又一个菜鸟