pic单片机timer0怎么用啊?

比如我想具体定时多长时间如 50微妙 或者100微妙
2025-03-22 06:46:04
推荐回答(2个)
回答1:

实例说明:

   假设时钟周期为4MHZ,每隔50MS点亮LED,每隔50MS灭掉LED。这样的程序要如何做到呢。

   这50ms如何做到.

  1,得到指令周期

    4MHz/4=1MHz  

    1/1MHz=0.0000001s=1us

  2,得到预分频

       定时器定时的最大时间要超过这50mS,所以预分频器要选择256

       预分频X256=最大的定时时间。256X256=65536us=65.536ms 大于50ms

 3,  计算定时器初始值

    (定时器最大值+1)- (定时时间/预分频)=定时器的初始值。

    255+1=256

    50000/256=195.3125

    256-195.3125=60.6875 四舍五入 定时器初始值为61.

设置相关的寄存器。

  OPTION_REG寄存器中我们一般需要设置三处。

  PS<2:0>设置用来设置预分频预分频范围从2 ~256

  PSA设置成0   讲预分频器分配给Timer0模块

  TMR0CS设置成0 内部指令周期时钟。

实例程序:

/*开发环境 MPLAB X IDE 型号PIC16LF1823*/

#include  
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF

                                                   &BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
__CONFIG(PLLEN_OFF&LVP_OFF) ;
#define LED  LATA5/*也可用 #define LED RA5,只是PIC16LF1823 输出电平的时候,直接控制LATA5执行速度更快,因为传给RA5的数据最终也是传给LATA5才执行的*/
void init_fosc(void)
{
    OSCCON= 0x68;//时钟设置为4MHz
}
void init_gpio(void)
{
    PORTA = 0;
    LATA = 0;
    ANSELA = 0;
    TRISAbits.TRISA5=0; //RA5口设置成输出 用来控制LED
}
void init_timer0(void)
{
    OPTION_REG=0x87; //预分频为256
}
int main(int argc, char** argv)
{
    init_fosc();
    init_gpio();
    init_timer0();
    TMR0IF=0;//清除TMR0中断标志位
    TMR0=61;//设置中断初始值61
    while(1)
    {
        if(TMR0IF==1)//定时时间到了吗??
        {
            LED = ~LED;//改变LED的状态
            TMR0IF=0;//清除TMR0中断标志位
            TMR0=61;//设置中断初始值61为下次50ms定时做准备

        }


    }


}


  

   

回答2:

先看你振荡频率是多少了。比如:4MHz晶振的话,执行一条命令就是1us,50us就是50句,不设置预分频器的话,只要在设置TMR0的时候置初值256-50+2=208,+2为补偿同步延时的两个指令周期。建议看看张明峰的PIC单片机入门与实战,很详细。