定时器/计数器
- 定时器/计数器 和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
工作原理
- 定时器/计数器 实质上是一个 加1计数器。它随着计数器的输入脉冲进行加1,当计数器发生溢出时,则向CPU发出中断请求,如果是定时模式,则表示定时时间已到,计数模式,则表示所计数值已满。
结构
它由高8位和低8位两个寄存器THx和TLx 组成。
TMOD是定时器/计数器的工作方式寄存器,即控制它的工作方式。
TCON是控制T0/T1的启动和停止及设置溢出标志。
控制
- 两个特殊功能寄存器
1、工作方式寄存器TMOD
注:TOMD不可位寻址
- ①GATE :门控位,GATE=0 时,只需要TR0/TR1 为1,就可使定时器/计数器工作;GATE=1 时,不仅要满足TR0/TR1 为 1 ,同时还需外部中断引脚 INT0/1 也为高电平,才能启动定时器/计数器工作。
- ②C/T :定时/计数模式选择位。C/T=0 为定时模式;C/T=1 为计数模式。
- ③M0M1 :工作方式设置位。
M1M0 | 工作方式 | 功能说明 |
---|---|---|
00 | 方式0 | 兼容8048单片机的13位定时器,THx的8位和TLx的5位组成一个13位定时器。 |
01 | 方式1 | THx和TLx组成的一个16位定时器/计数器 |
10 | 方式2 | 自动重装初值的8位定时器/计数器 |
10 | 方式3 | 定时器0:分成两个8位定时器/计数器。 定时器1:停止计数 |
2、控制寄存器TCON
- 这些位在上次的中断系统中有写
工作方式
1、方式0
-
由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
-
这个模式51单片机一般很少用
2、方式1
由TL0作为低8位,TH0作为高8位,组成了16位加1计数器
计数范围是0~65535 ,溢出后,只要不重新赋值,则从0开始计数
3、方式2
- 只有TLx做加1计数,计数范围是0~255 ,THx的值并不发生变化,而是保持原值,TLx溢出后,TFx就直接置1了,并且THx原先的值直接赋给TLx,然后TLx从新赋值的这个数字开始计数。(该功能可以用来产生串口的通信波特率,即适合做脉冲信号发生器)
4、方式3
- 只适用于定时器/计数器T0,定时器T1处于方式3相当于TR1=0 ,停止计数
使用
- 设置特殊功能寄存器TMOD,配置好工作模式
- 设置计数寄存器THx和TLx的初值(初值之类的直接用软件计算吧)
- 设置TCON,通过TRx置1来让定时器开始计数,还有中断开关EA 、ETx
- 判断TCON寄存器的TFx位,监测定时器溢出情况。
定时器0程序
#include "reg52.h"
typedef unsigned int u16;
sbit led=P2^0; //定义P20口是led
void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。(不影响其它位)TMOD=TMOD|0X01
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void main()
{
Timer0Init(); //定时器0初始化
while(1);
}
void Timer0() interrupt 1 //定时器0中断程序
{
static u16 i;//设置一个静态全局变量
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}
- 在51单片机中,应用较多的是方式1和方式2,而要注意到是方式1在使用时,一定要记得重装初值 ,我刚开始时就是忘记重装初值,程序的效果老是不对
完成~