cc2530-时钟1(timer1)模模式

2019-04-13 12:36发布

原链接      http://blog.163.com/a_hui8/blog/static/2058303072012628105311873/
模模式需要开启通道0的输出比较模式,否则计数器只有到了0XFF时才会产生溢出中断(相应的产生溢出标志),也就是如果没有设置通道0的输出比较模式,计数器的值到达T1CC0后,不会产生溢出中断(相应的溢出标志不会置1),这点需要特别注意。
记得把TICCTL0的IM位打开!!!!   否者中断请求被屏蔽 #include
#define LED1 P1_0   //定义LED1为P1.0  
#define S1   P0_1   //定义S1为P0.1 void INIT_LED(void)
{
  P1SEL &= ~0x01;   //设P1.0为普通I/O功能
  P1DIR |= 0x01;    //设P1.0为输出方向
  LED1 = 0;         //将LED1点亮
} void INIT_IO(void)
{
  P0SEL &= ~0x02;     //设P0.1(S1)为普通I/O功能
  P0DIR &= ~0x02;      //设P0.1(S1)为输入
  P0IFG &= ~0x02;      //设P0.1(S1)状态标志寄存器清零
  P0IEN |= 0x02;          //设P0.1(S1)中断使能
  IEN1 |= 0x20;            //开P0中断
  EA = 1;                     //总中断EA为中断使能
} void INIT_Timer1()

  T1CTL = 0x00;           //1分频、停止运行
  T1CCTL0 |= 0x04;      //设定timer1通道0输出比较模式
  T1CC0L = 0x24;
  T1CC0H = 0xF4;
  IRCON &= ~0x02;
} //P0.1(S1)中断处理函数
#pragma vector = P0INT_VECTOR 
__interrupt void P0_ISR(void) 

    if((P0IFG&0x02) == 0x02)     //P0.1(S1)状态标志寄存器触发  (P0IFG的值为0XFF,不解)
    { 
        for(int i =0 ;i<8000 ;i++);
        P0IFG &= ~0x02;     //P0.1(S1)状态标志寄存器清零
        if(T1CTL == 0x0e)
          T1CTL = 0x00;     //1分频 暂停运行
        else
          T1CTL = 0x0e;     //128分频 模模式
    }
} void main( void )
{
  INIT_IO();
  INIT_LED();
  INIT_Timer1();
  LED1 = 1 ;
  int count = 0;
  while(1)
  {
    if(IRCON &= 0x02)    
    {
      count++;
      if(count%2==0)
      {
         LED1 = !LED1;
         IRCON &= ~0x02 ;
         count = 0;
      }
    }
  }
} 上面为模模式的查询法,下面为模模式的中断法 #include
#define LED1 P1_0   //定义LED1为P1.0  
#define S1   P0_1   //定义S1为P0.1 
int count = 0;
void INIT_LED(void)
{
  P1SEL &= ~0x01;   //设P1.0为普通I/O功能
  P1DIR |= 0x01;    //设P1.0为输出方向
  LED1 = 0;         //将LED1点亮
}
void INIT_IO(void)
{
  P0SEL &= ~0x02;     //设P0.1(S1)为普通I/O功能
  P0DIR &= ~0x02;     //设P0.1(S1)为输入
  P0IFG &= ~0x02;     //设P0.1(S1)状态标志寄存器清零
  IRCON &= ~(0x20);   //设P0状态标志位清零
  P0IEN |= 0x02;      //设P0.1(S1)中断使能
  IEN1 |= 0x20;       //开P0中断
} void INIT_Timer1()

  T1CTL = 0x00;     //1分频、停止运行
  T1CCTL0 |= 0x04;  //设定timer1通道0输出比较模式
  T1CC0L = 0x24;
  T1CC0H = 0xF4;
  TIMIF |= 0X40;  //设定timer1中断开启
  IEN1 |= 0x02;   //设定timer1中断开启
  //清除中断标志
  IRCON &= ~0x02;
  T1STAT &= ~0x01;  //第5位计数溢出标志呢
}
#pragma vector = T1_VECTOR 
__interrupt void TIMER1_ISR(void) 

    
count++;
    if(count%2 == 0)
    {
       LED1 = !LED1;
       count = 0;
    }
    //清除中断标志
    IRCON &= ~0x02;
    T1STAT &= ~0x01; 
    //产生的中断是定时器1通道0中断,而不是定时器1的溢出中断,故只需要清除T1STAT的第1位,不需要清除第5位 } //P0.1(S1)中断处理函数
#pragma vector = P0INT_VECTOR 
__interrupt void P0_ISR(void) 

    if((P0IFG&0x02) == 0x02)     //P0.1(S1)状态标志寄存器触发
    {
        for(int i =0 ;i<8000 ;i++);
        P0IFG &= ~0x02;     //P0.1(S1)状态标志寄存器清零
        if(T1CTL == 0x0e)
          T1CTL = 0x00;     //1分频 暂停运行
        else
          T1CTL = 0x0e;     //128分频 模模式
    }
    IRCON &= ~(0x20);
}
void main( void )
{
    
INIT_LED();
    INIT_IO();
    INIT_Timer1();
    EA = 1;             //开总中断
    while(1);
}