0%

51单片机定时器及其应用

简单整理并记录一些之前在玩51单片机时遇到的东西,算是一个备忘录吧。

单片机: STC89C52
开发板: HC6800-MS

定时器的寄存器

标准51单片机内有T0T1两个定时器,但现在很多51单片机还会额外增加定时器,例如STC89C52一共有3个定时器(增加了T2)。

与定时器有关的特殊功能寄存器

定时值存储寄存器

定时值存储寄存器用于存储定时器的计数值;定时器的计数值每经过一个机器周期自动加1。

名称 描述 SFR地址 复位值
TH0 T0高字节 0x8C 0x00
TL0 T0低字节 0x8A 0x00
TH1 T1高字节 0x8D 0x00
TL1 T1低字节 0x8B 0x00

定时器控制寄存器TCON

定时器控制寄存器TCON用于控制定时器的启动、停止以及标志定时器溢出和中断情况。

符号 描述 复位值
7 TF1 T1溢出标志。T1发生溢出时,硬件置1。清零方式:软件清零,或者进入定时器中断时硬件清零。 0
6 TR1 T1运行控制位。软件置1来启动定时器;软件清零来停止定时器。 0
5 TF0 T0溢出标志。T0发生溢出时,硬件置1。清零方式:软件清零,或者进入定时器中断时硬件清零。 0
4 TR0 T0运行控制位。软件置1来启动定时器;软件清零来停止定时器。 0
3 IE1 外部中断1请求标志。 0
2 IT1 外部中断1触发方式选择位。 0
1 IE0 外部中断0请求标志。 0
0 IT0 外部中断0触发方式选择位。 0

定时器模式寄存器TMOD

定时器有多种工作模式,工作模式的选择由TMOD来控制。

TMOD的位分配

注:标有T1的符号表示控制定时器T1的位,标有T0的符号表示控制定时器T0的位。

符号 复位值
7 GATE(T1) 0
6 C/T(T1) 0
5 M1(T1) 0
4 M0(T1) 0
3 GATE(T0) 0
2 C/T(T0) 0
1 M1(T0) 0
0 M0(T0) 0
TMOD的位描述
符号 描述
GATE 门控位。当GATE=0时,只要TCON中的TR0或TR1为1,就能启动相应的定时器/计数器(T0T1也可用作计数器);当GATE=1时,只有TCON中的TR0或TR1为1,且外部中断引脚INT0或INT1为高电平时,才能启动相应的定时器/计数器。
C/T 定时器/计数器模式选择位。C/T=0为定时器模式;C/T=1为计数器模式。
TMOD的M1、M0和工作模式
M1 M0 工作模式 描述
0 0 0 兼容8048单片机的13位定时器。
0 1 1 THn和TLn组成一个16位的定时器。
1 0 2 8位自动重装载模式,定时器溢出后把THn重装载到TLn。
1 1 3 禁用定时器T1,定时器T0变成两个8位定时器。

注:工作模式0现已基本不再使用;工作模式3使用频率也较少。

工作模式1:由THn和TLn组成一个16位的定时器,计数范围0~65535,溢出后,只要不对THn和TLn重新赋值,则从0开始计数

工作模式2:8位自动重装载模式,只有TLn做加1计数,计数范围0~255,THn保持原值不发生变化,TLn溢出后,TFn直接置1,并将THn的值直接赋给TLn,TLn从新值开始计数。

例:

程序运行结果:HC6800-MS开发板上编号为D8的LED以先点亮1秒后熄灭1秒的规律来循环亮灭(不太懂怎么用语言来描述这个结果 (灬ºωº灬) )

程序说明:

用作时钟源的晶振的频率为11.0592MHz(才不是呢ε(┬┬﹏┬┬)3,这块奇葩的开发板用的是12MHz的晶振(ノへ ̄、)),则时钟周期为1/11059200秒,STC89C52默认一个机器周期等于12个时钟周期,即为12/11059200秒;由x*12/11059200=0.02x=18432,即在0.02秒内经过了18432个机器周期;由y+18432=65536y=47104,即将一个定时器得初值设定为47104后,经过0.02秒(即18432个机器周期)后,该定时器溢出(65535再加1才是溢出);由z*0.02=1z=50,即在1秒内该定时器溢出50次。

假设定时器从0开始计数一直到65536溢出,定时器的最大定时值约为0.07秒,若需要实现时间更长的定时,需要灵活设定定时器初值和倍数关系。

#include<reg51.h>
sbit LED=P2^7;
void main()
{
int x; //记录T0溢出次数
TMOD=0x01; //设置T0以工作模式1运行
TH0=0xB8; //十进制数47104转换成十六进制数为B800
TL0=0x00;
TR0=1; //启动T0
LED=0;
while(1)
{
if(TF0==1) //判断T0是否溢出
{
TH0=0xB8; //对T0重新赋值
TL0=0x00;
TF0=0; //清零T0溢出标志
x++;
if(x==50)
{
x=0;
LED=~LED; //对P2^7进行取反操作,即0->1,1->0
}
}
}
}

附注

TCON的地址为0x88,可位寻址,即可单独对一个位进行操作,例如TR0=1

TMOD的地址为0x89,不可位寻址,即要操作就必须一次性对该寄存器所有位进行操作,不能对其中某一位单独进行操作,例如:把定时器1的工作模式设定为2,则对TMOD赋值00100000(二进制),表达式则为TMOD=0x20(十六进制)。