51单片机定时器

TMOD:定时器/计数器模式控制寄存器

 

51单片机定时器_第1张图片

51单片机定时器_第2张图片

Ⅰ,GATE——门控制。

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直接控制定时器的启动和停止。

TR0=1,启动定时器T0。

TR1=1,启动定时器T1。

Ⅱ,C/T——功能选择位

C/T=0时为定时功能: 加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;

C/T=1时为计数功能: 加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;

Ⅲ,M0、M1——方式选择功能

MCS-51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3。

MCS-51的定时器T1有3种工作方式:方式0,方式1,方式2。

51单片机定时器_第3张图片

 

 

 

TCON:定时器计数器控制寄存器

在特殊功能寄存器中能够进行位操作,很方便

 

作用:控制定时器计数器的起停,标志定时器的溢出和中断情况

TF1:定时器1的溢出标志位,中断时硬件自动清零,查询时应该软件清0TR1:定时器1的运行控制位,软件值0关闭定时器1(当GATE=1,INT1为高电平且TR1=1时启动定时器1。或者,GATE=0,TR1=1启动定时器1)

TF0:

TR0:

IE1:外部中断1请求标志位

IT1:外部中断1触发方式选择位。0:低电平触发  1:下降沿触发

IE0:

IT0:

定时器计数器初始化步骤:

1.确定工作方式(对TMOD赋值)

2.预置定时器/计数器的初值(直接将初值写入TH0,TL0或TH1,TL1)

3.根据需要开放定时器/计数器的中断(直接对IE位赋值)

4.启动定时器计数器

 

定时器/计数器初值的计算方法:

方式0:M=2 *13=8 192

方式1:M=2*16=65 536

方式2:M=2*8=256

方式3:定时器0分成两个8位计数器,所以两个M均为256。

因为定时器/计数器是作“加1”计数,并在计数满溢出时产生中断,因此初值X可以这样计算:

在计数方式下:X=M-计数值

在计数方式下:X=M-计数值

在定时方式下:X=M-定时值/机器周期

一个机器周期=12*时钟周期

时钟周期=1/f

所以:机器周期=12/f  即12个脉冲为一个机器周期

#include <reg52.h>
#include <absacc.h>

sbit R0=P1^0;
sbit R1=P1^7;

unsigned int t0=0,t1=0,m0=0,m1=0;


//工作方式0:最大定时计数=2^13=8192
//工作方式1:最大定时计数=2^16=65536
//机周时间=12/fosc    12MHz:1us; 6MHz:2us;
//TH&TL:T初值=(工作方式最大计值)-定时时间/机周时间;
void Time0_init() //计时 
{
 TMOD|=0x01;    //T0方式1  
 TH0=(65536-0)/256;    //
 TL0=(65536-0)%256;
 EA=1;          
 ET0=1;
 TR0=1;
}

void Time1_init() //计时 
{
 TMOD|=0x10;    //T1方式1  
 TH1=(65536-0)/256;    //
 TL1=(65536-0)%256;
 EA=1;          
 ET1=1;
 TR1=1;
}

  
main()
{
 Time0_init();
 Time1_init();
 P1=0XFF;
 while(1)
 {
  //P1=~t0;
 }
}


void Time0() interrupt 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256; 
 t0++;
 if(t0==10) 
 {
   t0=0;m0++;
 }
 //if(t0%5==0)
 R0=~R0;
} 
void Time1() interrupt 3
{
 TH1=(65536-10)/256;      
 TL1=(65536-10)%256; 
 t1++;    
 if(t1==10) 
 {
   t1=0;m1++;
 }
 //if(t1%5==0)
 R1=~R1;
}

你可能感兴趣的:(定时器)