一、简介
有三个寄存器与定时器相关(TMOD,TCON,数值设置寄存器TH TL)
1、定时器工作方式设置寄存器TMOD
GATE: 门控制位 | GATE=0时,定时器/计数器启动与停止仅受TCON寄存器中的TRX(X=0/1)来控制. =1时,由TCON寄存器中的TRX和外部中断引脚(INT0或INT1)上的电平共同控制. |
C/T: 定时器模式和计数器模式选择位 | C/T=1时为计数器模式 C/T=0时为定时器模式 |
M1,M0: 工作方式选择位(M1在左) | 00方式0,16位自动重装; 01方式1,16位; 10方式2,8位自动重装载; 11方式3,不可屏蔽中断的16位自动重装定时器; |
2、定时器(中断)与外部中断设置寄存器TCON
定时器/计数器 和 外部中断 控制寄存器。字节地址为88H,可以位寻址
TF1: | 当定时器1计满溢出时,由硬件自动将TF1置1,并申请中断;进入中断服务程序后,由硬件自动清零。 使用软件查询方式的话,查询到该位置1后,就需要用软件(写代码)清零 |
TR1: | TR=1表示启动定时器,需要配合GATE和INT1 当GATE=1,且INT1为高电平时,TR1置1启动定时器1 当GATE=0时,TR1置1启动定时器1 |
TF0: | 定时器0溢出标志位,功能和用法同TF1 |
TR0: | 定时器0运行控制位,功能和用法同TR1 |
二、应用
一般使用STC-ISP软件进行定时器的初始化设置,并简单修改(1初值 2设置ET EA)
1、50ms产生一次中断(50ms执行一次中断函数中的程序)
void Timer0Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0=1;
EA=1;
TR0 = 1; //定时器0开始计时
}
void Timer0_serve(void) interrupt 1
{
}
2、定时器延时应用(以延时3s为例)
通过TR0对定时器进行开关控制
void Timer0Init(void) //30毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xD0; //设置定时初始值
TH0 = 0x8A; //设置定时初始值
TF0 = 0; //清除TF0标志
//TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
unsigned char j;
void Timer0_serve(void) interrupt 1
{
j++;
if(j==100) //达到3s定时
{
j=0;
//
TR0 = 0;
}
}
void template()
{
if()
{
//
TR0 = 1; //定时器0开始计时
}
}
NOTES:
1、选择12T的原因
12T定时时间更长(在16位自动重载模式下可最大定时71ms);1T定时器在16位自动重载模式下可最大定时5ms。两种周期下的精度都可至 1us。且实际应用中一般用到50ms 10ms定时比较多。选择12T可直接定时50ms,故选择12T的周期是更合适的。
2、定时器初值的计算(以晶振12M,16位模式,定时10ms为例)
10ms=10000us
65536-10000=55536(d8f0)
TH0=0xd8,TL0=0xf0
3、设置TMOD时,先后的赋值方式
TMOD = 0x04; //设置定时器0计数器模式
TMOD &= 0x0f; //设置定时器1 16位自动重装载模式
由stc15的库文件中可以看到,TMOD的复位值为0000,0000
故TMOD &= 0x04; 是无效的赋值方式
(stc15.h ↓ ↓ ↓ ↓)
▲文中不足之处请大家指正