PIC单片机之定时器(TMR1)

            之前我们讲解了TMR0定时器,现在我们来讲解16位定时器TMR1,TMR1和TMR0最大的差别就是TMR1是16位定时器。所以TMR1两个八位寄存器 TMRH 和TRMRL组成.许多有关定时器的基础知识我就不在赘述了可以看TMR0的文章。我单刀直入讲实例了。

实例讲解:如果我们想隔0.5S输出个高电平,0.5S输出个低电平那要怎么做呢?

首先:先选择合适的时钟频率和预分频。这个只要满足需要的延时时间就行了。这里我们选择时钟为4MHZ,预分频为1:8;

然后:设置TMR1定时器的初始值,初始值的作用即是设置TMR1的溢出时间,(设置溢出时间的原因是)

比如在初始值为0的情况下,定时器需要经过524288us的时间才溢出,

如果初始值为3036,定时器就在这个值的基础上一直加上去,需要的时间为0.5s才溢出。

这个的时间是怎么计算出来的呢,最长的定时时间-需要定时的时间=初始值的时间。524288us-500000us=24288us.

初始值的时间/预分频器溢出的周期=初始值 24288us/8us=3036.将其转换为十六进制为0x0BDC将高位存入TMR1H寄存器,将低位存入TMR1L寄存器。

程序如下: TMR1H=0x0B;

                      TMR1L=0xDC;

指令周期x预分频比=预分频器溢出的周期  1usX8=8us

时钟周期x4=指令周期  0.25usX4=1us.详见上图。

这只是我个人理解方式有兴趣的朋友可以看看:

      我们可以将分频器,寄存器,还有溢出中断标志这几个名词完全不一样的东西理解成同一个22位寄存器。

下面是一个由4分频,8分频TMR1L,TMR1H,TMR1IF组成的一个22位寄存器。定时就是该寄存器对时钟周期的计数。

该表格的值是TMR1H刚溢出TMR1IF为1时的数值。二进制数10000,0000,0000,0000,0000,0代表的十进制为2097152,2097152×0.25us=524288us 


初始化设置 T1CON:TIMER1控制寄存器

我重点要设置就是设置预分频比,和开启TMR1其他默认为0就行了。T1CKPS<1:0>设置为11,TMR1ON设置为1,。

所以设置 T1CON = 0x31; //enable TIMER1 ,1:8

实例程序:

#include<pic.h>

__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON

                         &FCMEN_ON&IESO_ON&CLKOUTEN_OFF);
__CONFIG(PLLEN_ON&LVP_OFF);

#define TMR1H_value  0x0B

#define TMR1L_value  0xDC

#define true 1

#define false 0

#define LED LATA5

unsigned int timer1_counter;

void init_timer1()
{
    T1CON = 0x31; //enable TIMER1 ,1:8
}

void init_time1_count() //设置以0.5S为单位的延时初始化设置

{

   TMR1H= TMR1H_value;
    TMR1L= TMR1L_value;
    TMR1IF = 0;
    timer1_counter=0;

}

/*以0.5S为单位 limit  的数代表延时几个单位。

 比如limit=3那么就是延时1.5S。时间到了函数返回 true ,时间没到返回 false

*/

unsigned char time1_count(unsigned int limit)
{
    if(PIR1bits.TMR1IF == 1 )
    {
        timer1_counter++;
        TMR1H=TMR1H_value;
        TMR1L=TMR1L_value;
        TMR1IF=0;
    }
    if(timer1_counter >= limit)
    {
      return true;
    }
    else
    {
        return false;
    }
}

 void init_fosc(void)

{

 osccon = 0x68;//4mhz

}

void init_gpio(void)

{

   PORTA =0;

  LATA =0;

 ANSELA =0;

 TRISAbits.TRISA5=0;//RA5设置成输出 用来控制LED

}

void main(void)

{

  init_fosc();

  init_gpio();

  init_timer1();

  while(1)

  {

   LED = 1;//LED灯亮

     init_time1_count()//初始化定时初始值

    while(time1_count(1)==false)//延时0.5s

     {

      /*这里面可以写一些定时期间需要执行的程序*/

     }

   LED = 0;//LED灯灭

      init_time1_count()//初始化定时初始值

    while(time1_count(1)==false)

     {

     }

  }   

}










  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个基于PIC单片机定时器T2计时5秒的示例代码: ```c #include <xc.h> #pragma config FOSC = INTOSCIO //内部振荡器 #pragma config WDTE = OFF //看门狗定时器关闭 #pragma config PWRTE = OFF //电源复定时器关闭 #pragma config MCLRE = OFF //MCLR引脚功能关闭 #pragma config CP = OFF //程序保护关闭 #pragma config LVP = OFF //低电压编程关闭 void main(void) { OSCCON = 0b01110000; //内部振荡器设为8MHz T2CON = 0b00000111; //定时器T2预分频器为1:16,使定时器时钟频率为8MHz/16=500kHz PR2 = 124; //设定T2的重载值为124,使TMR2计数至125时产生1ms的中断 TMR2 = 0; //清零T2计数器 INTCONbits.GIE = 1; //开启全局中断 INTCONbits.PEIE = 1; //开启外设中断 PIE1bits.TMR2IE = 1; //开启T2中断 T2CONbits.TMR2ON = 1; //开启T2定时器 while (1) {} //等待T2计时完成 } void interrupt isr(void) { if (PIE1bits.TMR2IE && PIR1bits.TMR2IF) { //检查T2中断标志 PIR1bits.TMR2IF = 0; //清除T2中断标志 static unsigned int count = 0; //定义一个静态变量count,用于计数 count++; //每次中断count自增1 if (count >= 5000) { //当count累计到5000时,T2计时5s T2CONbits.TMR2ON = 0; //关闭T2定时器 //T2计时5s的代码放在这里 } } } ``` 代码中使用了定时器T2来计时5秒,定时器T2的时钟频率为500kHz,重载值为124,因此每计数至125时产生1ms的中断。在中断服务程序中,定义一个静态变量count用于计数,每次中断count自增1,当count累计到5000时,T2计时5s结束。在T2计时5s的代码中,可以实现相应的功能,例如点亮LED等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值