单片机 定时器/计数器
程序员文章站
2022-06-09 19:01:18
...
单片机 定时器/计数器
一、简述
MCS—51系列单片机内部有两个16位定时器/计数器,即定时器T0和定时器T1。它们都具有定时和计数功能,可用于定时或延时控制,对外部事件进行检测、计数等。
定时器/计数器是一个加“1”计数器,来一脉冲即做加1计数,直至寄存器各位全为1,再来一脉冲,计数器回0且使TF0(定时器T0)TF1(定时器T1)置1表示定时时间到,计数值乘以单片机的机器周期就是定时时间。
二、TMOD控制寄存器
GATE=1时,“与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx·INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。
当INT0引脚为高电平时且TR0置位,TR0=1;启动定时器T0;
当INT1引脚为高电平时且TR1置位,TR1=1;启动定时器T1。
GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。
三、TCON控制寄存器
设定好了定时器/计数器的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。
设定好了定时器计数器/的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。控制寄存器TCON每位的含义:
TF1:定时器T1溢出标志位。当定时器T1溢出时,由硬件自动使TF1置1,并向CPU申请中断。CPU响应中断后,自动对TF1清零。TF1也可以用软件清零。
TR1:定时器T 1运行控制位。可由软件置1(或清零)来启动(或关闭)定时器T1,使定时器T1开始计数。用指令SETB TR1(或CLR TR1)使TR1置1(或清零)。 TF0:定时器T0溢出标志位。其功能与TF1相同。 TR0:定时器T0运行控制位。其功能与TR1相同。 IE1:外部中断1请求标志位。 IT1:外部中断1触发方式控制位。 IE0:外部中断0请求标志位。 IT0:外部中断0触发方式控制位。 IE1、IT1、IE0、IT0这4位将在第3节讲述。 控制寄存器TCON的位地址是88H,可以对它进行位寻址。 |
四、初值计算
机器周期:
时钟周期(振荡周期) = 1秒/晶振频率 (T = 1/f)
机器周期 = 12*振荡周期
机器周期 = 12秒/晶振频率
如果系统晶振频率为12M,那么机器周期=1us
五、例子
定时函数
void Delay1ms(unsigned int count)
{
unsigned int i;
TMOD=0x01; //选用定时器0且工作在方式1
TH0=0x3c; //设置初值0x3cb0
TL0=0xb0;
TR0=1; //开启定时器
for(i=0;i<count;i++) //循环count次,每次定时50ms,总共count*50ms
{
while(TF0!=1);// 每次定时50ms (溢出时才会跳出循环)
TH0=0x3c; //重置初值0x3cb0
TL0=0xb0;
TF0=0; //软置溢出位
}
TR0=0; //关闭定时器
}
定时1s:Delay1ms(20);