单片机 定时器初值计算

小弟用8051F040单片机,晶振22.1184M,想用定时器,但是时间一直搞不对,计算定时1ms,这是初始化程序,求高手赐教……
void Timer0Init( void )
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = TIMER01_PAGE;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TMOD = 0x01;//16 bit mode
ET0 = 1;
TR0=1;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}

第1个回答  2014-01-18
单片机的程序运行都是以系统时钟周期为基础,而系统时钟周期又和单片机晶振相关联,一般51单片机的系统时钟周期均为晶振的12分频。
单片机的定时器每计时一次为一个系统时钟周期(如果晶振频率为12MHz,一个系统时钟周期为12/(12M)=1/1000000秒)
单片机定时器定时是顺计时,计数到65536的时候才会产生中断,要定时2ms就得计时2000次,因此就用65536-2000
其实你上面写的两句程序就是取整,高八位给TH0,取余,低八位给TL0
这个没有办法编程的时候直接变,因为如果单片机的晶振频率一变定时器定的时间就会发生变化,而且定时器有八位的和十六位的计算方式都不同,不过你可以去下载51单片机定时器自动计算的小软件,很好用。
第2个回答  2012-11-27
16位模式1 初值63692,从网上下载一个51定时计算器,太方便了
TH0=(65536-(65536-63692))/256;
TL0=(65536-(65536-63692))%256;
第3个回答  2012-11-29
X=65536-(1000*10^3/22.1184)
TH0=(65536-(1000*10^3/22.1184))/256
TL0=(65536-(1000*10^3/22.1184))%256追问

老师你好,这样TH0与TL0里面的数据就变成负数了。对定时时间有影响么?

追答

怎么可能是负值呢?明明是正值呀
X=65536-(1000*000/22.1184)
TH0=(65536-(1000*000/22.1184))/256
TL0=(65536-(1000*000/22.1184))%256

第4个回答  2012-12-11
TH0 = 0x0F8;
TL0 = 0x0CD;