代码如下
灯是用来测试的 放在main函数的解码循环中从来没亮过
是哪里出了问题
#include "msp430x14x.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define LED8 P3OUT //P34、P35口接2个LED灯用于测试
uint ir_data[33]; //存放解码数据(16位用户码+8位数据码+8位数据反码)
uchar ir_code[4]; //存放解码数据(16进制)
uchar disp[8]; //存放显示数据
uchar irok=0; //数据接收标志位
uchar dataok=0; //数据处理标志位
uint new_cap = 0;
uint old_cap = 0;
uint diff_cap = 0;
/*********************函数申明************************/
void clk_init(void); //时钟初始化
void timera_init(void); //定时器初始化
void IR_data_pros(void); //数据处理
void code_process(void); //显示数据处理
/********************初始化时钟**********************/
void clk_init(void) {
uchar i;
BCSCTL1&=~XT2OFF;
BCSCTL2|=SELM1+SELS;
do{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
}
/********************定时器初始化**********************/
void timera_init (void)
{
P1DIR &=~BIT1; //设置P1.1为输入
P1SEL |= BIT1; //设置P1.1为CCI0A输入
TACTL=TASSEL_2+MC_2+ID_3; //timera_clk=aclk=32768Hz、连续计数模式、8分频
CCTL0=CM_2+SCS+CCIS_0+CAP+CCIE;
//下降沿捕获、同步捕获、选择输入为CCI0A、捕获模式、开捕获中断
}
/*********************红外数据处理函数**************************/
void IR_data_pros (void) {
uchar i,j,count=1,value; // count=1 、作用是清除引导码
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
value>>=1;
if(ir_data[count]>1700) //判断捕获时间是否大于1.7MS
value|=0x80; //若 >1.7MS,则为1、若 <1.7MS,则为0
count++;
}
ir_code[i]=value; //存放用户码和数据码
}
dataok=1; //数据处理标志置位
}
/*********************数据16进制显示处理************************/
void code_process(void) {
disp[0]=ir_code[0]/16;
disp[1]=ir_code[0]%16;
disp[2]=ir_code[1]/16;
disp[3]=ir_code[1]%16;
disp[4]=ir_code[2]/16;
disp[5]=ir_code[2]%16;
disp[6]=ir_code[3]/16;
disp[7]=ir_code[3]%16;
}
void main(){
WDTCTL = WDTPW + WDTHOLD; //CLOSE THE DOG
//LCD1602_init(); //LCD1602初始化
clk_init(); //时钟初始化
timera_init(); //定时器初始化
_EINT(); //开总中断开关
while(1)
{
LED8=0x00; //点亮LED
delay_ms(500);
LED8=0xff; //熄灭LED
delay_ms(500);
}
while(1){
if(irok) //数据接收是否完毕?
{
irok=0; //是、清标志位
IR_data_pros(); //红外数据处理函
}
if(dataok) //数据处理是否完毕?
{
dataok=0; //是、清标志位
//code_process(); //显示16进制数据处理
}
LED8=0x00; //点亮LED
delay_ms(500);
LED8=0xff; //熄灭LED
delay_ms(500); //显示解码数据
}
}
/********************Timer_A中断服务程序*************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void timera (void)
{
static uchar index;
if(diff_cap>7000) index=1; //检测引导码
new_cap=TACCR0;
diff_cap=new_cap - old_cap;
ir_data[index++]=diff_cap; //存捕获的差异值,既是数据
if(index==33) //数据接收完毕
{
index=0;
irok=1; //数据接收标志置位
}
old_cap=new_cap;
}