×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-31 发布时间:
|

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  定时器  Timer  Tick 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码