下面的这个代码主要是使用定时器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++;
}
}