CC2530定时器1中断实现定时1-3

时间:2024-10-12 18:43:57

源码

#include "iocc2530.h"//引用CC2530头文件

int t1_Count=0;  //定时器1溢出次数计数

void Init_Led(void){
/*******************LED1初始化部分******************/
  P1SEL &=~ 0x01;       //设置P1_0口为通用I/O口
  P1DIR |= 0x01;        //设置P1_0口为输出口
  P1_0=0;               //熄灭LED1
/**************************************************/
}
void Init_T1(void){
/*****************定时器1初始化部分****************/
  
  T1CTL |=0x0C;         //定时器1时钟频率128分频
  T1CC0L = 0x12;        //设置最大计数值的低8位
  T1CC0H = 0x7A;        //设置最大计数值的高8位
  T1IE = 1;             //使能定时器1中断
  T1OVFIM = 1;          //使能定时器1溢出中断
  EA = 1;               //使能总中断
  T1CTL |= 0x03;        //定时器1采用正计数/倒计数模式

/**********************************************/
}
void main(void){
  Init_Led();
  Init_T1();
  while(1); //程序主循环
}
/**************************************************************
函数名称:T1_INT
功  能:定时器1中断处理函数
入口参数:无
出口参数:无
返 回 值:无
**************************************************************/
#pragma vector = T1_VECTOR
__interrupt void T1_INT(void)
{
  T1STAT &= ~0x20;      //清除定时器1溢出中断标志位

  t1_Count++;           //定时器1溢出次数加1,溢出周期为0.5s
  if(t1_Count == 3)     //如果溢出次数到达3,说明经过了1.5s
  {
    P1_0 = 1;           //点亮LED1
  }
if(t1_Count == 4)       //如果溢出次数到达4,说明经过了2秒
  {
    P1_0 = 0;           //熄灭LED1
    t1_Count = 0;       //清零定时器1溢出次数
  }
}

源码讲解

#include "iocc2530.h"//引用CC2530头文件

int t1_Count=0;  //定时器1溢出次数计数

void Init_Led(void){
/*******************LED1初始化部分******************/


  P1SEL &=~ 0x01;    
  //设置P1_0口为通用I/O口

  P1DIR |= 0x01;      
 //设置P1_0口为输出口


  P1_0=0;               //熄灭LED1
/**************************************************/


}
void Init_T1(void){
/*****************定时器1初始化部分****************/
  


  T1CTL |=0x0C;        

//定时器1时钟频率128分频

  T1CC0L = 0x12;      
 //设置最大计数值的低8位

  T1CC0H = 0x7A;        
//设置最大计数值的高8位

  T1IE = 1;    
外部中断配置流程表3.5 IEN1寄存器的描述      

  //使能定时器1中断

  T1OVFIM = 1;        

定时器 1、定时器 3 和定时器 4 还分别拥有一个计数溢出中断屏蔽位,

分别是T1OVFIM、T3OVFIM和T4OVFIM。当这些位被设置成1时,对应定时器的计数溢出中断便被使能,这些位都可以进行位寻址。不过一般用户不需要对其进行设置,因为这些位在CC2530上电时的初始值就是1。如果要手工设置,可以用以下代码实现。T1OVFIM=1; //使能定时器1溢出中断最后要使能系统总中断EA。

 //使能定时器1溢出中断

  EA = 1;        
IEN0寄存器的描述     
//使能总中断

  T1CTL |= 0x03;        
//定时器1采用正计数/倒计数模式

/**********************************************/
}
void main(void){
  Init_Led();
  Init_T1();
  while(1); //程序主循环
}
/**************************************************************
函数名称:T1_INT
功  能:定时器1中断处理函数
入口参数:无
出口参数:无
返 回 值:无
**************************************************************/
#pragma vector = T1_VECTOR
__interrupt void T1_INT(void)
{


  T1STAT &= ~0x20;    
 //清除定时器1溢出中断标志位
T1STAT寄存器的描述

  t1_Count++;           //定时器1溢出次数加1,溢出周期为0.5s
  if(t1_Count == 3)     //如果溢出次数到达3,说明经过了1.5s
  {
    P1_0 = 1;           //点亮LED1
  }
if(t1_Count == 4)       //如果溢出次数到达4,说明经过了2秒
  {
    P1_0 = 0;           //熄灭LED1
    t1_Count = 0;       //清零定时器1溢出次数
  }
}