哎,msp430写红外解码不成功啊,又不知道问题出在哪,谁能指条明路啊,谢谢了

2019-03-24 14:27发布

1  红外解码子程序如下:a[4] 依次储存用户码、用户反码与键数据码、键数据反码 2  利用P1.7的下降沿触发中断,我写的注释蛮多的,应该很容易看清楚程序思路的 3  试过几次,就是不知道问题出在哪?先谢过了 4  定时器时钟选了8m,8分频以后,就是1m了,也就是说 :计数一次的时间是1us     #include  <msp430x14x.h>   //数组a依次储存用户码、用户反码与键数据码、键数据反码
unsigned char a[4]; //a是8位的char型,与各位码的位数相同
unsigned int LowTime,HighTime;
unsigned char c0,c1,c2,c3,c4,c5,c6,c7;//每一位码的8位       //该解码函数被中断函数调用
int DeCode(void)
{
  unsigned char i,j,temp;
  for(i=0;i<4;i++)
  {
     for(j=0;j<8;j++)
      {
        temp=temp>>1;      //为什么不放在下面
        TACTL |= TACLR+MC_2; //清零启动计数器
        while( (P1IN&0X80)==0X00 );
        TACTL |= MC_0;
        LowTime = TAR;  
     
        TACTL |= TACLR+MC_2; //清零启动计数器
        while( (P1IN|0X7F)==0XFF );
        TACTL |= MC_0;
        HighTime = TAR;            if( (LowTime<415)||(LowTime>715) ) 
        return 0;        
        if( (HighTime>460)&&(HighTime<660) )  //0   0.565ms/1us=565次
        temp=temp&0x7f; 
        if( (HighTime>1430)&&(HighTime<1930) ) //1  1.685ms/1us=1685次
        temp=temp|0x80; 
      }   
    a[I]=temp;
  } return 1;  //一次按键的解码结束
 }         //分离各位码,以在12864在上面显示
void fenjie(void)
{
  c0=a[0]/16;
  c1=a[0]%16; 
  c2=a[1]/16;
  c3=a[1]%16; 
  c4=a[2]/16;
  c5=a[2]%16; 
  c6=a[3]/16;
  c7=a[3]%16; 
}        
/*****************************************************************************
端口1中断函数
用到P1.7中断源(下降沿触发中断)
******************************************************************************/
#pragma vector=PORT1_VECTOR        //P1.7下降沿触发进入中断函数
__interrupt void Port1(void)
{
   if(P1IFG&BIT7)   //首先判断中断源
    {
       TACTL |= TACLR+MC_2; //启动定时器计数
       while( (P1IN&0X80) ==0X00 );
       TACTL |= MC_0;//定时器暂停(此时TAR的内容不受影响)
       LowTime=TAR;  
   
       TACTL |= TACLR+MC_2; //启动定时器计数
       while( (P1IN|0X7F==0XFF) );
       TACTL |= MC_0;
       HighTime=TAR;   
      
       //9ms低电平应计9000次(9ms/1us=9000)      4.5ms高点平应计4500次(4.5ms/1us=4500次)
       //如果引导码 结果码正确,就开始解各部分码
       if(  (LowTime>8500)&&(LowTime<9500)   &&   (HighTime>4000)&&(HighTime<5000)  )
         {
           if(DeCode()==1)
            {
             fenjie();
            }
         }
    }
  P1IFG =0X00; //清除P1.7中断标志   
}
[ 本帖最后由 江汉大学南瓜 于 2011-7-12 21:02 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
wstt
2019-03-24 16:58
你把TACTL |= MC_0;换成TACTL &= ~MC_0;

一周热门 更多>

相关问题

    相关文章