SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
TCON | 88H | name | TF1 | TR1 | TF0 | TR0 |
TF1:T1溢出中断标志位。产生溢出时,硬件置1,请求中断。进入中断后硬件清0;
TR1:0—关闭T1,1—打开T1;
TF0:T0溢出中断标志位。产生溢出时,硬件置1,请求中断。进入中断后硬件清0;
TR0:0—关闭T0,1—打开T0;
SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
TMOD | 89H | name | GATE | C / T ‾ C/\overline{T} C/T | M1 | M0 | GATE | C / T ‾ C/\overline{T} C/T | M1 | M0 |
定时器1 | 定时器0 |
高四位控制定时器1:
GATE :置1时只有在INT1脚为高及TR1控制位置1时才可打开定时器/计数器1;
C / T ‾ C/\overline{T} C/T:0—T1为定时器模式,对内部系统时钟计数,1—T1为计数器模式,对引脚T1/P3.5的外部脉冲计数;
M1 | M0 | 定时器/计数器1模式选择 |
---|---|---|
0 | 0 | 16位自动重装载模式,溢出时将RL_TH1和RL_TL1存放的值自动装入TH1和TL1 |
0 | 1 | 16位不可重装载模式 |
1 | 0 | 8位自动重装载,溢出时将TH1存放的值自动装入TL1 |
1 | 1 | 定时器/计数器1无效(停止计数) |
低四位控制定时器0:
GATE :置1时只有在INT0脚为高及TR0控制位置1时才可打开定时器/计数器0;
C / T ‾ C/\overline{T} C/T:0—T0为定时器模式,对内部系统时钟计数,1—T0为计数器模式,对引脚T0/P3.4的外部脉冲计数;
M1 | M0 | 定时器/计数器0模式选择 |
---|---|---|
0 | 0 | 16位自动重装载模式,溢出时将RL_TH0和RL_TL0存放的值自动装入TH0和TL0 |
0 | 1 | 16位不可重装载模式 |
1 | 0 | 8位自动重装载,溢出时将TH0存放的值自动装入TL0 |
1 | 1 | 不可屏蔽中断的16位自动重装载定时器,即中断不受EA控制,只由ET0控制(此处与T1不同) |
SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
AUXR | 8EH | name | T0x12 | T1x12 | T2R | T 2 − C / T ‾ T2-C/\overline{T} T2−C/T | T2x12 |
T0x12 :0—定时器0为12T模式,1—定时器0为1T模式;
T0x12 :0—定时器1为12T模式,1—定时器1为1T模式;
T2R :0—关闭定时器2,1—打开定时器2;
T 2 − C / T ‾ T2-C/\overline{T} T2−C/T:0—T2为定时器模式,对内部系统时钟计数,1—T2为计数器模式,对引脚T2/P3.1的外部脉冲计数;
T2x12 :0—定时器2为12T模式,1—定时器2为1T模式;
SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
INT_CLKO | 8FH | name | T2CLKO | T1CLKO | T0CLKO |
SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
IE | A8H | name | EA | ET1 | ET0 |
EA:总中断,0—不允许,1—允许;
ET1:定时器/计数器1中断允许位,0—不允许,1—允许;
ET0:定时器/计数器0中断允许位,0—不允许,1—允许;
SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
IP | B8H | name | PT1 | PT0 |
PT1:定时器1的中断优先级控制位。0—最低优先级,1—最高优先级;
PT0:定时器0的中断优先级控制位。0—最低优先级,1—最高优先级;
SFR name | Address | bit | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|---|---|
IE2 | AFH | name | ET2 |
ET2:定时器2的中断允许位。0—不允许,1—允许;
T1的定时器模式使用方法基本相同!
//定时器0初始化函数,可由ISP软件生成
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器为16位自动重装载模式,较常使用
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void main()
{
EA=1; //打开总中断
ET0=1; //打开定时器0中断
while(1);
}
//定时器0中断服务函数
void Time0_Int(void) interrupt 1 //定时器1为3
{
}
T2的使用方法略由不同。
1.定时器2的中断请求标志位对用户不可见。
2.定时器2只有16位自动重装载模式。
//定时器2初始化函数
void Timer2Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x04; //T2时钟1T模式,且为定时器模式
T2L = 0xAE; //设置定时初值
T2H = 0xFB; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
}
void mian()
{
EA=1; //打开总中断
IE2|=0x04; //打开定时器2中断
while(1);
}
//定时器2中断服务函数
void Time2_Int(void) interrupt 12 //默认中断优先级 1
{
}
//定时器0用作计数器来给脉冲计数;定时器1用来定时,每1秒计算一次频率
unsigned long freq=0;//频率
//定时器0初始化函数
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0;
TMOD |= 0x04; //设置计数器模式,P3.4/TO口每检测一次上升沿,计数器加一,16位自动重装载
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0关闭
ET0 = 1; //允许定时器0中断
}
//定时器1初始化函数
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式,16位自动重装载
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1; //允许定时器1中断
}
void main()
{
Timer0Init();
Timer1Init();
EA=1; //打开总中断
while(1)
{
if(TR0==0)
{
//读取频率
freq=freq+TL0;
freq=freq+TH0*256; //此为1秒钟测得的脉冲数,即为频率
//······
}
}
}
//定时器0中断服务函数
void time0() interrupt 1
{
freq+=65535;//T0每计到65535个脉冲即进入触发中断,脉冲数加上65535
}
//定时器1中断服务函数
void time1() interrupt 3
{
static unsigned int fcount;
fcount++;
if(fcount==1000) //每一秒钟读取一次数据
{
fcount=0;
TR0=0;
}
}