51单片机有2个16位定时器/计数器:T0,T1。
定时器:没经过一个机器周期,寄存器加1。当寄存器装满的时候移除.
TH存放高8位,TL存放低8位;最高能计到65535(十进制),能计65536次。
如:晶振为11.05926MHz
一个机器周期(一个机器周期有12个时钟周期组成)的时间为 :
(1 / 11.05926)×12 ≈ 1.085 微秒
计满的时间为:1.085 × 65536 ≈ 71毫秒
定时器的控制寄存器
TCON地址为0x88
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
0~3位用来控制外部中断。
TF:定时器溢出标志。溢出时该位自动置1。中断执行时硬件清0或软件清0
TR:定时器运行控制位。置1开始计时,清0停止计
定时器的工作模式寄存器
TMOD地址0x89
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
符号 | T1 | T1 | T1 | T1 | T0 | T0 | T0 | T0 |
GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
工作模式设置位M1,M0
00 | 01 | 10 | 11 |
---|---|---|---|
模式0 | 模式1 | 模式2 | 模式3 |
模式1:16位的计数器,定时器1初值存放寄存器TH1,TL1。定时器0初值存放寄存器TH0,TL0。
模式2:自动装载8位计数器。主要应用在串口波特率发生器。
GATE:门控位
C/T:计数模式/定时模式,为0则为定时模式。
使用定时器步骤
1、设置定时器工作模式寄存器TMOD
2、设置计数寄存器的初值
3、设置定时器控制寄存器TCON
代码示例(LED灯一秒闪烁):
#include<reg52.h>
#define uchar unsigned char
sbit LED1 = P1^0;
uchar counter = 0;
void main()
{
TMOD = 0x10; //定时器 工作模式1
TH1 = 0x4b;
TL1 = 0xfe;//定时50ms
TR1 = 1; //启动定时器
while(1)
{
if(TF1 == 1)
{
TF1 = 0;
TH1 = 0x4b;
TL1 = 0xfe;//定时50ms
counter ++;
}
if(counter == 20) //1秒
{
counter = 0;
LED1 = ~LED1;
}
}
}