单片机 定时器/计数器

单片机 定时器/计数器

一、简述

    MCS—51系列单片机内部有两个16位定时器/计数器,即定时器T0和定时器T1。它们都具有定时和计数功能,可用于定时或延时控制,对外部事件进行检测、计数等。

    定时器/计数器是一个加“1”计数器,来一脉冲即做加1计数,直至寄存器各位全为1,再来一脉冲,计数器回0且使TF0(定时器T0)TF1(定时器T1)置1表示定时时间到,计数值乘以单片机的机器周期就是定时时间。

     计数器:工作在方式1,可以从0数到65536(2的16次方),超过65535产生中断;如果想要数10000个数,可以设置计数器的初值为55536,这样从初值55535数到65535就是10000个数。

     计数器又叫定时器:晶振产生脉冲信号,一个脉冲信号过来,计数器就数1,频率高,产生脉冲信号就快,计数器数数就快,计数器每数了一个数说明过去了xx秒,那么让计数器数10000个数,对应过去了10000乘以xx秒。这样我们想要在10秒之后做某件事情,设置好计数器初值(设定计数器要数多少个数)、设置好频率(确定产生一个脉冲的时间),计数器数到65535之后,产生溢出信号、引起中断,然后执行中断服务(可以是我们自己编写的中断函数)。

      如:频率是12MHZ,也就是1秒可以产生12000000个脉冲,也就是1秒可以数12000000个数。如果设置计数器的初值为65524(65535-12),也就是数12个数。数12000000个数用时1秒,那么数12个数用时12/12000000=0.000000.1秒=1微秒。(1秒=1000000微秒),想要定时1ms,那么可以让计数器数12000个数,设置计数器的初值为65535-12000=53535。

二、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);

 

 

展开阅读全文

没有更多推荐了,返回首页