51单片机有两个16位可编程的计时器/计数器:计时器T0和计时器T1。 有计时器功能和计数功能,通过设定相关的特殊功能寄存器,可以选择启用哪个功能。 计时器系统是单片机内部的独立硬件部分,通过内部几条控制线连接在CPU与晶体振子之间并相互作用。 CPU启动计时器功能后,计时器会通过石英振动自动计时,如果计时器计数器满了,就会发生中断,通知CPU接下来要做什么。
或者计数器实质上是加上计数器(16比特),其输入脉冲有两个源,一个是将从系统时钟振荡器输出的脉冲进行十二分频后发送过来。 另外,输入T0或T1端子的外部脉冲源,1个脉冲计数器加1,计数器加1,则在输入1个脉冲时可以使计数器归零。 计数器的溢出在TCON寄存器中设置TF0或TF1,向CPU发出中断请求,如果定时或计数器在定时模式下动作,则表示定时时间已到,如果是计数,则表示计数值已满(高位8位和低位8位2个
TMOD :决定计时器/计数器模式控制寄存器(timer/countermodecontrolregister )、动作方式和功能
TCON :控制寄存器,控制T0、T1的启动停止和溢出标志的设定。
计时器/计数器模式控制寄存器TMOD是按位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 其格式为,其中的后4位定义计时器/计数器C/T0,前4位定义计时器/计数器C/T1,各位的说明:
GATE——车门控制。
GATE=1时,从外部中断端子INT0、INT1启动计时器T0、T1。 INT0端子为高电平时,TR0被设置,启动计时器T0; INT1端子为高电平时,TR1被设定,计时器T1启动。 GATE=0时,只通过TR0、TR1组分别启动计时器T0、T1。
C/T——功能选择位
C/T=0时为计时器功能,C/T=1时为计数功能。 设置时选择计数功能,清除时选择计时器功能。
M0、M1——方式选择功能
因为有两位数,所以有四种工作方法:
M1M0动作模式计数器模式TMOD (计时器模式的设定) ) ) ) ) ) ) ) ) ) ) ) )。
方式0 13位计数器TMOD=0x00
0方式1 16位计数器TMOD=0x01
1方式2自动重新加载8位计数器TMOD=0x02
方式3 T0分为两个8位独立计数器,T1为无中断重载8位计数器TMOD=0x03单片机定时器0为动作方式1设为TMOD=0x01
TCON:定时器/计数器控制寄存器(timer/counter控制寄存器) )。
TMOD分为2段,TCON控制更精细,分为4段,本文使用到高4段。 TF0(TF1 ) ——对溢出标志的位进行计数,在计数器溢出的情况下,其位置为1。
tr0(tr1 ) ——定时器运行控制位tr0(tr1 )=0停止定时器/计数器动作tr0 ) tr1 )=1启动定时器/计数器动作
ie0(ie1 ) ——外部中断请求标志位
it0(it1 ) ——外部中断请求信号方式控制位为it0 ) it1 )=1脉冲方式(后端负跳有效)
it0(it1 )=0电平方式;启用行电平)时,该位被软件设置为1或0。
TF0(TF1 ) ——计数溢出标志
如果计数器发生计数溢出,则该位由硬件设置为1。 中断服务时,硬件会自动清除为0。 计数超出的标志位的使用分为采用中断方式、作为中断请求标志位使用和采用中断方式两种。 采用查询方式时,作为查询的状态位使用。 只要注意记忆方法,理解单词的原形,就绝对不会把TF和TR混淆。 TF的f是溢出溢出的f。 TR的r是执行运行。 默认值为0,不执行。 当然请设为1之后再执行
在编写单片机定时器程序时,需要在程序开始运行时对定时器和中断寄存器进行初始化,通常的初始化过程如下。
给TMOD赋值,以确定T0和T1的工作方式
计算初始值,将初始值写入TH0、TL0或TH1、TL1;
中断方式时,给IE分配值,释放中断
设置TR0或TR1,开始计时器/计数器的定时或计数。
实现//led灯的1秒闪烁
void主() )
{
TMOD=0x01; //将计时器0设为动作模式m1m0为01 )。
th0=(65536-45872 )/256; //初始值11.0582水晶振动时间50ms数为45872
TL0=(65536-45872 ) 6;
EA=1; //总中断
ET0=1; //接通定时器0中断
TR0=1; //开始计时器0
wile(1; //程序在此停止,等待发生中断
}
voidt 0时间(中断1
{
TMOD=0x01; //重新加载初始值
th0=(65536-45872 )/256;
数字; //num每加1次判断是否达到20次
到了if(num==20 )//20次,就是1秒钟就到了
{
num=0; //num清0重新计数
led=~led1;
}
}