需要使用的寄存器:TMOD(工作方式寄存器) TCON(控制寄存器)THx TLx
TMOD | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
GATE | C/T\ | M1 | M0 | GATE | C/T\ | M1 | M0 | |
T1 | T1 | T1 | T1 | T0 | T0 | T0 | T0 |
GATE = 1:定时器开始或结束仅由TCON^TRx与外部中断引脚的电平共同控制(INTx = 1 && TRx = 1 时开始计数)
C/T\: C/T\ = 0:定时器模式
C/T\ = 1:计数器模式
M1 | M0 | 工作方式 |
0 | 0 | 13 bit Timer&Counter |
0 | 1 | 16 bit Timer&Counter |
1 | 0 | 8 bit自动重装C/T |
1 | 1 | 仅用于T0:两个8位自动重装C/T;若在T1模式下则停止 |
TCON | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
TRx: 定时器开始计数控制位
IEx: 外部中断请求标志
ITx: 外部中断触发方式:ITx = 0(电平触发,低电平时可使IEx = 1,导致自动进入中断程序)
ITx = 1(下降沿触发,可使IEx = 1,导致自动进入中断程序,进中断后IEx自动清零)
(1)1机器时间 = 12振荡周期;计数值 * 机器周期 = 定时时间
(2)检测一个下降沿需要至少2机器周期,所以被采样电平必须维持至少一个机器周期
(3)THx TLx 初值为0
编程步骤:
(1)设置TMOD
(2)装计数初值
(3)开中断
(4)开定时器
代码:
void timmer_init()
{
TMOD = 0x11;
TH1 = (65536-46080)/256; //50ms
TL1 =(65536-46080)%256;
ET1 = 1; //T1 interrupt
EA = 1; //all interrupt
TR1 = 1; //start
}
void t1_interpt() interrupt 3
{
TH1 = (65536-46080)/256; //50ms
TL1 =(65536-46080)%256;
count50ms++;
if(count50ms >= 20)
{
count++; //1s
if(count >= 100)
{
count = 0;
}
count50ms = 0;
}
}
P.S:记得使用方式0、1时,在中断中装计数初值