由于89C51的晶振频率为12MHZ,机器周期是1us,则每1us产生一次计数,例如需要进行50ms的计时,对机器周期进行50000计数就可以得到,T0可以对机器周期进行65536次计数,为了不让T0溢出,我们需要对定时器/计数器赋初值,加上一个数就能等于65536,也就是65536和50000的差值,这个值就是初值:15536。
除以256是因为计时器第二种方式中是由一个高8位(TL0)和低8位(TH0)存储组成的:
如果要把差值装进这两个8位,低8位最多只能装256个机器周期,256个周期满了就用高8位的,意思是说低8位满一次高8位加1,那么高8位装多少,低8位就满了几次,算法就是用差值除256取其整数,接下来就是剩下小于256次数的就放在低8位,就是差值的余数。如果我要放一个超过256的数,需要超过先放高八位,把剩下的部分放在低八位中,TH0=(65536-50000)/256就是把TL0中放不下的部分放在TH0中,再把剩下的部分放在TL0中。
void timer(0) interrupt 1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
flag++;
if(flag==20)
{}
}