找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3248|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STC89C52單片機(jī)EV1527/PT2262無線遙控接受解碼程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1066697 發(fā)表于 2023-3-15 17:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
EV1527 / PT2262學(xué)習(xí)型接收解碼    315或433M頻率

單片機(jī)源程序如下:
  1. /****************************************************************
  2. * 作者    :maigaokai
  3. *************************************************************/


  4. /*
  5. 1、EV1527/PT2262 按鍵解碼輸出,并有解碼有效輸出端。

  6. 2、程序采用中斷嵌套結(jié)構(gòu),定時(shí)時(shí)間準(zhǔn)確,可輕松集成到您現(xiàn)有程序中,解碼精度不受其他程序塊影響。

  7. 3、通過學(xué)習(xí)鍵可學(xué)習(xí)40個(gè)遙控器編碼,使用芯片自帶EEPROM,無需外掛存儲。

  8. 4、提供keil5 c代碼,有詳細(xì)注釋,提供網(wǎng)絡(luò)技術(shù)支持。

  9. 該源碼適合初學(xué)者研究,或想在原有產(chǎn)品中增加功能又缺乏此類經(jīng)驗(yàn)的朋友。


  10. !�。“匆幌聦W(xué)習(xí)鍵指示燈亮一下滅,松開,再按一下遙控器,學(xué)習(xí)指示燈閃一下,表示學(xué)習(xí)成功
  11. 學(xué)習(xí)成功后,才能接收此遙控器的數(shù)據(jù),否則沒反應(yīng)!��!

  12. �。。“聪聦W(xué)習(xí)按鍵6秒之內(nèi)松開,超過6秒后無效并清除以前存儲的遙控器數(shù)據(jù)
  13. */






  14. #include "main.h"


  15. bit old_bit;           //保存上一次查詢到的電平狀態(tài)
  16. bit tb_ok;             //接收到同步的馬時(shí)置1   
  17. bit rf_ok;            //接收到一個(gè)完整的遙控命令后置1,通知解碼程序可以解碼了
  18. bit study;                  //進(jìn)入學(xué)習(xí)狀態(tài)標(biāo)志   
  19. bit rf_ok1,rf_ok2;        //接收成功臨時(shí)標(biāo)志



  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;                //定時(shí)






  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; }  // 檢測到低電平 低電平時(shí)間加1,記錄本次電平狀態(tài)  old_rc5=保存上一次查詢到的電平狀態(tài)
  40.      
  41.      
  42.      

  43.      else        // 檢測到高電平
  44.        {
  45.          

  46.          
  47.                hh_w++;//記錄高電平時(shí)間
  48.          
  49.          if (!old_bit)// 檢測到從低到高的跳變,已檢測到一個(gè)完整(高-低)電平周期
  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)))         //數(shù)據(jù)低電平   
  65.                                          {        
  66.                                                  ma_n++;                                //已經(jīng)接收到同步碼,判為0
  67.                                                  if(ma_n>23)
  68.                                                          {
  69.                                                            if(!rf_ok1)
  70.                                                                    {
  71.                                                                    mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//將接收到的編碼復(fù)制到解碼寄存器中                             
  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;//將接收到的編碼復(fù)制到解碼寄存器中                             
  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)))                   //數(shù)據(jù)高電平   
  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;//將接收到的編碼復(fù)制到解碼寄存器中                             
  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;//將再次接收到的編碼復(fù)制到解碼寄存器中,                             
  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;      // 記錄本次電平狀態(tài)
  151.      }
  152.   
  153.      
  154.      
  155.      
  156.      

  157.          if(rf_ok1)                //規(guī)定時(shí)間內(nèi)接受到2幀相同的編碼數(shù)據(jù)才有效
  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//接收數(shù)據(jù)無效  
  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;        //解碼有效輸出時(shí)間                                                       
  214.                                                                                                
  215.                                                 }
  216.                                          GIE=1;
  217.                         }                       
  218.                         #endif
  219.                        
  220.       
  221.       
  222.       #if defined(STUDY_SET)
  223. ////////////////////////////////////////////////////////////////////                       
  224. if((rf_ok)&&(!study))                 //判斷是否是學(xué)習(xí)狀態(tài)
  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;        //解碼有效輸出時(shí)間
  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;//關(guān)信號燈
  285.                                         if(!LM_SEL)    //  鎖存/暫態(tài) 選擇
  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()        //遙控器學(xué)習(xí)
  314. {       
  315.         uchar num_rf;
  316.         uchar d_num=0;                       

  317. ……………………

  318. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
Keil代碼下載:
Keil代碼.7z (24.53 KB, 下載次數(shù): 81)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1045494 發(fā)表于 2024-7-23 20:59 | 只看該作者
樓主,晶振頻率多少!�。。。。。。。�!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表