上电的时候默认是 IHRC 12MHZ,然后 SYSCLK 是有这个分频出来的,默认是 /8 ,分别是 1/8 ,/4 ,/2 ,/1 根据需要得到分频
TIMER0 1是兼容标准51的,但是添加了一个预分频器 CKCON 里面的 SCA 1 0 决定分频,T0M T1M 决定是否使用这个分频器,分频为
12,4,48,8。默认是 12分频,而默认就是使用这个分频器的,可以社会自 T0M T1M 选择直接使用 SYSCLK 而不用分频器。
其他的设置跟普通 51 是一样的。
定时时间的计算,首先内部RC 是 12MHZ,如果选择的分频为 /1,那么SYSCLK 就是 1/12M 所以一个指令为 0.0833 us ,如果 CKCON
里面设置不使用分频器,则直接进入TIMER的计数,选择模式2的8位计数器,那么自由溢出 256 的时间为 21.33us ,示波器实测的结
果吻合
如果OSC 8分频,则相应的时间为 170.66 us
如果CKCON设置分频为 12,则相应时间为 2048,分频48 的话则为 8191.68 us
以下是 silicon labs 的官方例子
void main (void)
{
PCA0MD &= ~0x40; // WDTE disable
OSCICN |= 0x03;
Timer0_Init (); // Initialize the Timer0
Port_Init (); // Init Ports
EA = 1; // Enable global interrupts
while (1); // Loop forever
}
void Timer0_Init(void)
{
TH0 = 0; // Init Timer0 High register
TL0 = TH0; // Set the intial Timer0 value
TMOD = 0x02; // Timer0 in 8-bit reload mode
CKCON = 0x02; // Timer0 uses a 1:48 prescaler
ET0=1; // Timer0 interrupt enabled
TCON = 0x10; // Timer0 ON
}
void Port_Init (void)
{
XBR1 = 0x40; // Enable crossbar
P2MDOUT = 0x0C; // Set LEDs
}
void Timer0_ISR (void) interrupt 1
{
}