51单片机12M和11.0592M晶振定时器初值TL0和TH0的计算#includestdio.h#includereg51.hvoidtimer0_init(){TMOD=0x01;//方式1TL0=0xb0;TH0=0x3c;TR0=1;ET0=1;}voidtimer0_ISR(void)interrupt1{TL0=0xb0;TH0=0x3c;//50ms中断一次single++;if(single==20){kk++;single=0;}}voidmain(){intkk=0;//计数器intsingle=0;timer0_init();}TL0=0xb0;TH0=0x3c;这两个是怎么算出来得,如果晶振不是12Mhz,是11.0592MHz怎么算12M的晶振每秒可产生1M个机器周期,50ms就需要50000个机器周期,定时器在方式1工作,是16位计数器,最大值为65536,所以需设置初值15536,即3CB0H(10进制15536转换成16进制数3CB0),所以TH0=0x3c,TL0=0xb0。(65536-50000周期=初值15536)高位就是TH0的值,低位为TL0的值11.0592M的晶振每秒可产生0.9216M个机器周期,50ms就需要46080个机器周期,定时器在方式1工作,是16位计数器,最大值为65536,所以需设置初值19456,即4C00H,所以TH0=0x4c,TL0=0x00。其实很简单,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期机器周期=12/n(n指晶振频率),假设你要定时的时间为M那么定时的初值为:M/机器周期=初值;TH0=(65536-初值)%256;TL0=(65536-初值)/256;将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值例如用12M晶振做1ms定时计算如下:机器周期=12/12*10^6=1us(微秒)定时初值=(1*10^-3)/(1*10^-6)=1000;所以:TH0=(65536-1000)%256;TL0=(65536-1000)/256;将65536-1000=64536化为16进制为:0xFC18TH0=0xFC;TL0=0X18;