您现在的位置是:首页 >其他 >51单片机定时/计数器网站首页其他

51单片机定时/计数器

future lig 2024-10-26 12:01:03
简介51单片机定时/计数器

定时/计数器的介绍框架图如下:

 一、基本结构

1.1、工作原理:

1.当S1闭合,计数器开始计数,当计数计到最大值时(此时计数器肯定是加法计数),计数器溢出,溢出标志TF置1,计数器溢出即计数器反转,如果S2闭合还可以向CPU申请中断

 查询方式:

/************************************/
void  delay1s()
{
    unsigned  char i;
    for(i=0;i<20;i++)//循环20次,定时1s
    {
     TH1=(65536-50000)/256;//设置T1计数初值高8位,定时时间50ms
     TL1=(65536-50000)%256;
     TR1=1;//启动T
     while(!TF1);//查询计数是否溢出
     TF1=0;//清零溢出标志位
    }
}

/*****************************************/

中断方式:

/***********************************/
void  timer_1 interrupt 3   //T1的中断类型号为3
 {
   TH1=(65536-50000)/256;
   TL1=(65536-50000)%256;
   count++;
   if(count==20)//计时1s
    {
      count=0;
      miao++;
      if(miao==60) miao=0;//秒计数计到60,则从0开始计数
    }
  
 }
/***********************************/

1.2、内部组成

1.   51单片机内部有两个16位可编程定时/计数器,称为T0和T1,51单片机的定时/计数器由T0、T1、工作方式寄存器TMOD和控制寄存器TCON四部分组成

2.   工作过程:(1)设置定时/计数器的工作方式

                        (2)设置计数初值

                        (3)启动定时/计数器

                        (4)计数溢出

1.3、定时/计数器工作方式寄存器TMOD

(1)M1和M0:工作方式选择位

  

(2)C/T_:功能选择位。当为1时为计数器,为0时为定时器

(3)GATE:门控位。当为1时,硬软件共同启动,软件控制位TR0/TR1需置1,INT0(P3.2)或INT1(P3.3)为高电平才能启动相应的定时器,即允许外部中断INT0、INT1启动定时器。当为0时,软件启动,TR0/TR1置1即可启动定时器

1.4、定时/计数器控制寄存器TCON

其作用是控制定时器的启动、停止,标识定时器的溢出和中断情况

低四位用于控制外部中断,与定时/计数无关 

 二、工作方式

   1.工作方式0:13位定时/计数器,TH1/TH0高8位,TL1/TL0低5位

  2.工作方式1:16位定时/计数器,TH1/TH0高8位,TL1/TL1低8位

  3.工作方式2:8位定时/计数器,TL1/TL0

 4.工作方式3:只有T0可以设置为工作方式3,T1设置为工作方式3后不工作,T0在工作方式3时,T0被分解成两个独立的8位计数器TL0和TH0

定时器T0和 T1都可以设置为工作方式0、1和2,可以用做定时/计数功能

下面是一个控制LED灯1s亮灭的一个例程,主要是了解定时器的使用,接线方式只需将LED灯与P1.0连线即可看到现象,程序只是了解一下定时器的用法

(1)查询方式

#include <reg51.h>
sbit LED=P1^0;  
/************************************/
void  delay1s()
{
    unsigned  char i;
    for(i=0;i<20;i++)//循环20次,定时1s
    {
     TH1=(65536-50000)/256;//设置T1计数初值高8位,定时时间50ms
     TL1=(65536-50000)%256;
     TR1=1;//启动T
     while(!TF1);//查询计数是否溢出
     TF1=0;//清零溢出标志位
    }
}

/*****************************************/
void  main()
{
    TMOD=0x10;//T1设置为定时器
	TH1=(65536-50000)/256;//设定初值
	TL1=(65536-50000)%256;
	TR1=1;//启动TR1
	while(1)
	{
	   LED=~LED;
	   delay1s();
	}
}

(2)中断方式

#include <reg51.h>
sbit LED=P1^0;  
int count;

/***********************************/
  void timer_1() interrupt 3   //T1的中断类型号为3
 {
   TH1=(65536-50000)/256;
   TL1=(65536-50000)%256;
   count++;
   if(count==20)//计时1s
    {
      count=0;
      LED=~LED;
    }
  
 }
/***********************************/


void  main()
{
  TMOD=0x10;//T1设置为定时器
	TH1=(65536-50000)/256;//设定初值
	TL1=(65536-50000)%256;
	ET1=1;
	EA=1;
	TR1=1;//启动TR
	while(1);
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。