无线软解码进

2020-02-05 09:01发布

void eint0(void) interrupt 0//外部中断0 中断子程序  
{  
static unsigned int tempaddr;//接收地址缓存  
static unsigned int tempkey;//接收数据缓存  
unsigned int timecnt;     //时间  
timecnt=(TH0*256+TL0)*1.085;  
TH0=0;  
TL0=0;        // 在外部中断中对定时器清零,重新计数   

if((timecnt>80)&&(timecnt<600)&&(cntint<24))  
{  
if(cntint<16)//接收地址码  
{  
tempaddr=tempaddr<<1;//将接收的到最低位移到最高位  
if(timecnt>250)//210为宽脉冲与低脉冲界线,当振荡电阻为1M时,窄脉冲为110uS,宽脉冲为320uS  
{  
tempaddr|=1;//宽脉冲为1  
}  
cntint++;//中断次数加1  
}  
else if(cntint<24)//接收数据码  
{  
tempkey=tempkey<<1;  
if(timecnt<250)  
{  
tempkey|=1;  
}  
cntint++;  
}  
else//cntint大于24也就是中断了25次时,关闭外部中断0,等待同步码  
{  
TMOD&=0xf0;//设定时器0为定时方式  
TMOD|=0x01;  
TH0=0xf1;  
TL0=0x9a;  
cntint=0;  
EX0=0;//关外部中断0  
addr=tempaddr;  
key=tempkey;  
tempaddr=0;  
tempkey=0;  
}  
}  
else  
{  
TMOD&=0xf0;//设定时器0为定时方式  
TMOD|=0x01;  
TH0=0xf1;  
TL0=0x9a;  
cntint=0;  
EX0=0;//关外部中断0  
tempaddr=0;  
tempkey=0;  
}  

}  
void timer0(void) interrupt 1//定时器0中断,只有初始化时,空闲时和同步码到来时才中断  ??
{  
//TMOD&=0xf0;//将定时器0的工作方式设为门控定时,用以检测脉宽。  
TMOD|=0x09;  
cntint=0;//外部中断0中断次数设为0  
TH0=0;//设定时器0定时初值为0  
TL0=0;  
EX0=1;//允许外部中断0  
IE0=0;//清除外部中断0标志  
}

这是模拟PT2272解码的程序段
请问这个程序是如何确定同步码的?if((timecnt>80)&&(timecnt<600)&&(cntint<24)) 是这句吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
xad74
2020-02-05 21:48
以前用在STC芯片上的,对遥控器无要求
程序没整理有点乱,将就看吧

#include <config.h>


bit PT2272(uint HDa,uint LDa)
{static uchar Id;
static uint SMin,SMax,LMin,LMax,DMin,DMax;
static uint32 ChDa;
if(!Head)
   {if(Up)
          {DMin=HDa*29;//<<5-IntDa;
           DMax=HDa*33;//<<5+UpDa;
           SMin =HDa-Min;
           SMax =HDa+Max;
           LMin =(HDa<<1)+HDa-Min;  //UpDa*3-Min;
           LMax =(HDa<<1)+HDa+Max;
          }
        else
          {if(Down)
                 {if(DMin<LDa&&DMax>LDa)
                         {Head=1;
                          Id=0;
                          RfDa=0;
                         }
                  else
                     Head=0;
                 }
          }
        }
  else
        {if(Up)
           {if(HDa>SMin&&HDa<SMax)                                      //短高脉冲
                  {RfDa+=0x01;
                   RfDa<<=1;
                   Id++;
                  }
                else
                  {if(HDa>LMin&&HDa<LMax)                                   //长高脉冲
                         {RfDa+=0x00;
                          RfDa<<=1;
                          Id++;
                         }
                   else
                         {Head=0;
                          return(0);
                         }
                   }
           }
         else
           {if(Down)
                  {if(!(LDa>SMin||LDa>LMax))
                      {Head=0;
                           return(0);
                          }
                  }
           }
         if(Id>23)
           {if(ChDa==RfDa)
              {Head=0;
                   ChDa=0;
                   Id=0;
                   return(1);
                  }
            else
                  {ChDa=RfDa;  
                   Head=0;
                   RfDa=0;
                   Id=0;
                   return(0);
                  }
           }
        }
return(0);       
}

/********************************信号中断********************************************/
void RFIn() interrupt 7
{if(CCF1)
   {CR=0;
    CL=CH=0;
        CR=1;
    if(RFin)
      {((uchar *)&DownDa)[0]=CCAP1H;                        //低电平宽度
       ((uchar *)&DownDa)[1]=CCAP1L;
           Down=1;
      }
    else
      {((uchar *)&UpDa)[0]=CCAP1H;                    //高电平宽度
       ((uchar *)&UpDa)[1]=CCAP1L;
           Up=1;
           Down=0;
      }
        CCAP1L=CCAP1H=0;
   }
CF=CCF0=CCF1=0;
}          

一周热门 更多>