51定时器总结,初值装载计算方法

目录

  • 51单片机定时器的寄存器
  • 20ms定时的初值装载计算
  • #define FOSC (11059200L) 中的L是什么?
  • STC89C52定时器的数量

定时器是单片机中常用的功能,计数、定时、捕获等功能都离不开它。如何计算定时器的初值呢?
#define FOSC (11059200L) 中的L是什么?
这篇文章中我们来简单看一下这些问题。本文以51单片机为例阐述。

51单片机定时器的寄存器

(1)工作模式的设定
51定时器的工作模式可以通过寄存器TMOD设置:
在这里插入图片描述
TMOD寄存器的低四位用于T0,高四位用于T1。
GATE:门控位,用于设置计数器是否受P3.2或P3.3电压的影响。
C/T:定时/计数模式选择。0:定时模式;1:计数模式。
M1,M0:工作方式设置位。(51定时器共有四种工作方式)

(2)初值的装载
定时器的基本原理是:通过计数来计算时间,一旦超出了最大的数值就产生中断。51单片机的最大值是固定的(65535)。因此,为了设置预期的定时时间,需要对51定时器装载初始值。基础款的51有两个定时器,定时器0的初值寄存器为TH0和TL0寄存器(定时器1的为TH1和TL1)。

20ms定时的初值装载计算

假设使用的晶振频率为11.0592MHz
因此在许多很好的代码中我们会看到这样的宏定义:

#define FOSC (11059200L)
#define FCLK (FOSC/12)  //用于计算指令周期
//设20ms定时共需要P个指令周期,现在求P的数值:
//P/FCLK*1000=20
//因此可以在C语言中做如下运算:
unsigned long int P;
P=20*FCLK/1000//注意:不要这么写,建议P=20*(FCLK/1000) 原因见下一小节
//求得20ms共需的P个定时周期后,就可以计算TH0,TL0的数值了:
     TH_0=(65536-P)/256;
     TL_0=(65536-P)%256; 
//然后开启定时器,开启中断之后就可以在中断函数中写自己需要的代码即可了。
void T0_ISR() interrupt 1
{
//略
}

#define FOSC (11059200L) 中的L是什么?

L代表长整型数据。
另外,我们注意到在上面所定义的周期数P,也采用了无符号长整型数据,这是为了防止计算时的中间值溢出。例如在这一句:

P=20*FCLK/1000//20*FCLK就是个很大的数值,
//为此我们不仅将P定义成无符号长整型,还做如下改进:
P=20*(FCLK/1000)

STC89C52定时器的数量

最基础的51有2个定时器,STC89C52是升级版,有3个定时器。推荐使用T2作为串口波特率的定时器,T0,T1可以用在其他的计数和定时功能上。

水平有限,请多指教,欢迎大家有项目一起交流

作者:伏熊 (专业:射频芯片设计、雷达系统。 爱好:嵌入式。)

你可能感兴趣的:(嵌入式软硬件设计)