定时器4实验

来源:互联网 发布:javascript功能 编辑:程序博客网 时间:2024/05/18 00:39
下面的这个代码主要是使用定时器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 charuint 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 0
原创粉丝点击