磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8685|回复: 25

PT2262解码C源代码

[复制链接]
发表于 2011-2-28 22:27:00 | 显示全部楼层 |阅读模式

最近有些朋友在找PT2262的解码源代码,我找到一份自己2007年写的代码,还有上位机,有兴趣的朋友可以参考一下

 

/*----------------------------------------

PT2262红外解码

Copyright 2007/1/24
All rights reserved.  
  
 明浩 E-mail: pnzwzw@163.com   pnzwzw@cdle.net

一体化接收头输出端拉P3.2(int0),P1为接收机ID设置
----------------------------------------*/

#include <AT89x051.h>

void InitCom(void);
void ComOutChar(unsigned char OutData);
//void DelayA(void);
//void DelayB(void);
//void DelayC(void);
unsigned char IRNum;
unsigned int IRCodeOld;

void main(void)
{
 unsigned int TempCyc;

 InitCom(); //初始化串口
 EA = 1; //允许CPU中断
 IT0 = 1; //INT0下降沿有效
 EX0 = 1; //开INT0中断;
 IRNum = 0; //接收次数
 IRCodeOld = 0;

 do
  { 
   for (TempCyc=0; TempCyc<35000; TempCyc++)
    P3_7 = 0;
   for (TempCyc=0; TempCyc<30000; TempCyc++)
    P3_7 = 1;  //工作指示LED
  }
 while(1);
}

//INT0中断
void INT0Fun(void) interrupt 0 using 2
{
 unsigned char IROK;
 unsigned char A,B;
 unsigned int TempCyc, IRCode, TempCycA, TempCycB;
 EX0 = 0; //外部中断0关闭
 IROK = 1; //设解码OK
 for (TempCyc=0; TempCyc<200; TempCyc++)
  if (P3_2) break; //等待拉高 这里没有用White
 for (TempCyc=0; TempCyc<2000; TempCyc++) //检测同步位后半部
  {
   if (!P3_2) break; //有拉低时跳出 124a*50us=6200us
  }
 if ((TempCyc>660)&&(TempCyc<900)) //690大约是6ms
  {
   for (TempCyc=0; TempCyc<12; TempCyc++)
    {
     for (TempCycA=0; TempCycA<500; TempCycA++)
      if (P3_2) break; //等待上升沿
     for (TempCycB=0; TempCycB<500; TempCycB++)
      if (!P3_2) break; //等待下降沿
     if (TempCycA==TempCycB)
      IROK = 0; //出错 抗干扰 
     if (TempCycA>TempCycB)
      A = 0;
     else
      A = 1;
     for (TempCycA=0; TempCycA<500; TempCycA++)
      if (P3_2) break; //等待上升沿
     for (TempCycB=0; TempCycB<500; TempCycB++)
      if (!P3_2) break; //等待下降沿
     if (TempCycA>TempCycB)
      B = 0;
     else
      B = 1;
     if (TempCycA==TempCycB)
      IROK = 0; //出错 抗干扰 
     IRCode <<= 1;
     if ((A==0)||(B==0))
      IRCode++;
      //a=1,b=1则是位0,a=0,b=0则是位1,a=1,b=0则是悬空,a=0,b=1则是出错
     if ((A==0)&&(B==1))
      IROK = 0; //出错
    }  

   if (IROK==1)
    {
     IRNum++;
     if (IRNum==2)
      {
       IRNum = 0;
       if (IRCodeOld==IRCode) //比较数据
        {
         A = IRCode>>4;//取地址位
         ComOutChar(A);
         A = IRCode&0x0F;//取数据位
         ComOutChar(A);
         ComOutChar(P1);  //连接PC串口查看数据位、地址位、ID
        }
       else
        IRCodeOld = IRCode; //用于2次取样对比
      }
    }
   else
    IRNum = 0;
  }
 EX0 = 1;
}

//向串口输出一个字符(非中断方式)
void ComOutChar(unsigned char OutData)
{
 SBUF = OutData; //输出字符
 while(!TI); //空语句判断字符是否发完
 TI = 0; //清TI
}

//串口初始化 晶振为11.0592M 方式1 波特率9600
void InitCom(void)
{
 SCON = 0x50; //串口方式1,允许接收
 TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
 TCON = 0x40; //设定时器1开始计数
 TH1 = 0xFA; //设波特率为9600
 TL1 = 0xFA;
 PCON = 0x80; //波特率加倍控制,SMOD位
 RI = 0; //清收发标志
 TI = 0;
 TR1 = 1; //启动定时器
}

/*void DelayA(void)
{
 unsigned int TempCyc;
 for (TempCyc=0; TempCyc<3480; TempCyc++); //19.2ms 12个AD位
}*/

/*void DelayB(void)
{
 unsigned int TempCyc;
 for (TempCyc=0; TempCyc<22; TempCyc++); // 一个窄脉冲200us
}*/

/*void DelayC(void)
{
 unsigned int TempCyc;
 for (TempCyc=0; TempCyc<1130; TempCyc++); // 一个同步脉冲6.4ms 这里只算3ms
}*/

 

9JzWu6br.rar (190.66 KB, 下载次数: 3441)
回复

使用道具 举报

发表于 2011-3-1 00:43:00 | 显示全部楼层

[em51]

 

好东西!谢谢明大!

回复 支持 反对

使用道具 举报

发表于 2011-3-1 21:43:00 | 显示全部楼层
谢谢!请问发射器电阻是多大的呢?要是无线遥控解码就好了
[此贴子已经被作者于2011-3-1 21:47:37编辑过]
回复 支持 反对

使用道具 举报

发表于 2011-3-2 10:55:00 | 显示全部楼层
看了下楼主的程序,实际中无线接收模块一直有干扰脉冲输出的,我用楼主的程序测试了下,用中断的方式没有成功,单片机忙着处理中断了。。。
回复 支持 反对

使用道具 举报

发表于 2011-3-2 11:22:00 | 显示全部楼层

谢谢分享。。[em59]

[此贴子已经被作者于2011-3-2 11:21:43编辑过]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-2 11:10:00 | 显示全部楼层
这代码是用于红外的 要用玩无线还要加些抗干扰代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-2 12:51:00 | 显示全部楼层
我用51做过相关的解、编码,无线的干扰是可以解决的,
回复 支持 反对

使用道具 举报

发表于 2011-3-4 17:52:00 | 显示全部楼层
谢谢,明浩,支持开源!谢谢!
回复 支持 反对

使用道具 举报

发表于 2011-3-4 12:51:00 | 显示全部楼层
lmkq7DjL.txt (2.43 KB, 下载次数: 1364)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-5 00:59:00 | 显示全部楼层

因是客户订制的记录和重放项目,只可给出中断子程序大家参考 是用于无线的 后续的项目也是从这些代码修改得到更好的抗干扰性

 

//INT0中断
void INT0Fun(void) interrupt 0
{
 unsigned char IROK;
 unsigned char CA,CB;
 unsigned int TempCyc, TempCycA, TempCycB;
 unsigned char * PP;

 EX0 = 0; //外部中断0关闭
 IROK = 1; //设解码OK
 IRCode = 0;
 KT = 0; //标识有键按下
  for (TempCyc=0; TempCyc<500; TempCyc++) //检测同步位后半部 每次按钮时会发4次码,这里先检测第一次发射的同步位
  {
   if (SIO) break; //有拉高时跳出
  }
 if ((TempCyc>389)&&(TempCyc<479)) //<3ms >3.8ms
  {
   for (TempCyc=0; TempCyc<12; TempCyc++)
    {
     for (TempCycA=0; TempCycA<100; TempCycA++)
      if (!SIO) break; //等待下降沿
     for (TempCycB=0; TempCycB<100; TempCycB++)
      if (SIO) break; //等待上升沿
     if (TempCycA==TempCycB)
      IROK = 0; //出错 抗干扰 
     else
      {
       if (TempCycA>TempCycB)
        {
         CA = 0;
        }
       else
        {
         CA = 1;
        }
      }
     for (TempCycA=0; TempCycA<100; TempCycA++)
      if (!SIO) break; //等待下降沿
     for (TempCycB=0; TempCycB<100; TempCycB++)
      if (SIO) break; //等待上升沿
     if (TempCycA==TempCycB)
      IROK = 0; //出错 抗干扰 
     else
      {
       if (TempCycA>TempCycB)
        {
         CB = 0;
        }
       else
        {
         CB = 1;
        }
      }
     IRCode <<= 1;
     IRCode = IRCode + CA;
     IRCode <<= 1;
     IRCode = IRCode + CB;
      //a=1,b=1则是位0,a=0,b=0则是位1,a=1,b=0则是悬空,a=0,b=1则是出错
     if ((CA==0)&&(CB==1))
      IROK = 0; //出错
    }  

   if (IROK==1)
    {       
     IRNum++;
     if (IRNum==2) //这里是第三次发射采集完成后 第二、三次的码对比,如不一致则出错。
      {
       IRNum = 0;

       if (IRCodeOld==IRCode) //比较数据
        {
         //ET0 = 0;
         //TR0 = 0; //关断定时器
         LED = 0;

         CB = ((KeyV-1) * 4 * RCount) + (RecCount * 4);
         PP = 100;
         Write_24C(CB, *PP);
         PP = 101;
         Write_24C(CB+1, *PP);
         PP = 102;
         Write_24C(CB+2, *PP);
         PP = 103;
         Write_24C(CB+3, *PP);

         RecCount++;
         if (RecCount == RCount) //最多记录10个按键
          RecCount = RCount - 1;
         for (TempCycA=0; TempCycA<150; TempCycA++) //led亮1.5秒
          Delay10ms();

         LED = 1;
         //ET0 = 1;
         //TR0 = 1; //开定时器
        }
      }
     else
      {
       //if (IRCode == IRCodeOld)
        //IRNum = 0; //这里禁止了连续二个按键
       //else
        IRCodeOld = IRCode; //用于2次取样对比
      }
    }
   else
    IRNum = 0;
  }
 EX0 = 1;
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-5 01:01:00 | 显示全部楼层

PT2262解码C源代码

PT2262解码C源代码

回复 支持 反对

使用道具 举报

发表于 2011-3-4 19:31:00 | 显示全部楼层
QUOTE:
以下是引用明浩在2011-3-2 12:51:00的发言:
我用51做过相关的解、编码,无线的干扰是可以解决的,

浩哥能否分享下无线的原程序。谢谢!距离有三五米远就行了。

回复 支持 反对

使用道具 举报

发表于 2011-3-5 13:04:00 | 显示全部楼层
QUOTE:
以下是引用明浩在2011-3-5 1:01:00的发言:

图片点击可在新窗口打开查看此主题相关图片如下图片 001.jpg:

谢!好好睇下先,请问遥控器的电阻值,跟单片机的振荡器多大才行呢?

红外线的自己已做到了但角度太小且不能摭挡不是很方便,看到淘宝很多卖无线遥控开自已也想做个遥控灯泡的玩玩。

[此贴子已经被作者于2011-3-5 13:11:42编辑过]
回复 支持 反对

使用道具 举报

发表于 2011-3-5 21:20:00 | 显示全部楼层
/******************************************
******* 文件名:Decode.c
******* 描述:对PT2262的编码信号进行解码PT2262的输出信号经三极管反向后送入单片机的中断引脚
******* 代码:A0 -- A11 中的每bit用2bit表示:0码:00 ;1码:11
******* 备注:PT2262输出数据的顺序:A0 A1 -- A10 A11+同步码+A0 A1 -- A10 A11+同步码,连续发四次
*******************************************/
#include<reg51.h> //51系列头文件
#include<intrins.h> //方便调用_nop_();做延时用;
unsigned char Receive[3] ;    //解码缓冲区:Receive[0]:A0 A1 A2 A3 ; Recdive[1]:A4 A5 A6 A7 ; Receive[2]: D3 D2 D1 D0
//Recdive[x]:xx xx xx xx 代表4bit
bit flag = 0 ;  //解码完成标志位
sbit RemPin = P3^2 ; //编码信号输入脚
/******************************************************
函数名:INT0_ISR( )
描  述: 外部中断0服务函数,实现对PT2262的解码
参  数:输入参数:无
输出参数:无
*******************************************************/
void INT0_ISR(void) interrupt 0 using 1
 {
  unsigned char i = 0 ;
  unsigned char j = 0 ;
  unsigned int temp = 0x0000;
  //EA = 0 ;
  TH0 = 0 ;
  TL0 = 0 ;
  while( !RemPin) ; //等待高电平的到来,检测同步头
  TR0 = 1 ;   //启动定时器0,开始测量高电平的宽度
  while( RemPin)
   {
    if( TF0 == 1 )
     {
      goto RemExit;  //定时器超时溢出则退出
     }
   }
  TR0 = 0 ;
  temp = TH0 ;
  temp = temp << 8 ;
  temp = temp + TL0 ; //取得高电平的宽度
  if( ( 0x36B0 < temp ) && ( temp < 0x4100) )  //检测到同步头
   {
    for( j = 0 ; j < 3 ; j ++) //循环3次
     {
      for( i = 0 ; i < 8; i ++ )
       {
        TH0 = 0 ;
        TL0 = 0 ;
        while( !RemPin);//等待高电平到来
        TR0 = 1 ;  //开启定时器0 ,测量高电平的宽度
        while( RemPin)
         {
          if( TF0 == 1 )
           {
            goto RemExit; //定时溢出则退出
           }
         }
        TR0 = 0 ;
        temp = TH0 ;
        temp = temp << 8 ;
        temp = temp + TL0 ;  //取得高电平的宽度
        if( ( 1000 < temp ) && (temp< 1800 ) ) //判断得窄脉冲:1表示
         {
          Receive[j] = Receive[j] << 1 ;
          Receive[j] = Receive[j] + 0x01 ;
         }
        else if( ( 300 < temp) && (temp< 700) )//判断得宽脉冲:0表示
         {
          Receive[j] = Receive[j] << 1 ;
         }
        else
        return;   
       }
     }
    flag = 1 ;      //表示已解码完毕
    return;
   }
  else
   {
    goto RemExit;
   }
  RemExit:
   {
    TR0 = 0 ;
    //TR1=1;
    EA = 1 ;
    TF0 = 0 ;
    RemPin = 1 ;
    return;
   } 
 }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-5 16:29:00 | 显示全部楼层

再发另一段改良的,给大家参考,里面功能要自己去掉才可以用,使用STC12C2052AD 内部6M晶体 12T 遥控器电阻没要求使用PT2262推荐标准值就行了

 

//INT0中断
void INT0Fun(void) interrupt 0
{
 unsigned char IROK;
 unsigned char CA,CB,CC,CD;
 unsigned int TempCyc, TempCycA, TempCycB;
 unsigned char *PP;
 unsigned long IRCodeV;

// WDT_CONTR=0x56; //喂狗

 EA = 0; //中断关闭 

 IROK = 1; //设解码OK
 IRCode = 0;
  for (TempCyc=0; TempCyc<7001; TempCyc++) //检测同步位后半部 每次按钮时会发4次码,这里先检测第一次发射的同步位
  {
   if (Port_DIN) break; //有拉高时跳出
  }
 if ((TempCyc>1000)&&(TempCyc<7000)) //>2.8ms <15.8ms 片内RC实测每K为2.6ms
  {  
   for (TempCyc=0; TempCyc<12; TempCyc++)
    {
     for (TempCycA=0; TempCycA<1500; TempCycA++)
      if (!Port_DIN) break; //等待下降沿
     for (TempCycB=0; TempCycB<1500; TempCycB++)
      if (Port_DIN) break; //等待上升沿
     if ((TempCycA==0) || (TempCycB==0))
      IROK = 0; //如电平一直在一状态会出现其中一个为0
     if (TempCycA==TempCycB)
      IROK = 0; //出错 抗干扰 
     else
      {
       if (TempCycA>TempCycB)
        {
         CA = 1;
        }
       else
        {
         CA = 0;
        }
      }
     for (TempCycA=0; TempCycA<1500; TempCycA++)
      if (!Port_DIN) break; //等待下降沿
     for (TempCycB=0; TempCycB<1500; TempCycB++)
      if (Port_DIN) break; //等待上升沿
     if ((TempCycA==0) || (TempCycB==0))
      IROK = 0; //如电平一直在一状态会出现其中一个为0
     if (TempCycA==TempCycB)
      IROK = 0; //出错 抗干扰 
     else
      {
       if (TempCycA>TempCycB)
        {
         CB = 1;
        }
       else
        {
         CB = 0;
        }
      }
     IRCode <<= 1;
     IRCode = IRCode + CA;
     IRCode <<= 1;
     IRCode = IRCode + CB;
      //a=1,b=1则是位1,a=0,b=0则是位0,a=0,b=1则是悬空,a=1,b=0则是出错
     if ((CA==1)&&(CB==0))
      IROK = 0; //出错
    }  

   if (IROK==1)
    {   
     CA = 0;
     IRNum++;
     if (IRNum==2) //这里是第三次发射采集完成后 第二、三次的码对比,如不一致则出错。
      {
       IRNum = 0;

       if (IRCodeOld==IRCode) //比较数据 执行
        {
         P = 102;
         CD = *PP & 0x0F; //IRCODE 的第二字节的低4位为第78脚

         if (Port_ModelSet)
          {
           if (KeyS) //设置态时
            {
             if (CD!=5) //7、8脚波形0101
              {
               KeyS = 0; //不为悬空时退出设置态
               goto endMO;
              }
            }
          }

          //搜寻
           IROK=0;
           for (CB=0; CB<2; CB++)
            {
             for (CC=0; CC<10; CC++)
              {
               IRCodeV = 0;
               for(CA=1; CA<5; CA++)
                {
                 IRCodeV = IRCodeV << 8;
                 IRCodeV = IRCodeV+TE[CB][CC*4+CA];
                }
               if (KeyS==0) //非设置态的模式2处理
                {
                 if (Port_ModelSet) //模式2处理
                  {
                   IRCodeV = IRCodeV & 0xFFFFF0FF;
                   IRCode = IRCode & 0xFFFFF0FF;
                  }
                }
               if (IRCodeV == IRCode)
                IROK = CB+1;
              }
            }        

         if (KeyS) //设置态
           {
           if (IROK)
            {
             KeyS = 0;  //不能重复设置
             DelayMs(500);
             goto endMO;
            }
           /*for (CB=0; CB<2; CB++) //不能重复设置
            {
             for (CC=0; CC<10; CC++)
              {
               IRCodeV = 0;
               for(CA=1; CA<5; CA++)
                {
                 IRCodeV = IRCodeV << 8;
                 IRCodeV = IRCodeV+TE[CB][CC*4+CA];
                }

               if (IRCodeV == IRCode)
                goto endMO;
              }
            }*/

           CB = KeyS-1;
           TE[CB][0]++;
           if (TE[CB][0]>10)
            TE[CB][0]=10; //只保存10个,超出的在10上覆盖
           P = 100;
           CC = (TE[CB][0]-1)*4+1;
           for (CA=CC; CA<CC+4; CA++)
            {
             TE[CB][CA] = *PP;
             P++;
            } 

           if (KeyS==1) //擦除EEPROM
            Sector_Erase(0);
           else
            Sector_Erase(0x200);

           //DelayMs(3);

           for (CA=0; CA<41; CA++)
            {
             if (KeyS==1)            
              Byte_Program(CA, TE[CB][CA]);
             else
              Byte_Program(CA+0x200, TE[CB][CA]); 
             //DelayMs(1);
            }
           LEDFlash(CB+1);               
           KeyS = 0;
          }
         else //正常运行
          { 
           
           /*IROK = 0;
           for (CB=0; CB<2; CB++)
            {
             for (CC=0; CC<10; CC++)
              {
               IRCodeV = 0;
               for(CA=1; CA<5; CA++)
                {
                 IRCodeV = IRCodeV << 8;
                 IRCodeV = IRCodeV+TE[CB][CC*4+CA];
                }
               if (Port_ModelSet) //模式2处理
                {
                 IRCodeV = IRCodeV & 0xFFFFF0FF;
                 IRCode = IRCode & 0xFFFFF0FF;
                }
               if (IRCodeV == IRCode)
                IROK = CB+1;
              }
            }*/

           if (IROK)
            {
             if (Port_ModelSet) //模式2处理
              {
               if (CD==1) //7脚0 8脚悬空
                {
                 if (IROK==1)
                  {
                   RelayS1 = 0; //强制开
                  }
                 else
                  {
                   RelayS2 = 0; //强制开
                  }
                 //RelaySSet(IROK);
                 goto endMO;
                }
               if (CD==4) //8脚0 7脚悬空
                {
                 if (IROK==1)
                  {
                   RelayS1 = 1; //强制关
                  }
                 else
                  {
                   RelayS2 = 1; //强制关
                  }
                 //RelaySSet(IROK);
                 goto endMO;
                }
               if (CD==0) //7/8脚0
                {
                  OS2 = 1;
                 RelayS1 = 1; //强制全关
                 RelayS2 = 1;
                 //RelaySSet(1);
                 //RelaySSet(2);
                 goto endMO;
                }
              }

            if (Port_RelaySet)  //点动模式下
            {
             if (IROK==1)
              {
               RelayS1 = 0;
               RelaySSet(IROK);
               IRDD = 1;
               IRDT = 10;
              }
             if (IROK==2)
              {
                RelayS2 = 0;
               RelaySSet(IROK);
               IRDD = 2;
               IRDT = 10;
              }            
            }
            else
            {
             if (IRFS==0)
              {
               RelayRun(IROK);
               //RelaySSet(IROK);
              }
             IRFS = 1;
             //DelayMs(200);
            }
         }
        } ///
       }
      }
     else
      {
       IRCodeOld = IRCode; //用于2次取样对比
      }
    }
   else
    IRNum = 0;
  }
endMO:
 EA = 1;
}

回复 支持 反对

使用道具 举报

发表于 2011-3-5 18:49:00 | 显示全部楼层

随便乱改了一下,对pt2262用1.5m电阻315m无线好像串口能输出了,还有待研究。。。。。。

/*----------------------------------------
PT2262红外解码
Copyright 2007/1/24
All rights reserved.  
 明浩 E-mail: pnzwzw@163.com   pnzwzw@cdle.net
一体化接收头输出端拉P3.2(int0),P1为接收机ID设置
----------------------------------------*/
#include <AT89x51.h>
void InitCom(void);
void ComOutChar(unsigned char OutData);
//void DelayA(void);
//void DelayB(void);
//void DelayC(void);
unsigned char IRNum;
unsigned int IRCodeOld;
void main(void)
{
 unsigned int TempCyc;
 InitCom(); //初始化串口
 EA = 1; //允许CPU中断
 IT0 = 1; //INT0下降沿有效
 EX0 = 1; //开INT0中断;
 IRNum = 0; //接收次数
 IRCodeOld = 0;
 do
  {
   for (TempCyc=0; TempCyc<15000; TempCyc++)
    P1_7 = 0;
   for (TempCyc=0; TempCyc<10000; TempCyc++)
    P1_7 = 1;  //工作指示LED
  }
 while(1);
}
//INT0中断
void INT0Fun(void) interrupt 0 using 2
{
 unsigned char IROK;
 unsigned char A,B;
 unsigned int TempCyc, IRCode, TempCycA, TempCycB;
 EX0 = 0; //外部中断0关闭
 IROK = 1; //设解码OK
 

//==========================================================================

for (TempCyc=0; TempCyc<500; TempCyc++) //检测同步位后半部 每次按钮时会发4次码,这里先检测第一次发射的同步位
 {
  if (P3_2) break; //有拉高时跳出
 }
if ((TempCyc>389)&&(TempCyc<479)) //<3ms >3.8ms
 {
  for (TempCyc=0; TempCyc<12; TempCyc++)
   {
    for (TempCycA=0; TempCycA<100; TempCycA++)
    if (!P3_2) break; //等待下降沿
    for (TempCycB=0; TempCycB<100; TempCycB++)
    if (P3_2) break; //等待上升沿
    if (TempCycA==TempCycB)
    IROK = 0; //出错 抗干扰
    else
     {
      if (TempCycA>TempCycB)
       {
        A = 0;
       }
      else
       {
        A = 1;
       }
     }
    for (TempCycA=0; TempCycA<100; TempCycA++)
    if (!P3_2) break; //等待下降沿
    for (TempCycB=0; TempCycB<100; TempCycB++)
    if (P3_2) break; //等待上升沿
    if (TempCycA==TempCycB)
    IROK = 0; //出错 抗干扰
    else
     {
      if (TempCycA>TempCycB)
       {
        B = 0;
       }
      else
       {
        B = 1;
       }
     }
    IRCode <<= 1;
    IRCode = IRCode + A;
    IRCode <<= 1;
    IRCode = IRCode + B;
    //a=1,b=1则是位0,a=0,b=0则是位1,a=1,b=0则是悬空,a=0,b=1则是出错
    if ((A==0)&&(B==1))
    IROK = 0; //出错
   } 
  if (IROK==1)
   {    
    IRNum++;
    if (IRNum==2) //这里是第三次发射采集完成后 第二、三次的码对比,如不一致则出错。
     {
      IRNum = 0;
      if (IRCodeOld==IRCode) //比较数据

       
//=======================================================================
        {
         A = IRCode>>4;//取地址位
         ComOutChar(A);
         A = IRCode&0x0F;//取数据位
         ComOutChar(A);
         ComOutChar(P1);  //连接PC串口查看数据位、地址位、ID
        }
       else
        IRCodeOld = IRCode; //用于2次取样对比
      }
    }
   else
    IRNum = 0;
  }
 EX0 = 1;
}
//向串口输出一个字符(非中断方式)
void ComOutChar(unsigned char OutData)
{
 SBUF = OutData; //输出字符
 while(!TI); //空语句判断字符是否发完
 TI = 0; //清TI
}
//串口初始化 晶振为11.0592M 方式1 波特率9600
void InitCom(void)
{
 SCON = 0x50; //串口方式1,允许接收
 TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
 TCON = 0x40; //设定时器1开始计数
 TH1 = 0xFA; //设波特率为9600
 TL1 = 0xFA;
 CON = 0x80; //波特率加倍控制,SMOD位
 RI = 0; //清收发标志
 TI = 0;
 TR1 = 1; //启动定时器
}

[此贴子已经被作者于2011-3-5 18:50:25编辑过]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-5 16:33:00 | 显示全部楼层

PT2262解码C源代码

PT2262解码C源代码

回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-5 16:36:00 | 显示全部楼层
1.2M电阻时的实测波形

PT2262解码C源代码

PT2262解码C源代码

PT2262解码C源代码

PT2262解码C源代码

PT2262解码C源代码

PT2262解码C源代码

PT2262解码C源代码

PT2262解码C源代码

回复 支持 反对

使用道具 举报

发表于 2011-8-13 20:51:00 | 显示全部楼层

自编的一个2262的51 解码程序   只是距离太近了 正在调整

回复 支持 反对

使用道具 举报

发表于 2011-8-13 20:52:00 | 显示全部楼层

怎么程序贴不出来?

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-6-17 06:56

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.