>> 8051单片机片内有二个十六位定时器/计数器:定时器0(T0)和定时器1(T1)。
>> 2 个16 位定时器实际上都是16 位加1 计数器。T0 由2 个8 位持殊功能寄存器TH0和TL0构成,T1 由TH1 和TL1构成。
>>每个定时器都可由软件设置为定时工作方式或计数工作方式。
>> 这些功能都由特殊功能寄存器TMOD设置和TCON所控制。
>>设置为定时工作方式时,定时器计数的脉冲是由8051片内振荡器输出经12分频后产生的。
>>每个机器周期使定时器(T0或T1)的数值加1直至计计数满产生溢出。
工作模式寄存器TMOD(89H)
TMOD的高4位用于T1,低4使用于T0,4种符号的含义如下:
GATE:门控制位。GATE和软件控制位TR、外部引脚信号INT的状态,共同控制定时器/计数器的打开或关闭。
C/T:定时器/计数器选择位。C/T=1,为计数器方式;C/T=0,为定时器方式。
M1M0:工作方式选择位,定时器/计数器的4种工作方式由M1M0设定。
M1
M0
工作方式
功能描述
0
0
工作方式0
13位计数器
0
1
工作方式1
16位计数器
1
0
工作方式2
自动再装入8位计数器
1
1
工作方式3
定时器0:分成两个8位计数器,定时器1:停止计数
控制寄存器TCON(88H)
TF1:定时器1溢出标志位。当字时器1计满溢出时,由硬件使TF1置“1”,并且申请中断。进入中断服务程序后,由硬件自动清“0”,在查询方式下用软件清“0”。
TR1:定时器1运行控制位。由软件清“0”关闭定时器1。当GATE=1,且INT1为高电平时,TR1 置“1”启动定时器1;当GATE=0,TR1 置“1”启动定时器1。
TF0:定时器0溢出标志。其功能及操作情况同TF1。
TR0:定时器0运行控制位。其功能及操作情况同TR1。
IE1:外部中断1请求标志。
IT1:外部中断1触发方式选择位。
IE0:外部中断0请求标志。
IT0:外部中断0触发方式选择位。
定时器/计数器的初始化:
由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始货的步骤一般如下:
1、确定工作方式(即对TMOD赋值);
2、预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);
3、根据需要开放定时器/计数器的中断(直接对IE位赋值);
4、启动定时器/计数器(若已规定用软件启动,则可把TR0 或TR1 置“1”;若已规定由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。
定时器初值的计算:
在定时器模式下:计数器由单片机主脉冲经12 分频后计数。因此,定时器定时时间T的计算公式为:
TC = M - T/T计数
这里,M为模值,和定时器的工作方式有关;方式0:M = 8192 方式1:M = 65536;方式2和方式3: M = 256; T 计数 是单片机时钟周期的12倍; TC为定时器的定时初值,T为需要定时的时间。
下面,来分析下我们例程的部分程序:
/*********************************
* 名称 : Time0_Init()
* 功能 : 定时器的初始化,11.0592MZ 晶振,50ms
* 输入 : 无
* 输出 : 无
* 制作 :www.schuitron.com
********************************/
void Time0_Init()
{
TMOD = 0x01; //初始化定时器0,工作在方式1
IE = 0x82; //开定时器中断,开总中断
TH0 = 0x3c; //这里是赋初值,初值的计算按上面的公司
TL0 = 0xb0; //也可以通过我们给的定时器计算软件计算
TR0 = 1; //启动定时器
}
/***************************************
* 名称 : Time0_Int()
* 功能 : 定时器中断,中断中实现 Count 加一
* 输入 : 无
* 输出 : 无
* 制作 :www.schuitron.com
* 注意 :定时器中不能处理进行太多的数据处理,否则会影响定时的准确性
*******************************************/
void Time0_Int() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0;
Count++; //长度加1
}