定时器说明
定时器是c51单片机内部的资源,没有引脚图,我们可以通过单片机的手册来看看怎么用的
如图直接通过目录找到定时器的说明,他有这么多寄存器巴拉巴拉
首先设置模式:
我们是要使用定时器0,定时器1不管只设置定时器0,
3位GATE置0,由TR0单独控制定时器
因为我们使用内部系统时钟,2位C/T置0.
我们使用16位定时器的模式,所以M1.M0,取0,1。综上TMOD寄存器需要第四位设置为0001
这个不能位寻,我们只能先把低四位置0,在把最低为置1.
TMOD &= 0xF0;//低四位置0,高四位不变
TMOD |= 0x01;//最低为置1
再设置控制寄存器
注意上面写的可以位寻址,所以我们可以直接TF1=巴拉巴拉。
TR0控制位解释如下:
所以
TMOD &= 0xF0;//低四位置0,高四位不变
TMOD |= 0x01;//最低为置1
TR0 = 1:
所以
TMOD &= 0xF0;//低四位置0,高四位不变
TMOD |= 0x01;//最低为置1
TR0 = 1:
TF0 = 0;//清零
之后我们设置一下定时器初值:
每12个时钟+1,系统是12或者11.0592MHZ,我们用12MHZ估算一下,1/12MHz=1/12000 000秒
乘1000 000结果是1/12us,每12个时钟+1的话就是1/12*12为1us+1。16位最大值是65535,我们让他1ms+1就需要把初值设置为65535-1000=64535。所以高位为64535/255,低位为64535%255;
所以
TMOD &= 0xF0;//低四位置0,高四位不变
TMOD |= 0x01;//最低为置1
TR0 = 1:
TF0 = 0;//清零
TL0 = 0x66;
TH0 = 0xFC;
然后开启中断,EA,ET0全部置1,PT0置0开启中断最高优先级。
中断号如图:
#include <REGX52.H>
void Timer0_Init() //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
PT0 = 0;
}
void main()
{
while(1)
{}
}
void Timer0_Routine() interrupt 1//中断函数
{
static unsigned int T0Count;//静态变量在函数结束后不清除值,跟全局变量区别只在于这个仅限此函数使用
TL0 = 0x66; //重置置定时初始值
TH0 = 0xFC;
T0Count++;
if(T0Count>=100)//100ms执行一次
{
T0Count = 0;
if(LedMode == 0)
{
P2 = _crol_(P2,1);
}
if(LedMode == 1)
{
P2 = _cror_(P2,1);
}
}
}