利用CC2530最小系统板的定时器来控制LED

1.1 任务 用定时器1来控制LED1闪烁时亮灭间隔的时间

image.png


1.2 寄存器配置
(1)T1CTL——定时器1的控制

image.png


T1CTL是定时器1的控制寄存器。第2~3位DIV[1:0]对应定时器1的分频器划分值,设置为128;第0~1位对应定时器1的运行模式:这里设置为在自由模式下运:T1CTL = 0x0d;

(2)CLKCONCMD——时钟控制命令

image.png


CLKCONCMD:钟控制命令寄存器第6位OSC:系统时钟源选择
该位的默认值是1,对应16MHz RCOSC第3~5位TICKSPD[2:0]:定时器标记输出设置
默认值为001,即对应16MHz
所以,定时器的标记输出设置默认为16MHz

当定时器1的分频值(T1CTL:DIV[1:0]=11)设置为128时
对应的时钟频率为16M/128=1/8MHz,周期为8us。
当定时器1处于自由运行模式,即从0x0000~0xFFFF计数时,它溢出一次的周期为8usX65536=524288us(520ms)。

1.3源码分析


(查询)

//  在main函数中,先通过Init_T1()设置好定时器1的分频值和运行模式,并且让定时器1启动。
//在while(1)中,通过不断检测定时器1的中断标志T1IF是否被置1,来判断它是否产生溢出,
//如果有,就改变LED1的亮灭状态,并且清除中断标志T1IF。


#include <ioCC2530.h>
 
typedef unsigned char uchar;
typedef unsigned int  uint;
 
//为LED1相关的I/O端口引脚定义一个宏
#define LED1 P1_0
 
//函数声明
void Init_Led(void);//初始化LED函数
void Init_T1(void);//初始化定时器1函数

#include <ioCC2530.h>
 
typedef unsigned char uchar;
typedef unsigned int  uint;
 
//为LED1相关的I/O端口引脚定义一个宏
#define LED1 P1_0
 
//函数声明
void Init_Led(void);//初始化LED函数
void Init_T1(void);//初始化定时器1函数


/********************主函数********************/
int main(void)
{
  Init_Led();//初始化LED函数
  Init_T1();//初始化定时器1函数
  
  while(1)
  {
    if(T1IF)//如果定时器1中断标志为1,表明定时器1产生溢出
    {
      LED1 =! LED1;//LED1亮灭状态改变
      T1IF = 0;//清除定时器1中断标志     
    }
  }
}

(中断)

#include <ioCC2530.h>
 
typedef unsigned char uchar;
typedef unsigned int  uint;
 
uchar count = 0;//用于定时器计数
 
//为LED1相关的I/O端口引脚定义一个宏
#define LED1 P1_0
 
//函数声明
void Init_Led(void);//初始化LED函数
void Init_T1I(void);//初始化定时器1(中断方式)函数
/*********初始化LED函数**********/
void Init_Led(void)
{
  P1DIR |= 0x01;//设置P1.0为输出
}
 
/*********初始化定时器1(中断方式)函数*************/
void Init_T1I(void)
{ 
  T1CTL |= 0x0C;//128分频;
  T1IF = 0;           //清除定时器1的中断标志
  T1STAT &=~ 0X20;    //清除定时器1的溢出中断标志
  TIMIF |= 0x40;  //使能定时器1的溢出中断
  T1IE = 1;           //IEN1使能定时器1中断 
  EA = 1;             //使能总中断
  T1CTL = 0x0d; //定时器1启动
} 
//定时器1中断处理函数
#pragma vector = T1_VECTOR 
__interrupt void T1_ISR(void) 
{ 
  if(++count == 6(n))  //128/16MHz*65536*n=3s,n=0.9537
  {                        
    count = 0;//计数清零
    LED1 = !LED1;//LED1亮灭状态改变    
  } 
  T1IF = 0;//清除定时器1中断标志, 也可由硬件自动清除
}
/********************
主函数
********************/
int main(void)
{
  Init_Led();//初始化LED函数
  Init_T1I();//初始化定时器1(中断方式)函数
  while(1);//让程序永远在这里运行
}

补充说明
        在main函数中,先通过Init_T1I()函数初始化以中断方式使用定时器1的设置,然后用“while(1);”让程序永远在这里运行,如果定时器1产生溢出中断,则会进入中断处理函数执行中断服务程序。中断处理函数的格式曾经在实验3——外部中断控制LED亮灭相关的例程中介绍过,这里只需要把中断向量相应地改为T_VECTOR即可。在中断处理函数中,通过一个全局变量count来计数,因为定时器3溢出一次的周期为:128/16MHz*65536=2048us,所以如果要定时0.5s,需要溢出0.5*1000000/(8*65536)=0.9537次,这里选择当定时器1溢出1次时,让count清零,并且让LED1亮灭状态改变。此外,在中断处理函数中,还应当清除定时器1的中断标志,当然这也可以由硬件自动清除。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值