msp430红外解码程序

2019-03-24 13:45发布

void Init_Sys(void)
{
     unsigned int i;
     BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
     do
     {
      IFG1 &= ~OFIFG;                  // 清除振荡器失效标志
      for (i = 0xFF; i > 0; i--);      // 延时,等待XT2起振
     }
     while ((IFG1 & OFIFG) != 0);      // 判断XT2是否起振
     BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
    //以下对各种模块、中断、外围设备等进行初始化
}
void Init_irt(void)
{
   P1DIR &=~BIT1; //设置P1.1为输入
   P1SEL |= BIT1; //设置P1.1为CCI0A输入
   TACTL=TASSEL_2+MC_2+ID_3;//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 我想请问一下各位大神,这个1700是怎么依据得到?      value|=0x80;             //若 >1.7MS,则为1、若 <1.7MS,则为0
      count++;
    }
    ir_code=value;          //存放用户码和数据码
  }
  dataok=1;                    //数据处理标志置位
}
void deal_irt(void)
{
  if(irok)                    //数据接收是否完毕?
    {
      irok=0;                   //是、清标志位
      IR_data_pros();           //红外数据处理函
    }
  if(dataok)                  //数据处理是否完毕?
    {
      dataok=0;                 //是、清标志位
    }
}
#pragma vector=TIMERA0_VECTOR
__interrupt void timera (void)
{
    static uchar index;
    if(diff_cap>7000) index=1;       //检测引导码  各位大神 我想问一下7000怎么来的    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;                 
}
  我的MCLK用的是8M ,TACTL用的是32768,8分频捕获
此帖出自小平头技术问答
0条回答

一周热门 更多>

相关问题

    相关文章