代码改变世界

CC2530红外学习球学码函数(P1.2接红外一体接收头,使用定时器tim1的复用功能2)

2013-09-26 17:33  djky12  阅读(1205)  评论(0)    收藏  举报

P1.2GPIO配置:

void cap_gpio_init()
{
P1SEL |= 0x04;
P1DIR &= ~0x04;

PERCFG |= 0x40;
P2SEL |= 0x20;


CLKCONCMD |= 0x28;//设置时钟

asm("NOP");//等待时钟稳定
asm("NOP");
asm("NOP");

}
定时器初始化函数:
void timer1Init(void)
{

T1CCTL0 = 0;

T1CTL &= ~0x0c; //clear register
T1CTL |= 0x00; /* Clock pre-scaled by 8 */

T1CTL &= ~0x03;//clear module bits
T1CTL |= 0x01;//选择定时器1模式,01: 自由运行,从0x0000到0xFFFF反复计数

T1CCTL0 &= ~(0x38);
T1CCTL0 |= 0x03; //r and f all cap,边沿触发方式
T1CCTL0 |= 0x40; //enable cap interrupt

IEN1 |= 0x02; //enable timer1 interrupt
}


void time1Config(void)
{
cap_gpio_init();
timer1Init();
}

void timer1Stop(void)
{
T1CTL &= ~0x03;//选择定时器1模式, 00:暂停运行。
}

void timer1Start(void)
{
T1CTL |= 0x03;//选择定时器1模式,11: 正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CC0倒计数到0x0000。
}

学码中断函数(保存高低电平的时间):
void user_timer1_interrupt(void)
{

unsigned char a,b;

if(T1STAT & 0x01)
{
T1STAT &= ~0x01;
irflag = 1 ;

a = T1CC0H ;
b = T1CC0L ;

rec[signle++] = ((a<<8)|b);

T1CNTH = 0;
T1CNTL = 0;
}

if(T1STAT & 0x20)
{

T1STAT &= ~0x20;
if(irflag == 1)
{
irflag = 0;
rec[signle]=0xffff;
T1CNTH = 0;
T1CNTL = 0;
if(signle >= 20)
flag = 1;
signle = 0;

}
T1STAT &= ~0x01;
}

}


注意事项:1. 在使用学码中断时要打开总中断EA, 2.之前我们把我们timer1Start函数加入到主函数中,那样我们使用的是使用的是正计数/倒计数模式,需要设置T1CC0的值,而且中断学码的数据位数也不对,而自由运行模式来实现学码中断,就能学到正确的数据