找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1800|回复: 1
打印 上一主题 下一主题
收起左侧

STC89C52单片机EV1527/PT2262无线遥控接受解码程序

[复制链接]
跳转到指定楼层
楼主
ID:1066697 发表于 2023-3-15 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
EV1527 / PT2262学习型接收解码    315或433M频率

单片机源程序如下:
  1. /****************************************************************
  2. * 作者    :maigaokai
  3. *************************************************************/


  4. /*
  5. 1、EV1527/PT2262 按键解码输出,并有解码有效输出端。

  6. 2、程序采用中断嵌套结构,定时时间准确,可轻松集成到您现有程序中,解码精度不受其他程序块影响。

  7. 3、通过学习键可学习40个遥控器编码,使用芯片自带EEPROM,无需外挂存储。

  8. 4、提供keil5 c代码,有详细注释,提供网络技术支持。

  9. 该源码适合初学者研究,或想在原有产品中增加功能又缺乏此类经验的朋友。


  10. !!!按一下学习键指示灯亮一下灭,松开,再按一下遥控器,学习指示灯闪一下,表示学习成功
  11. 学习成功后,才能接收此遥控器的数据,否则没反应!!!

  12. !!!按下学习按键6秒之内松开,超过6秒后无效并清除以前存储的遥控器数据
  13. */






  14. #include "main.h"


  15. bit old_bit;           //保存上一次查询到的电平状态
  16. bit tb_ok;             //接收到同步的马时置1   
  17. bit rf_ok;            //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
  18. bit study;                  //进入学习状态标志   
  19. bit rf_ok1,rf_ok2;        //接收成功临时标志



  20. uchar  hh_w,ll_w;           //高,低电平宽度
  21. uchar  ma_n;                //接收到第几位编码了
  22. uchar  bma1,bma2,bma3,bma4; //用于接收过程存放遥控编码
  23. uchar  mma1,mma2,mma3,mma4; //第一次接收到的编码,用于解码过程
  24. uchar  mmb1,mmb2,mmb3,mmb4; //第二次接收到的编码


  25. uchar temp_T0;                        //t初值


  26. uint s_tim;                //定时






  27. #if 1

  28. void rx_data()
  29.    {          
  30.      uchar x;   

  31.      
  32.                      
  33.           TMR0=100;
  34.           TMR00;
  35.                   
  36.                        

  37.                 




  38.    
  39.      if (!RF) { ll_w++;old_bit=0; }  // 检测到低电平 低电平时间加1,记录本次电平状态  old_rc5=保存上一次查询到的电平状态
  40.      
  41.      
  42.      

  43.      else        // 检测到高电平
  44.        {
  45.          

  46.          
  47.                hh_w++;//记录高电平时间
  48.          
  49.          if (!old_bit)// 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
  50.           {
  51.       
  52.             
  53.            
  54.             
  55.            if (((hh_w>=2)&&(hh_w<=7))&&((ll_w>=50)&&(ll_w<=180)))          //判同步码          
  56.                {                                                       //下面是同步码低电平判断
  57.                                     if((ll_w>=100)&&(ll_w<=180))//PT2262=4.7M电阻,EV1527=390K
  58.                     {ma_n=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bma4=0;
  59.                     }

  60.                     
  61.                 }

  62.                
  63.                
  64.            else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=16)))         //数据低电平   
  65.                                          {        
  66.                                                  ma_n++;                                //已经接收到同步码,判为0
  67.                                                  if(ma_n>23)
  68.                                                          {
  69.                                                            if(!rf_ok1)
  70.                                                                    {
  71.                                                                    mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中                             
  72.                                        rf_ok1=1;
  73.                                        ma_n=0;                           
  74.                                        tb_ok=0;
  75.                                                                    s_tim=2500;                                                   
  76.                                                                    }
  77.                                                                 else
  78.                                                                         {
  79.                                                                          mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的编码复制到解码寄存器中                             
  80.                                          rf_ok2=1;
  81.                                          ma_n=0;                              
  82.                                          tb_ok=0;                                                                                                                                               
  83.                                                                         }
  84.                                                                
  85.                                                          }
  86.                                           }  
  87.                  
  88.                   
  89.                   
  90.                   
  91.             else if ((tb_ok)&&((ll_w>=3)&&(ll_w<=6)))                   //数据高电平   
  92.                  { switch (ma_n)
  93.                      {
  94.                                           case 0 : { bma1=bma1 | 0x80; break; }//遥控地址编码第1位
  95.                        case 1 : { bma1=bma1 | 0x40; break; }
  96.                        case 2 : { bma1=bma1 | 0x20; break; }
  97.                        case 3 : { bma1=bma1 | 0x10; break; }
  98.                        case 4 : { bma1=bma1 | 0x08; break; }
  99.                        case 5 : { bma1=bma1 | 0x04; break; }
  100.                        case 6 : { bma1=bma1 | 0x02; break; }
  101.                        case 7 : { bma1=bma1 | 0x01; break; }

  102.                        case 8 : { bma2=bma2 | 0x80; break; }
  103.                        case 9 : { bma2=bma2 | 0x40; break; }
  104.                        case 10: { bma2=bma2 | 0x20; break; }
  105.                        case 11: { bma2=bma2 | 0x10; break; }
  106.                        case 12: { bma2=bma2 | 0x08; break; }
  107.                        case 13: { bma2=bma2 | 0x04; break; }
  108.                        case 14: { bma2=bma2 | 0x02; break; }
  109.                        case 15: { bma2=bma2 | 0x01; break; }

  110.                        case 16: { bma3=bma3 | 0x80; break; }//2262按键码第1位
  111.                        case 17: { bma3=bma3 | 0x40; break; }
  112.                        case 18: { bma3=bma3 | 0x20; break; }
  113.                        case 19: { bma3=bma3 | 0x10; break; }
  114.                        case 20: { bma4=bma4 | 0x80; break; }//1527按键码第1位
  115.                        case 21: { bma4=bma4 | 0x40; break; }
  116.                        case 22: { bma4=bma4 | 0x20; break; }
  117.                        case 23:
  118.                            { bma4=bma4 | 0x10;                                          
  119.                                           if(!rf_ok1)
  120.                                                    {
  121.                                                   mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中                             
  122.                                       rf_ok1=1;                                
  123.                                       tb_ok=0;
  124.                                                   ma_n=0;
  125.                                                   s_tim=2500;
  126.                                                   break;                                                                       
  127.                                                   }
  128.                                                  else
  129.                                                       {
  130.                                                        mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将再次接收到的编码复制到解码寄存器中,                             
  131.                                        rf_ok2=1;                                
  132.                                        tb_ok=0;
  133.                                                        ma_n=0;
  134.                                                        break;                                                                                                                                                       
  135.                                                        }
  136.                                    
  137.                             }
  138.                      }
  139.                     ma_n++;
  140.                                        
  141.                   }
  142.                  
  143.                   
  144.             else {ma_n=0; tb_ok=0;bma1=0; bma2=0; bma3=0; bma4=0;hh_w=1;ll_w=0;}      //接收到不符合的高-低电平序列
  145.               
  146.                    ll_w=0;hh_w=1;
  147.                            }
  148.          
  149.          
  150.         old_bit=1;      // 记录本次电平状态
  151.      }
  152.   
  153.      
  154.      
  155.      
  156.      

  157.          if(rf_ok1)                //规定时间内接受到2帧相同的编码数据才有效
  158.                 {       
  159.       
  160.    
  161.       
  162.                         s_tim--;
  163.                         if(!s_tim) rf_ok1=0;
  164.                         if(rf_ok2)
  165.                                 {
  166.         

  167.          
  168.                                   if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3)&&(mma4==mmb4))//比较两次接收到的编码是否一致 OK
  169.                                            {
  170.                                           
  171.                                           rf_ok=1;
  172.                                           rf_ok1=0;
  173.                                           rf_ok2=0;                                         
  174.                                          }
  175.                                         else//接收数据无效  
  176.                                          {
  177.                                                   rf_ok=0;
  178.                                                   rf_ok1=0;
  179.                                                   rf_ok2=0;                                          
  180.                      }
  181.                                                                  
  182.                                 }                                       
  183.                   }
  184.                
  185.                        
  186.                        
  187.                        
  188.         #if defined(STUDY_NOSET)
  189.    if(rf_ok)                 //判断
  190.                         {         
  191.                                 GIE=0;
  192.                                 rf_ok=0;
  193.                                 if(((mma3==0xc0)&&(!mma4))|((mma3==0x30)&&(!mma4))|((!mma3)&&(mma4==0xc0))|((!mma3)&&(mma4==0x30)))   //判断是2262编码
  194.                                         {  

  195.                   D0=(mma3 - 0xc0);    //取按键码          
  196.                                                                         D1=(mma3 - 0x30);
  197.                                                                         D2=(mma4 - 0xc0);
  198.                                                                         D3=(mma4 - 0x30);
  199.             
  200.                                                                         decode_ok=0;
  201.                                                                         s=1500;

  202.                                                                                 
  203.                                         }
  204.                                         else                                         //判断是1527编码
  205.                                                 {         
  206.                
  207.                       D0=(mma4 - 0x80);    //取按键码          
  208.                                                                                         D1=(mma4 - 0x40);
  209.                                                                                         D2=(mma4 - 0x20);
  210.                                                                                         D3=(mma4 - 0x10);       
  211.               
  212.                                                                                         decode_ok=0;                                       
  213.                                                                                         s=1500;        //解码有效输出时间                                                       
  214.                                                                                                
  215.                                                 }
  216.                                          GIE=1;
  217.                         }                       
  218.                         #endif
  219.                        
  220.       
  221.       
  222.       #if defined(STUDY_SET)
  223. ////////////////////////////////////////////////////////////////////                       
  224. if((rf_ok)&&(!study))                 //判断是否是学习状态
  225.                         {         
  226.                
  227.                                 rf_ok=0;
  228.                                 if(((mma3==0xc0)&&(!mma4))|((mma3==0x30)&&(!mma4))|((!mma3)&&(mma4==0xc0))|((!mma3)&&(mma4==0x30)))   //判断是2262编码
  229.                                         {  
  230.                                            for(x=0;x<40;x++)
  231.                                                    {
  232.                                                         if((mma1==EEPROM_read(x*3+1))&&(mma2==EEPROM_read(x*3+2)))
  233.                                                                 {
  234.                                                                         D0=(mma3 - 0xc0);    //取按键码          
  235.                                                                         D1=(mma3 - 0x30);
  236.                                                                         D2=(mma4 - 0xc0);
  237.                                                                         D3=(mma4 - 0x30);       
  238.        
  239.                                                                         decode_ok=0;
  240.                                                                         s_tim=1500;
  241.                                                                         break;
  242.                                                                 }
  243.                                                                                                
  244.                                                 }
  245.                                                                                 
  246.                                         }
  247.                                         else                                         //判断是1527编码
  248.                                                 {         
  249.                                                      for(x=0;x<40;x++)
  250.                                                                    {   
  251.                                                                         if((mma1==EEPROM_read(x*3+1))&&(mma2==EEPROM_read(x*3+2))&&(mma3==EEPROM_read(x*3+3)))
  252.                                                                                 {                                                                                       
  253.                                                                                         D0=(mma4 - 0x80);    //取按键码          
  254.                                                                                         D1=(mma4 - 0x40);
  255.                                                                                         D2=(mma4 - 0x20);
  256.                                                                                         D3=(mma4 - 0x10);       
  257.                                                                                                                                                  
  258.                                                                                         decode_ok=0;                                       
  259.                                                                                         s_tim=1500;        //解码有效输出时间
  260.                                                                                         break;
  261.                                                                                 }
  262.                                                                                                                
  263.                                                                 }
  264.                                                                                                
  265.                                                 }
  266.                                        
  267.                         }                       

  268. /////////////////////////////////////////////////////////////////////////
  269.    #endif
  270.       
  271.       
  272.       
  273.       
  274.       
  275.       
  276.       
  277.       
  278.       
  279.      if(!decode_ok)//解码有效输出
  280.                   {
  281.                           s_tim--;
  282.                           if(!s_tim)
  283.                                  {
  284.                                         decode_ok=1;//关信号灯
  285.                                         if(!LM_SEL)    //  锁存/暂态 选择
  286.                                                 {
  287.                                                         D0=1;
  288.                                                         D1=1;
  289.                                                         D2=1;
  290.                                                         D3=1;
  291.                                                 }
  292.                                  }
  293.                                   
  294.                    }


  295.    }


  296. #endif

  297.    
  298.    
  299.    
  300.    
  301.    
  302.    
  303.    
  304.    
  305.    
  306.    
  307.    
  308.    
  309.    
  310.    
  311.    
  312.    
  313. void KEY_study()        //遥控器学习
  314. {       
  315.         uchar num_rf;
  316.         uchar d_num=0;                       

  317. ……………………

  318. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
Keil代码下载:
Keil代码.7z (24.53 KB, 下载次数: 80)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1045494 发表于 2024-7-23 20:59 | 只看该作者
楼主,晶振频率多少!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表