让PT2262无线解码不再神秘,让菜鸟们都能做解码程序

2020-01-23 14:28发布

//自适应频率的2262解码代码 晶振11.0592到22.1184MHZ
//p3.2脚接 315m无线接收头的输出端,p1口接LED作指示灯
#include"AT89x52.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit shou = P3^2;
//=========================================================================
void InitTimer0(void)
{
  TMOD = 0x11;    //定时器1,定时器0用模式1 16位计时用,12T
  EA = 1;
  ET0 = 1;
  ET1=1;
}
//========================================================================
void main(void)
{
  InitTimer0();
  EX0=1;
  while(1);
}
//========================================================================
void ex0(void) interrupt 0
{
  bit err=0;
  uchar i,tl,th,ma1,ma2,ma3;
  uchar TimeCount;
  uint l,m;
  EX0=0;
  TR1=1;
  i=0;
  if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0
   {
    TimeCount--;//等于0后表示按键释放
   }
  while(shou==0);
  while(i<24)
   {
    while(shou==0);        //等待高电平到来
    tl=TL1;
    th=TH1;
    TH1=TL1=0;         //记录低电平长度并初始化高电平头
    l=th;
    l=((l<<8)+tl);
    if(i==0)         //处理低电平
     {
      if(l>2360)      
       {        //确认是引导头
        m=l/31;
       }
      else         //不符合规则(出错)
       {
        i=0;
        TR1=0;
        TH1=TL1=0;
        err=1;
        break;
       }
     }
    else
     {
     if(((l>(m-(m/4)))&&(l<(m+(m/4))))||((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2)))));
     else
      {
       i=0;
       TR1=0;
       TH1=TL1=0;
       err=1;
       break;
      }        
     }
    while(shou==1);      //等待低电平到来
    th=TH1;
    tl=TL1;
    TH1=TL1=0;
    l=th;
    l=((l<<8)+tl);
    //  if((l>460)&&(l<760))    //短为0  短610
    if(((l>(m-(m/4)))&&(l<(m+(m/4)))))
     {
      i++;
      ma1>>=1;
     }
    //  else if((l>1577)&&(l<1977))  //长为1  长1777
    else if(((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2)))))
     {
      i++;
      ma1>>=1;
      ma1+=128;
     }
    else        //不符合规则出错
     {
      i=0;
      TR1=0;
      TH1=TL1=0;
      err=1;
      break;
     }
    if(i==8)
     {
      ma3=ma1;
      //SBUF=ma3;
      //P1=ma3;
     }
    if(i==16)
     {
      ma2=ma1;
      //SBUF=ma2;
      //P1=ma2;
     }
    if(i==24)////解码成功结束
     {
      
      if(TimeCount==0)//为0表示是新的一次按下对其进行处理,如过该值大于0表示已经按下不在处理
       {
        ACC=ma1;
        if(ACC==0xC0)
        //P1=0xef;
        P1_0=~P1_0;
        if(ACC==0x30)
        //P1=0xdf;
        P1_1=~P1_1;
        if(ACC==0x0c)
        //P1=0xbf;
        P1_2=~P1_2;
        if(ACC==0x03)
        //P0=0x7f;
        P1_3=~P1_3;
       }
      TimeCount=30;//防止按键没放开直在取反,保证按1次只做1次处理
     }
   }
  TR1=0;
  TH1=0;
  TL1=0;
  EX0=1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。