定时器说明
定时器是c51单片机内部的资源,没有引脚图,我们可以通过单片机的手册来看看怎么用的 如图直接通过目录找到定时器的说明,他有这么多寄存器巴拉巴拉 首先设置模式: 我们是要使用定时器0,定时器1不管只设置定时器0, 3位GATE置0,由TR0单独控制定时器 因为我们使用内部系统时钟,2位C/T置0. 我们使用16位定时器的模式,所以M1.M0,取0,1。综上TMOD寄存器需要第四位设置为0001 这个不能位寻,我们只能先把低四位置0,在把最低为置1.
TMOD &= 0xF0;
TMOD |= 0x01;
再设置控制寄存器 注意上面写的可以位寻址,所以我们可以直接TF1=巴拉巴拉。
TR0控制位解释如下: 所以
TMOD &= 0xF0;
TMOD |= 0x01;
TR0 = 1:
所以
TMOD &= 0xF0;
TMOD |= 0x01;
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;
TMOD |= 0x01;
TR0 = 1:
TF0 = 0;
TL0 = 0x66;
TH0 = 0xFC;
然后开启中断,EA,ET0全部置1,PT0置0开启中断最高优先级。 中断号如图:
#include <REGX52.H>
void Timer0_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
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)
{
T0Count = 0;
if(LedMode == 0)
{
P2 = _crol_(P2,1);
}
if(LedMode == 1)
{
P2 = _cror_(P2,1);
}
}
}
|