定时器在单片机应用中非常的重要,单片机可以对外部脉冲计数和精确定时。51有两个定时器T0和T1,有四种工作模式,它们分别使用TH0,TL0和TH1,TL1作为特殊功能寄存器。TMOD用于设置工作方式,TCON控制启动和停止计数器。单片机复位时它们都是0。
TCON
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TF1和TF0-溢出标志位,=溢出时置1
TR1和TR0-计数运行控制,=1 启动
TMOD
GATE C/T M1 M0 GATE C/T M1 M0
高4位定时器1,低4位定时器0
GATE门控位
GATE=0时,由TR0/TR1启动计数器;GATE=1时,有TR0/TR1和INT0/INT1共同启动定时器
C/T计数和定时模式选择
C/T=0 定时器;C/T=1 计数外部引脚(T0 P3.4 或T1 P3.5)脉冲(负跳变)计数
M1 M0 工作方式选择(0-4)
方式0 (M1=0,M0=0)
13位计数器(THx低5位和TLx8位),0~8191
溢出后需要软件设置计数初值
方式1 (M1=0,M0=1)
16位计数器(THx8位和TLx8位),0~65535
溢出后需要软件设置计数初值
方式2 (M1=1,M0=0)
8位计数器(THx8位和TLx8位),0~255
溢出后自动恢复计数初值(THx存放初值)
方式3 (M1=1,M0=1)
仅适用于T0,把T0当成两个8位计数器
TLx8位,类似方式0
THx8位,占用T1的TR1和TF0
机器周期T=12/fosc
定时器/计数器的初始化
由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始货的步骤一般如下:
1、确定工作方式(即对TMOD赋值);
2、预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);
3、根据需要开放定时器/计数器的中断(直接对IE位赋值);
4、启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。
例:定时器C程序举例
#include <reg52.h>
unsigned int t0=0;
unsigned int t1=0;
sbit l0=P1^0;//发光二极管0
sbit l1=P1^1;//发光二极管1
void main()
{
TMOD = 0x02;//t0 工作方式2 ;T1 工作方式1
TH0=0x00;
TL0=0x00;
TH1=0x00;
TL1=0x00;
EA=1;//开中断
ET0=1;//T0中断允许
ET1=1;//T1中断允许
TR0=1;//启动T0
TR1=1;//启动T1
l0=0;
l1=0;
while(1)
{
//空转,等待中断
}
}
void timer0() interrupt 1 using 2//定时器0中断,使用寄存器组2
{
//方式2 处置在TH中,不用再赋初值了
t0++;
//太快了,需要延时
if(t0>=100)
{
t0=0;
l0=~l0;
}
}
void timer1() interrupt 3 using 3//定时器1中断,使用寄存器组2
{
TH1=0;
TL1=0;
t1++;
if(t1>=100)
{
t1=0;
l1=~l1;
}
}