欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单片机 定时器/计数器

程序员文章站 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);