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自加一次 }

第1个回答  2019-09-29
定时器是从TR0
=
1那一行之后开始计时的
计数器/定时器
中断
实质是利用加一的计数器(16位)
由高8位和低八位
两个寄存器组成
中断
就是计数,
计满后溢出TF0=1向cpu申请中断
就是停止计数执行void
time0()
interrupt
1{...}里面的语句。
具体你可以看看定时器0方式1逻辑结构图。希望能够看懂
第2个回答  2019-08-22
定时器是从TR0
=
1那一行之后开始计时的,达到计时条件(这里是50000个机器周期)就产生中断。其它的理解是正确的
第3个回答  2020-02-18
你的定时器中断进不了吧,
因为你没开定时器中断允许位et0=1
另:
定时器模式设置好后tmod=0x01,
打开定时器中断允许et0=1,
然后tr0=1启动定时器就可以了
第4个回答  2020-03-26
TR0=1;这一句启动定时器,定时器开始计时,等定时时间一到才开始中断。
相似回答