哎,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条回答
wzjhuohua
1楼-- · 2019-03-25 12:29
a=temp;
这一句,似乎不对吧,temp是unsigned char型,如果a是数组的话,那么赋值不应该是a=temp;
江汉大学南瓜
2楼-- · 2019-03-25 14:58
谢谢你的回答啊。我是直接从程序代码里面复制过来的,在我的源程序里面确实是a[I]=temp;不知道复制过来后怎么改掉了。
江汉大学南瓜
3楼-- · 2019-03-25 17:04
 精彩回答 2  元偷偷看……
x3641026
4楼-- · 2019-03-25 17:21
你好,请问一下,我红外接收头用的SM0038  ,但是那个电压输出来接近5v啊 ,能直接接到单片机上么?  还有那个数组a为什么用字符型啊?
我先把a[3]作为段码输出到数码管上  那样译码出来的就显而易见了,该怎么办呢?
谢谢啊 。。
单片机菜菜鸟
5楼-- · 2019-03-25 21:53
楼主,我也正在做这个,有没有qq号码,有问题想跟你聊聊
单片机菜菜鸟
6楼-- · 2019-03-26 03:27
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章