定时器配置
在使用定时器时,应该如何配置使其工作?其步骤如下(各步骤顺序可任意):
对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配置,如果使用定时器 1 即对 T1 配置。
由于实际应用较多的是方式1和2,且定时器通常用方式1,串口通信常用方式2,所以下面只介绍方式1的详细信息
方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。其结构图如下所示:
计数初值与计数个数的关系为:X=2∧(16)-N。
根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。
这里要用到辅助开发软件
例如方式一定时一毫秒计算得到fc18,则
另外也可以用2的十六次方65536减去1000(一毫秒)得到二进制fc18
如果使用中断,则对 EA 赋值,开放定时器中断。
EA相当于总开关
使 TR0 或 TR1 置位,启动定时/计数器定时或计数。
先介绍一下控制寄存器TCON
TCON 的高 4 位用于控制定时/计数器的启动和中断申请。其格式如下:
由于低四位用于控制外部中断,这里不详述。
TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效果一样。
TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时, T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。
TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同
最后附上代码用于实现定时器功能(灯以一秒的时间间隔闪烁)
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0;
void Timer0Init()
{
TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动
TH0=0XFC;//给定时器赋初值,定时 1ms 64536=FC18
TL0=0X18;
ET0=1;//打开定时器 0 中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void main()
{
Timer0Init(); //定时器 0 初始化 while(1);
}
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //给定时器赋初值,定时 1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}