用STC89C52单片机来说,它有3个定时器,分别是T0,T1和T2。其中T2有捕捉功能。
举例如定时器配置为 16 位定时器/计数器(模式1), TL0 的 8 位和 TH0 的 8 位所构成16位计数器(就是2位数16位,转换为10进制就是0到65535),当它溢出是将置位TCON的TF0位。如果开了T0中断,将进入T0中断程序(一定要有,哪怕是空的),硬件将自动清除中断标志。
初值的意义就是从这个数字开始到65536溢出,这个差值乘以计数周期就是定时的时间。如果初值为0,就是最长定时周期,如果为65535,就是来一个计数周期,就会溢出,产生中断。 用一段程序来说明。要使用定时器,需要设置TMOD定时器寄存器,指定工作模式,设置定时器初值。开定时器,开中断。如果不开,就需要程序中手动判断TF0标志位,进行处理。
/*定时器0,系统时钟为11.059200M,12T模式,定时器5ms,则初值计算为65536-11059200/12*0.005=60928=0xEE00,则TH0=0xEE,TL0=0x00;*/
void T0_init()
{
TMOD&=0xF0;
TMOD|=0x01;
TH0=0xEE;
TL0=0x00;
TR0=1; //开定时器
ET0=1; //开中断
}
void Timer0() interrupt 1 //中断程序,需要重新赋初值
{ static unsigned char cnt=0;
TH0=0xEE;
TL0=0x00;
cnt++; //200次中断,产生1秒标志位 if(cnt>=200)
{ cnt=0;
flag1s=1;
LED=~LED; //1sLED指示
} P0 = 0xFF; //消隐
switch(i) //动态切换P0口,显示LED值
{ case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=(LedBuff[1]&0x7F);break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i=0; P0=LedBuff[2];break;
default:break;
}
}
附图是T0模式1的结构,89C52可以选择6T(速度快1倍))或12T模式。定时器计数器模式选择。是否与外部中断0一起控制启动计数器(脉宽测量)。来一个计数脉冲TH0TL0加1,到65536,溢出置位标志TF0,产生中断。