1. 初始化定时器
void INIT_TIM()
{
TMOD=0x01;//定时器0为工作方式1,定时器1没配置全为0
TH0=0;TL0=0;//定时器0的高八位置0低八位置0
EA=1;//开启总中断
ET0=1;//开启定时器0中断
TR0=0;//关闭定时器
}
1.1 TMOD模式寄存器
TMOD 用于控制定时器的工作模式,低4位用于 T0,高4位用于 T1。各个位的意义如下:
所在位 bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
名称 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
- M0 与 M1:共 4 中组合,对应定时器的 4 种工作模式
- M1 = 0,M0 = 0:模式0,13 位,最大计数范围 8192。TL 的低 5 位和 TH 的高 8 位组成 13 位计数器,用于兼容 48 系列一般不用。
- M1 = 0,M0 = 1:模式1,16 位,最大计数范围 65536
- M1 = 1,M0 = 0:模式2,8 位,最大计数范围 256。高 8 位放预置数,只有低 8 位参与计数。计数溢出后可以自动重新装填预置数,定时精度高。可以用于波特率发生器等精确计时场合。
- M1 = 1,M0 = 1:模式3,8 位,最大计数范围 256。此时 T0 被拆成 2 个独立的定时/计数器。其中 TL0 可以用作 8 位的定时/计数器,TH0 只能用于定时器。TH0 的控制及溢出标志借用 T1 的。一般仅当 T1 工作在模式 2 时,才会让 T0 工作在模式 3。
- C/T:设置为 0 则作为定时器使用,设置为 1 则成为计数器
- GATE:计数脉冲与定时/计数器之间的开关。
- GATE = 0 时,开关仅由 TR0 控制,TR0 = 1 时计数脉冲可以通过,否则无法通过
- GATE = 1 时,开关由 TR0 和 INT0 同时控制,仅在 TR0 = 1 且 INT0 高电平时,计数脉冲才可以通过
1.2 TCON控制寄存器
- 在用的时候可以使用
TR0=1
来开启定时器
2. 定时器计时
/*
** 函数功能:获取定时器0的计数时间
** 返 回 值:时间(单位us)
** 作 者:LJF
*/
uint GetTime0()
{
uint time=0;
/*
51单片机中一般的外部晶振为11.0592MHZ
一个时钟周期为(1S/11.0592MHZ)s
一个机械周期为12个时钟周期也就是1us,所以计数值+1则加了1us
*/
time=(TH0*256+TL0);//计数值单位us
return time;
}
2.1 机械周期
- 51单片机中一般的外部晶振为11.0592MHZ
- 一个时钟周期为(1S/11.0592MHZ)s
- 一个机械周期为12个时钟周期也就是1us,所以计数值+1则加了1us
2.2 定时器当前计时的时间
time=(TH0*256+TL0);//计数值单位us
3. 定时器中断
void Time0() interrupt 1
{
//中断服务函数,如果是定时器中断的话记得在这里重装初始,即设置:TH0和TL0的值
}