C51 定时器Timer使用,及产生1ms系统Tick

C51 定时器Timer使用,及产生1ms系统Tick_第1张图片

GATE=0用TR0和TR1来控制T1和T0的启动,GATE=1则用外部中断来控制。

C/T为0表示定时器模式。为1表示计数器模式,对T0或T1的外部负跳变脉冲计数。

定时器初值的计算:

TH0 = (65536 - (24/12) * 1000)/256; //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536 24Mhz晶振 1000um = 1ms
TL0 = (65536 - (24/12) * 1000)%256;

THX=(2^定时器位数 - (晶振频率/12) * 定时时间um) / 256;
TLX= (2^定时器位数 - (晶振频率/12) * 定时时间um) % 256;

注意:记得开总中断 EA = 1;

#include 
#include 
#include 
#include 
#include 

static unsigned long SysTick = 0;
static unsigned long preTime = 0;


/***********************************************************
*       系统毫秒延时
*
************************************************************/
void mdelay(u8 m)
{
    preTime = (unsigned long)(m + SysTick);
    while(preTime > SysTick)
    {
        _nop_();    
    }   
}

/***********************************************************
*       系统秒延时
*
************************************************************/
void sdelay(u8 s)
{
    preTime = (unsigned long)((s * 1000) + SysTick);
    while(preTime > SysTick)
    {
        _nop_();    
    }
}

void Timer0_Init(void)
{
    TMOD |= 0x01;  //定时/计数器工作在方式 1;

    TH0 = (65536 - (24/12) * 1000)/256;   //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536  24Mhz晶振 1000um = 1ms 
    TL0 = (65536 - (24/12) * 1000)%256;
    ET0 = 1;  //允许定时/计数器0 中断
    TR0 = 1;  //启动定时/计数器0 中断
}

void main()
{
    Timer0_Init();
    while(1)
    {
        P0 = !P0;
    }
}

/********************************************************************
*
*   Timer0 用于产生系统时钟滴答 1ms为周期
*
********************************************************************/
void Timer0_ISR (void) interrupt 1
{
    TH0 = (65536 - (24/12) * 1000)/256;   //65536 Timer0 M1=0,M0=1 工作在模式1,16位定时/计数器,2^16=65536  24Mhz晶振 1000um = 1ms 
    TL0 = (65536 - (24/12) * 1000)%256;
    SysTick++;
}

Timer2使用:

/*-----------------------------------------------
  名称:定时器2
  论坛:www.doflye.net
  编写:shifang
  日期:2009.5
  修改:无
  内容:通过定时让LED灯闪烁
------------------------------------------------*/
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED=P1^0;    //定义LED端口


/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void TIM2Inital(void)
{
  RCAP2H = (65536-(12/12)*1000*60)/256;//晶振12M 60ms 16bit 自动重载
  RCAP2L = (65536-60000)%256;
  ET2=1;                     //打开定时器中断
  EA=1;                      //打开总中断
  TR2=1;                     //打开定时器开关
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
 TIM2Inital();
 while(1);
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void TIM2(void) interrupt 5 using 1//定时器2中断
{

    TF2=0;
    LED=~LED;               //指示灯反相

}

你可能感兴趣的:(C51)