定时器4实验

下面的这个代码主要是使用定时器3来控制led灯的亮灭的,使用的单片机是粤嵌的cc2530底板。

/**
* 项目名称:定时器4实验
* 时间:2014年1月5日10:16:04
* 作者:林少油
**/

#include <ioCC2530.h>

#define YLED P1_0
#define BLED P1_1

#define LIGHTOPEN 1
#define LIGHTCLOSE 0

#define uint unsigned int
#define uchar unsigned char

uint Count=0;//计数器
uchar LedFlag=0;//闪烁标志

void Delay(uint n);
void Led_T3_Init(void);

/**********************************
* 定时器初始化宏定义
**********************************/
#define Timer34_Init(timer) \
  do{ \
    T##timer##CTL |=0X04; \
    T##timer##CCTL0 =0x00; \
    T##timer##CC0 = 0X00; \
    T##timer##CCTL1 =0x00; \
    T##timer##CC1 =0x00; \
  }while(0)
    
/*********************************
* 定时器T3/4溢出中断寄存器位的宏定义
*********************************/
#define Timer34_OverFlaw_Interrupt(timer,val) \
  T##timer##CTL = (val)?(T##timer##CTL | 0x08):(T##timer##CTL & ~0x80)

/*********************************
* 定时器T3/4启动寄存器位的宏定义
********************************/
#define Timer34_Start(timer,val) \
  T##timer##CTL = (val)?(T##timer##CTL | 0x10):(T##timer##CTL & ~0x10)

/*********************************
* 定时器T3/4分频设置寄存器位的宏定义
*********************************/
#define Timer34_Div(timer,val) \
  do{ \
     T##timer##CTL &=~0xe0;                 /*先把前3位清0,以便下面能够够正确的设置这3位寄存器位*/ \
     T##timer##CTL = (val==2)?(T##timer##CTL | 0x20): /*2倍分频*/ \
    (val==4)?(T##timer##CTL | 0x40):        /*4倍分频*/           \
    (val==8)?(T##timer##CTL | 0x60):        /*8倍分频*/           \
    (val==16)?(T##timer##CTL | 0x80):       /*16倍分频*/          \
    (val==32)?(T##timer##CTL | 0xa0):       /*32倍分频*/          \
    (val==64)?(T##timer##CTL | 0xc0):       /*64倍分频*/          \
    (val==128)?(T##timer##CTL | 0xe0):      /*128倍分频*/         \
    (T##timer##CTL | 0x00);                  /*不分频*/            \
  }while(0);

/*********************************
* 定时器T3/4模式控制寄存器为的宏定义
*********************************/
#define Timer34_Mode(timer,val) \
  do \
  {  \
    T##timer##CTL &=~0x03;           /*先把这2位清0,以便下面能够正确的设置这2个寄存器位*/  \
    T##timer##CTL =                                                         \
    (val==1)?(T##timer##CTL | 0x01): /*倒计数,从T3CC0到0x00的计数*/        \
    (val==2)?(T##timer##CTL | 0x02): /*模,从0x00到T3CC0的计数*/            \
    (val==3)?(T##timer##CTL | 0x03): /*正倒计数,从0x00到T3CC0重复计数,再降到0x00*/\
    (T##timer##CTL | 0x00);           /*自由运行,从0x00到0xff重复计数 */    \
  }while(0);

/********************************
* @prief Led和T3的初始化函数
********************************/
void Led_T3_Init()
{
  CLKCONCMD &= ~0X7f; //选择32MHz的振荡器频率
  while(CLKCONSTA & 0x40);//等待振荡器稳定下来
  P1DIR |= 0x03; //P1.0和P1.1设置为输出
  YLED=LIGHTOPEN;
  BLED=LIGHTCLOSE;
  
  Timer34_Init(3);//初始化T3寄存器
  Timer34_Div(3,128);//选择128倍分频
  EA = 1; //打开中断总开关
  T3IE = 1;//打开定时器3的中断开关
  Timer34_OverFlaw_Interrupt(3,1);//打开定时器3溢出中断的开关
  Timer34_Mode(3,0);//选择定时器3自由运行模式,从0x00到0xff重复计数
  Timer34_Start(3,1); //定时器3开始计数
}
    
main()
{
  Led_T3_Init();
  while(1)
  {
    if(LedFlag)
    {
      YLED ^=1;
      BLED ^=1;
    }
    Delay(6400);
  }
}

/*********************************
* @prief 延时函数
*********************************/
void Delay(uint n)
{
  uint i;
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
}

/********************************
*@prief T3中断服务程序
********************************/
#pragma vector = T3_VECTOR
__interrupt void T3_ISR()
{
  IRCON = 0X00; //中断清0
  if(Count>=2441)
  {
    Count = 0;
    LedFlag ^= 1;
  }
  else
  {
    Count++;
  }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值