单片机中断程序中,我不对TH0,TL0赋值,怎么也一样运行?

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar tt;
void main()
{
TMOD=0x01;
// TH0=(65536-50000)/256;
// TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void timer0()interrupt 1 using 1
{
// TH0=(65536-50000)/256;
// TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
led1=~led1;
}
}
就是这个程序。求大神帮我解释下这个程序的意义。

这个程序的功能是通过定时器中断来控制LED的状态翻转,而定时长度由TH0与TL0决定,TH0与TL0组成的寄存器能存放的最大的数据为65535,定时的方法是首先在寄存器里存放一个数据,然后单片机会在每个时钟周期里自动加1,等加满后就会自动清0,此时会触发单片机的中断,这样就达到了计时的目的,例如单片机晶振为12.000MHz,那么每1us就会自动加1,若放入65536-50000,就表示需要加50000次才能溢出,时间大概就是50ms每20次中断会使LED翻转一次,这样就是1s闪烁一次,如果每次进入中断后不对这两个寄存器赋值,那么就是默认为0,就需要加65536次,由于跟50000次比较接近,所以你就很难感受到这点变化,其实时间长了就会相差很大的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-16
#include <reg52.h> //单片机的头文件,里面定义了单片机的一些寄存器
#include <intrins.h>
#define uchar unsigned char //定义一下方便使用,也可不定义,直接使用unsigned char和unsigned int
#define uint unsigned int //定义led1为P1^0,出现led1的地方就代表P1^0
sbit led1=P1^0;
uchar tt;
void main()
{
TMOD=0x01; //定时器/计数器工作方式寄存器,T0工作在方式1下,为16位定时器/计数器
// TH0=(65536-50000)/256;
// TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; // 允许T0溢出中断
TR0=1; //启动定时器0
while(1);
}
void timer0()interrupt 1 using 1 //使用T0中断(T0的中断代码为1,对应interrupt 1) ,using 1可以省略
{
// TH0=(65536-50000)/256; //我感觉下面两行应该把注释符号“//”去掉,这样就表示定时0.5ms(默认晶振为12MHz)
// TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
led1=~led1;
}
}
/*******整个程序的意思就是用P1^0去控制led灯,使用T0工作在方式1下,每隔0.5秒闪烁一次*******/

第2个回答  推荐于2018-05-15
单片机中断程序中,TH0和TL0不赋值,那么定时器的初值就为0,只要TR0=1,就开始工作了,赋值与否不会影响到其工作。定时器是递增方式工作的,所以所赋值为溢出值,比如需要定时1000个周期,那么溢出值为65536-1000,为初值大小。本回答被网友采纳
第3个回答  2013-05-16
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar tt;
void main()
{
TMOD=0x01; //定时器0设置工作模式1
// TH0=(65536-50000)/256; //赋定时器0的初值,不赋值则从0开始计数
// TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器
while(1); //原地死循环
}
void timer0()interrupt 1 using 1
{
// TH0=(65536-50000)/256;
// TL0=(65536-50000)%256;
tt++; //中断次数累加
if(tt==20)//如果中断次数到20次则进
{
tt=0; //中断计数清0
led1=~led1; //LED取反,按原设置值,1秒钟取反一次
}
}

单片机中断程序中,我不对TH0,TL0赋值,怎么也一样运行?
TH0与TL0组成的寄存器能存放的最大的数据为65535,定时的方法是首先在寄存器里存放一个数据,然后单片机会在每个时钟周期里自动加1,等加满后就会自动清0,此时会触发单片机的中断,这样就达到了计时的目的,例如单片机晶振为12.000MHz,

单片机 c语言中的定时中断函数,在mian函数TH0和TL0有了初始化,为什么在...
因为定时器计数溢出时才产生中断,th0tl0全等于0。这种定时工作方式不会自动重装定时初值,所以中断子函数中要人工装载。主函数中如果省去初值,那就是从0开始计数,第一次进入中断的时间会有误差,所以不能省。

单片机中断程序中为什么要重新赋值?
在工作方式2时是自动重装初值的,不需要给TH0\/TL0重新赋值;在其他工作方式下需要。定时器工作时其TH\/TL的值是一直加,直到溢出得到中断。工作方式2是8位定时\/计数器,其高8位被用来保存初值,来中断后就自动把保存在其中的初值付给定时计数器,而方式0方式1是13位、16位定时\/计数器,2个寄存器都使用掉了,硬件不能...

...中断程序里的TH0和TL0的赋值语句现象还是一样 ?
应为:TMOD = 0x01;

请教一个单片机的问题 很基础的
是的,只有溢出才申请中断,要进入中断必须要EA=1,和ET0=1两个条件满足。至于你说的开始删除TH0和TL0赋初值也能进入中断的问题,很简单,你没赋初值,那么初值默认为0,经过65536次计数后也同样溢出申请中断。第二个问题嘛,计数是没有终止的,除非你TR0=0,所以你在给TH0和TL0赋值的过程中都在...

单片机定时器方式2 TH0和TL0如何赋值
我有更好的答案推荐于2017-12-16 11:19:39 最佳答案 TH0,和TL0在程序一开始赋值一次就行了,再以后,单片机运行的时候,即TR0 = 1,只有TL0运行,TL0从初始数值开始自加,当加到255之后,再加1 次,就变成 了0,此时,单片机的硬件会自动把TH0里的数值赋值给TL0,然后TL0又自加,加到255之后...周而复始。除非...

单片机定时器的TH0与TL0的区别是什么?
你好,赋值一样只是个别情况,并不是说每个程序的TH0和TL0要赋一样的值。比如 TH0=0xfc ;TL0=0x18 ;合起来就是FC18H,十进制是64536。高8位和低8位组合起来可以表示0~65535,而8位寄存器只能表示0~255,所以可以更方便的满足定时的需要。o(∩_∩)o ...

单片机中的中断问题,
回到while(1),等待下一次中断,定时器继续计数;定时器产生中断,...反复20次,P10取反。所以你的问题:1.中断函数是只执行一次吗 不是,每次执行完之后,由于中断未关,并且T0继续计数,所以后面一直会有中断;2.还有中断函数对TH0,TL0的赋值是不是多余?不是。每次产生中断后T0的值已经是0了,...

单片机中th0,tl0赋值什么用
单片机中,th0、tl0是定时器0的计数单元,实行加计数。对th0、tl0赋值也叫赋初值,目的就是在此基础上再计数多少次th0、tl0同时等于0(发生溢出)。

单片机定时中断的问题
标志位在子程序中已被改变,现在就可能出错了。所以在进入中断子程序时要首先把这些标志位(即ACC和PSW)保存起来即PUSH ACC和PUSH PSW,子程序结束时释放:POP PSW和POP ACC,以便回到主程序时能正确的继续运行。如果用不到这些,也可以不操作,但是建议你最好进行保护,这样不容易出错的。

相似回答