5.2 定时器的学习
5.2.1 定时器的基本认识
首先,时钟周期与机器周期是两个不同的概念
时钟周期:晶振是11.0592Mhz,时钟周期为1/11059200s
机器周期:在51标准架构下,一个机器周期是12个时钟周期,即12/11059200s
注意:定时器与计数器其实是单片机内部的同一个模块,通过配置SFR来实现切换
5.2.2 定时器的寄存器
标准51单片机中有两个定时器:T0和T1
定时器需要有特殊功能的寄存器来控制即SFR来控制(这些寄存器与P0相同,都是SFR,里面也都有8位,也都有自己的地址)
以下的寄存器名字,地址以及功能不需要背会,只需在datasheet上查找即可
存储定时器计数值的寄存器:
对于0定时器,有两个八位的寄存器,第一个LOW满了255以后就去TH(high)进一,知道65535溢出
TCON:控制定时器的寄存器:
对于定时器0:TR0=1意味着定时器每经过一个机器周期就要++
TR0=0意味着定时器停止加一
TF0是一个标志位,当TH0和TL0都达到255时候加一溢出,TF0变成1,指示溢出了
TMOD:定时器模式寄存器:
TMOD这个sfr里有8位,4位是定时器0的,4位是定时器1的
GATE位是门控,下面再说
C/T位可以选择计数器与定时器的切换,一般我们研究定时器都置0
M0和M1这两位来决定工作模式,其中0和3几乎不用,不说
当01时:是一个16位定时器
当10时:有重装功能的8位定时器,当TL到溢出时候,TF(就是TCON里的溢出标志)直接置1
TH里的结果直接copy到TL里面,TL从这个重装以后的结果开始计时
注意:TCON是可以选取其中的一位去赋值,而TMOD不可位寻址去赋值,只能对于这个sfr整体赋值
用这张图来总结一下:开关左边的C/T控制:是计数器还是定时器
下面控制了定时器的开关:首先TR必须取1
然后如果GATE取0那么一定开关导通
如果GATE取1且INT脚取1才能使得开关导通
5.2.3 定时器的应用
要应用定时器使得可以准时去计时,下面是用定时器实现1s闪烁的代码
#include "reg52.h"
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned int cnt;
ENLED=0;//这些74HC138的使得LED可以正常变亮的照旧
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
TMOD=0x01;//对工作模式赋值,我们只用了定时器0这一个,它的工作模式为1,即16位定时器
TH0=0xB8;//对寄存器赋一个初值0xB800,实现了0.02s的计时
TL0=0x00;
TR0=1;//启动计时
while(1)
{
if(TF0==1)//当到65535溢出时候
{
TF0=0;//先将溢出标志改了
TH0=0xB8;//再次赋初值
TL0=0x00;
cnt++;//计数
if(cnt>=50)//当达到50个0.02s也就是1s时候
{
cnt=0;
LED=~LED;//取反
}
}
}
}