基于MSP430的红外遥控解码程序

2019-07-24 17:45发布

#include<msp430x14x.h>
//*************************************************
//***********基于MSP430的红外遥控器解码程序
//***********利用I/O口的中断功能结合定时间器,捕捉周期时间确定数值
//***********每16位编码表示一个按键
//***********只检测了1-6号键盘,其他的按照同样方式进行解码,相信你能做得到
//***********注意起始条件的判断
int count=0;//接受脉冲计数,16个信号
int overflow=0;//定时器A溢出次数计数
int biao=0;//起始标志位
unsigned int ki;//键值
unsigned int temp2=0;//定时器计数值
int d[33]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//脉冲时间保存
void Init_System(void)
{  
  Init_CLK();
   Init_TimerA();
   P2IE|=BIT3;
   P2IES|=BIT3;
}
void Init_TimerA(void)
{
  TACTL=TACLR+TASSEL1+ID1;    //时钟源=ACLK,8分频,清TAR
  TACCTL0=CCIE;                     //CCR0中断允许
  TACCR0=60000;                       //定时125ms   
TACTL|=MC0;                     //开始计数,增计数模式                  
}
//***************系统时钟设置****************//
//          主时钟MCLK=SMCLK=4M              //
//          辅助时钟ACLK=32768               //
//*******************************************//
void Init_CLK(void)
{
  unsigned int i;  
  BCSCTL1&=~(XT2OFF+XTS);                     
// XT2on,ACLK为32768
  //BCSCTL1&=~(XTS);
     BCSCTL2 |= SELM1+SELS;                       // MCLK = SMCLK = XT2     
do    {
  IFG1 &=~OFIFG;                              // Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);                  // Time for flag to set
   }
  while ((IFG1 & OFIFG) != 0);                 // fail?           
}
////============主函数==============////
void main(void)
{  
  WDTCTL=WDTPW+WDTHOLD;      
  Init_System();                  //系统初始化
     _EINT();                       //开总中断  
while(1);                       //等待中断
}  
////===============定时中断=============////
#pragma vector=TIMERA0_VECTOR
__interrupt void Lamp_Drive(void)
{   
    overflow++;
}
#pragma vector=PORT2_VECTOR
__interrupt void yaokong(void)
{     
  int i;
  unsigned int temp1;
   temp1=TAR;
  P1OUT|=Light1;
   P2IFG=0x00;
   P2IE&=~BIT3;
   _EINT();
  for(i=0;i<=50;i++);//调试的过程中发现一干扰信号,此延时用来屏蔽干扰
  if ((P2IN&BIT3)!=0x00)
  {
    P2IFG=0x00;
  P2IE|=BIT3;
    P1OUT&=~Light1;
     return;
  }
     if(biao==0)  
   {
      for(i=0;i<1000;i++)//起始位,注意起始位的判断  
     {
        if((P2IN&BIT3)!=0x00)
          break;  
     }
       if(i==1000)
      {
        biao=1;
        count=0;  
       overflow=0;
      }  
   }
    else
     {      
         if(count<=16)
      {     
      if(overflow==0)   
             {           
                 d[count]=temp1-temp2;
         }
        else
         {
           d[count]=temp1+60000-temp2;
            overflow=0;   //时间保存数组D[j]
          }
        if(count==16) 
        { 
          unsigned int tempui; 
          ki=0;
           tempui=1; 
          for(i=1;i<=16;i++) 
          { 
            if(d[i]>=1500)
               ki |= tempui; 
            tempui=tempui<<1;//计数大于1500则表示数据位1
           } 
   
       biao=0;
if (ki==0x2102||ki==0x2302||ki==0x2502||ki==0x2702||ki==0x2902||ki==0x2B02) 
          {   if(ki==0x2102) 
               ki=1; 
               if(ki==0x2302) 
                ki=2; 
               if(ki==0x2502) 
                ki=3; 
               if(ki==0x2702) 
                ki=4; 
               if(ki==0x2902) 
                ki=5; 
               if(ki==0x2B02)  
               ki=6; 
              Concentr=(unsigned int)ki; 
              Disp_Current(Concentr,Temp);
           }
         }
       } 
      count++;
     } 
  temp2=temp1; 
   P2IFG=0x00;
   P2IE|=BIT3; 
  //P1OUT&=~Light1; 
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。