久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3361|回復: 11
打印 上一主題 下一主題
收起左側

四路學習型315m無線開關單片機程序 因能學習到一種阻值信號學習不到其他 阻值的遙控

  [復制鏈接]
回帖獎勵 10 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:17109 發表于 2019-9-12 15:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
四路學習型315m無線開關  因能學習到一種阻值信號學習不到其他    阻值的遙控

現在走到一款,自適應多阻值實現2262、1527解碼,學習的,測試過支持很多阻值的遙控,把兩個程序上傳給大家看看什樣把解碼移值到現在這個,四路學習型315m無線開關程序,上傳給大家看看什樣修改,上傳謝謝大家

單片機源程序如下:
  1. /**************************************************************************/

  2.       //-----------------兼容2262 1527的解碼實驗程序----------------//

  3. //測試單片機:兼容STC全系

  4. //晶振:11.0592M (外部)

  5. //復位方式:內部復位
  6.                      
  7. //串口通訊:波特率9600/數據位8/停止位1/無校驗

  8. //調試環境:KEIL4

  9. //程序功能:實現2262、1527解碼,學習、自適應多阻值,片內EEPROM,存儲60個遙控器數據
  10.         
  11. //          不依賴硬件,不占用硬件資源。移植更加方便

  12. //                        學習遙控器:按一下學習鍵,學習燈點亮,松開學習鍵,按動要學習的遙控器按鍵,學習燈熄滅,學習成功。重復上述操作可學習多個遙控器.
  13. //
  14. //          清除:按住學習鍵不放,直到學習燈自動熄滅,擦除成功.

  15. /**********************************************************/


  16. #include <STC15W408AS.h>
  17. #include <intrins.h>                                                        
  18. #define uchar unsigned char
  19. #define uint  unsigned int


  20. sbit RF                           =        P1^1;           //信號輸入
  21. sbit LED                =        P1^0;           //學習指示燈
  22. sbit set                 =        P3^5;           //學習鍵                                                         
  23. sbit D0                        =        P3^6;          //解碼輸出
  24. sbit D1                        =        P3^7;
  25. sbit D2                        =        P3^3;
  26. sbit D3                        =        P3^2;
  27. sbit VT                        =        P1^7;         //解碼指示燈                        
  28.                         

  29. bit  decode_ok;                 //解碼成功
  30. bit rf_ok;               //收到有效數據
  31. bit study;         //學習標志
  32. bit jmnx;  //編碼類型 0是2262,1是1527
  33. uchar da1527[2][3];  //解碼過程中臨時數組
  34. uchar key_d;  //遙控器按鍵碼
  35. uchar short_k;     //窄脈沖寬度


  36. uchar idata key_number[181];                //遙控器編碼數組,存放60個遙控器


  37. void delay_1ms(uint x)    //1毫秒延時
  38. {
  39.         uchar b,c;
  40.         for(x;x>0;x--)
  41.                 {
  42.                         for(b=3;b>0;b--)
  43.                                 {
  44.                                         for(c=150;c>0;c--);
  45.                                 }
  46.                 }
  47. }

  48. void delay(uint ms)//
  49. {
  50.   while(ms--)
  51.     {
  52.          ms++;

  53.          ms--;
  54.     }
  55. }

  56. //====================================================
  57. /////////片內EEPROM讀寫驅動程序///////////////////////////
  58. //====================================================


  59. void IAP_Disable()           //關閉IAP
  60. {
  61.     //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  62.     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  63.     IAP_CONTR = 0;      //關閉IAP 功能
  64.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
  65.     IAP_TRIG = 0;      //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
  66.     IAP_ADDRH = 0;
  67.     IAP_ADDRL = 0;
  68. }//



  69. //讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
  70. uchar read_add(uint addr)         //讀EEPROM
  71. {
  72.     IAP_DATA = 0x00;
  73.     IAP_CONTR = 0x84;         //打開IAP 功能, 設置Flash 操作等待時間
  74.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節讀命令

  75.     IAP_ADDRH = addr>>8;    //設置目標單元地址的高8 位地址
  76.     IAP_ADDRL = addr&0xff;    //設置目標單元地址的低8 位地址

  77.     EA = 0;
  78.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
  79.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
  80.     _nop_();
  81.     EA = 1;
  82.     IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  83.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  84.     return (IAP_DATA);
  85. }//------------------------------------------------------------------------------


  86. //字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
  87. void write_add(uint addr,uchar ch)         //直接寫EEPROM
  88. {
  89.     IAP_CONTR = 0x84;         //打開 IAP 功能, 設置Flash 操作等待時間
  90.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節編程命令


  91.     IAP_ADDRH = addr>>8;    //設置目標單元地址的高8 位地址
  92.     IAP_ADDRL = addr&0xff;    //設置目標單元地址的低8 位地址

  93.     IAP_DATA = ch;                  //要編程的數據先送進IAP_DATA 寄存器
  94.     EA = 0;
  95.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
  96.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
  97.     _nop_();
  98.     EA = 1;
  99.     IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
  100.                     //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
  101. }//------------------------------------------------------------------------------
  102. //擦除扇區, 入口:DPTR = 扇區地址


  103. void Sector_Erase(uint addr)         //扇區擦除
  104. {
  105.      IAP_CONTR = 0x84;         //打開IAP 功能, 設置Flash 操作等待時間
  106.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區擦除命令

  107.     IAP_ADDRH =addr>>8;    //設置目標單元地址的高8 位地址
  108.     IAP_ADDRL =addr&0xff;    //設置目標單元地址的低8 位地址

  109.     EA = 0;
  110.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 觸發寄存器,每次都需如此
  111.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被觸發起動
  112.     _nop_();
  113.     EA = 1;
  114. }//------------------------------------------------------------------------------



  115. //============================接收解碼部分========================================//

  116. void RF_decode()         
  117. {
  118.            uchar ii=0,j=0,k=0,rep=0;
  119.             uint head_k=0;           //短脈沖寬度
  120.           uchar s;   
  121. //-------------------------------數據接收-----------------------------------------
  122.       short_k=0;
  123.           while(RF && j<250)         //檢測頭信號前一個高脈沖的寬度
  124.                    {
  125.                          delay(1);        
  126.                         short_k++;
  127.                  }
  128.           while(!RF)
  129.                    {
  130.                          delay(1);
  131.                         head_k++;
  132.                  } //檢測頭脈沖的寬度         
  133.       if(((short_k*24)<head_k) && (head_k<(short_k*38)))   //引導碼寬度是窄脈沖的32倍 24/38
  134.          {        
  135.             for(rep=0;rep<2;rep++)         
  136.                {  
  137.                              for(ii=0;ii<3;ii++)//3字節
  138.                              {
  139.                                    for(k=0;k<8;k++)//每個字節8位
  140.                                       {                                      
  141.                                                     j=0;
  142.                                                         while(RF && j<245)
  143.                                                                 {
  144.                                                                         delay(1);
  145.                                                                         j++;
  146.                                                                 }//
  147.                                                if(j>(short_k-short_k/2-short_k/3)&&j<(short_k*1.96))
  148.                                                                 {
  149.                                                                         da1527[rep][ii]&=~(1<<((7-k)));
  150.                                                                 }                                    
  151.                                                         else if(j>(short_k*1.96)&&j<(short_k*5))da1527[rep][ii]|=(1<<(7-k));                                                
  152.                                                 else {return;}          //亂碼退出        
  153.                                                j=0;
  154.                                                         while(!RF && j<150){delay(2);j++;}      //跳過低電平                                   
  155.                                                  }
  156.                                  }//for(ii=0;ii<12;ii++)  
  157.                    j=0;while(RF && (j<200)){delay(1);j++;}            //跳個最后一個高脈沖                           
  158.                                head_k=0;while(!RF) {delay(1);head_k++;} //檢測下一個前導信號的寬度  
  159.                                if((head_k<(short_k*26)) || (head_k>(short_k*38)))  {return;} //引導碼寬度是窄脈沖的32倍  //亂碼退出
  160.                            }
  161.             //+++++++++++++++++++++++++2262與1527數據分離處理++++++++++++++++++++++++++++++++++++++++              
  162.                          if((da1527[0][0]==da1527[1][0]) && (da1527[0][1]==da1527[1][1]) && (da1527[0][2]==da1527[1][2]))        //兩次接收到的數據相同
  163.                       {         
  164.                      uchar u,i,x;
  165.                                          rf_ok=1;
  166.                                          for(i=0;i<3;i++)  //判定2262與1527
  167.                         {
  168.                            for(u=0;u<4;u++) {if(((da1527[0][i]>>(u*2)) & 3)==2) {i=80;break;}}  //有10則為1527
  169.                                                    if(i==80) break;
  170.                         }
  171.                      if(i==80)  //1527
  172.                         {
  173.                           key_d=da1527[1][2] & 0x0f;         //分出1527的按鍵值
  174.                           da1527[0][2]=da1527[1][2]>>4; //分出1527的后4位地址
  175.                                                   jmnx=1;         //為0是2262,1是1527
  176.                         }
  177.                        else      //2262
  178.                          {
  179.                           key_d=0;
  180.                           for(i=0;i<4;i++){if(((da1527[0][2]>>(i*2))&3)==3) key_d|=1<<i;}   //計算出2262的按鍵數據                                 
  181.                           da1527[0][2]=00; //2262無后4位地址,全為0
  182.                                                   jmnx=0;         //為0是2262,1是1527
  183.                          }
  184.                                                    
  185.                                           if (!study)                //非學習狀態
  186.                                                   {
  187.                                                         rf_ok=0;
  188.                                                         for(x=0;x<60;x++)
  189.                                                                    {
  190.                                                                         if((da1527[0][0]==key_number[x*3+1])&&(da1527[0][1]==key_number[x*3+2])
  191.                                                                                                                                         &&(da1527[0][2]==key_number[x*3+3]))//判斷是否已學習過的編碼
  192.                                                                                 {
  193.                                                                     D0=!(key_d&0x08);                //取得按鍵碼
  194.                                                                                         D1=!(key_d&0x04);
  195.                                                                                         D2=!(key_d&0x02);
  196.                                                                                         D3=!(key_d&0x01);
  197.                                                                                                                                                                                 
  198.                                                                                         decode_ok=1;
  199.                                                                                         VT=0;                                                               
  200.                                                                                         s=100;
  201.                                                                                         break;
  202.                                                                                 }
  203.                                                                                                                
  204.                                                                 }        
  205.                                                 
  206.                                                 
  207.                                                 }

  208.                  }
  209.               
  210.          }
  211.         if(decode_ok)   //解碼有效信號,類似2272 PT腳
  212.                   {
  213.                         s--;
  214.                         if(!s)
  215.                                 {
  216.                                         decode_ok=0;
  217.                                         VT=1;
  218.                                 }                                 
  219.                   }         
  220.                                  
  221.                   
  222. }

  223. void key_buffer()                  //把遙控器碼從 EEPROM 復制到DATA
  224. {
  225.         uchar n;

  226.         for(n=0;n<181;n++)
  227.                 {
  228.                    key_number[n]=read_add(0x0000+n);                        
  229.                 }
  230. }

  231. void KEY_study()        //遙控器學習
  232. {        
  233.         uchar num_rf;
  234.         uint d_num;
  235.         if(study)
  236.                 {
  237.                            rf_ok=0;
  238.                         d_num=0;
  239.         
  240.                         while(!rf_ok)
  241.                                 {
  242.                                         RF_decode();
  243.                                         d_num++;
  244.                                         if(d_num>50000) break;                                                                        
  245.                                 }
  246.                         d_num=0;
  247.                         if(rf_ok==1)
  248.                                 {

  249.                                         num_rf=key_number[0];                   //取已學習的遙控器數量
  250.                                         if(num_rf>60){num_rf=0;}        //如果遙控器數量超過10個,覆蓋最先學習的
  251.                                         key_number[num_rf*3+1]=da1527[0][0];
  252.                                         key_number[num_rf*3+2]=da1527[0][1];
  253.                                         key_number[num_rf*3+3]=da1527[0][2];
  254.                                         key_number[0]=num_rf+1;

  255.                                         Sector_Erase(0x0000);
  256.                                         for(num_rf=0;num_rf<181;num_rf++)
  257.                                                 {
  258.                                                         write_add(0x0000+num_rf,key_number[num_rf]);
  259.                                                         
  260.                                                 }
  261.                                         rf_ok=0;
  262.                                         LED=1;                   //學習成功                                       
  263.                                   }        
  264.                                 else
  265.                                         {
  266.                                                 rf_ok=0;

  267.                                                 for(num_rf=0;num_rf<8;num_rf++)                   //操作超時
  268.                                                         {
  269.                                                                 LED=!LED;
  270.                                                                 delay_1ms(100);                                                        
  271.                                                         }
  272.                                                  LED=1;
  273.                                        
  274.                                         }
  275.                         d_num=0;
  276.                         study=0;                 
  277.                 }
  278. }

  279. void system_res()  //系統清零           
  280. {
  281.         
  282.           Sector_Erase(0x0000);        
  283.         write_add(0x0000,0x00);        
  284.         key_buffer();               

  285. }

  286. void set_scan()          //判斷學習鍵狀態
  287. {
  288.   uchar h=0;

  289.   while(!set)         
  290.         {                        
  291.                 if(h>5)
  292.                         {
  293.                                 study=1;
  294.                                 h=0;
  295.                                 LED=0;
  296.                                 while(!set)
  297.                                         {
  298.                                           delay_1ms(100);
  299.                                           h++;
  300.                                           if(h>80)
  301.                                                   {
  302.                                                            study=0;
  303.                                                         h=0;
  304.                                                         system_res();
  305.                                                         LED=1;
  306.                                                         while(!set);
  307.                                                 }
  308.                                        
  309.                                         }
  310.                         }
  311.                  delay_1ms(100);
  312.                   h++;
  313.          }                                                                                
  314.   if(study)
  315.                 {
  316.                         KEY_study();
  317.                 }         
  318. }






  319. void system_start()   //上電初始化
  320. {        
  321.          AUXR=0xb5;   
  322.          P0=0xfe;
  323.         P1=0xff;
  324.           P3=0xff;
  325.         key_buffer();
  326. }

  327. void main()
  328. {
  329.   system_start();

  330.   while(1)
  331.         {
  332.                 RF_decode();
  333.                 set_scan();

  334.         }  

  335. }
復制代碼

2262-1527解碼程序.rar

52.96 KB, 下載次數: 62

四路學習型315m無線開關.rar

59.37 KB, 下載次數: 56

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:405193 發表于 2019-9-13 22:03 | 只看該作者
我測試了一下“2262-1527解碼程序”這個程序,震蕩電阻4.7M 遙控器對碼不成功,2.2M可以。抱歉了,我的水平有限,幫不了樓主。
回復

使用道具 舉報

板凳
ID:405193 發表于 2019-9-14 07:18 | 只看該作者
樓主,“2262-1527解碼程序.rar” 我設置成6M 晶振,4.7M,2.2M電阻都可以控制,“四路學習型315m無線開關.rar” 我的單片機STC15W204空間不夠沒法測試,它是采用外部中斷來解碼的。真希望有高手可以改成外部中斷解碼,我也謝謝。
回復

使用道具 舉報

地板
ID:608923 發表于 2019-9-14 17:39 | 只看該作者
我測試了一下“2262-1527解碼程序”這個程序,我把晶振改成了6M 晶振,4.7M,2.2M電阻都可以控制,我用STM32L053沒做出來 實在抱歉,水平有限,勿怪
回復

使用道具 舉報

5#
ID:17109 發表于 2019-9-14 22:05 來自手機 | 只看該作者
yong761228 發表于 2019-9-13 22:03
我測試了一下“2262-1527解碼程序”這個程序,震蕩電阻4.7M 遙控器對碼不成功,2.2M可以。抱歉了,我的水平 ...

師傅你好:能用2262-1527解碼程序的解碼,修改移植到四路學習型315m開關程序嗎,修改上傳謝謝
回復

使用道具 舉報

6#
ID:405193 發表于 2019-9-15 07:27 | 只看該作者
ll13536121668 發表于 2019-9-14 22:05
師傅你好:能用2262-1527解碼程序的解碼,修改移植到四路學習型315m開關程序嗎,修改上傳謝謝

抱歉了,沒有這水平,四路學習型315m開關程序采用的是外部中斷方法,只能看看哪位高人能不能把“2262-1527解碼程序” 改成外部中斷方法。
回復

使用道具 舉報

7#
ID:608923 發表于 2019-9-15 21:18 | 只看該作者
抱歉了,沒有這水平,四路學習型315m開關程序采用的是外部中斷方法
回復

使用道具 舉報

8#
ID:370639 發表于 2021-8-26 11:59 | 只看該作者
這個程序我手里也有,同樣的遙控器,有的遙控器可以解碼,有的不能,不知道怎么回事,震蕩電阻330k,ev1527編碼
回復

使用道具 舉報

9#
ID:81196 發表于 2021-9-1 08:50 | 只看該作者
屬實在不接觸的人不能馬上看懂
回復

使用道具 舉報

10#
ID:970121 發表于 2022-1-3 09:12 | 只看該作者
學習了!不同思路解碼方法。
回復

使用道具 舉報

11#
ID:543220 發表于 2022-1-5 17:57 | 只看該作者
我有解碼程序樓主可需要
回復

使用道具 舉報

12#
ID:7199 發表于 2022-1-11 09:00 | 只看該作者
想學習一下,非常好的資料,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久午夜 | 一区二区电影网 | 国产美女久久 | 亚洲免费一区 | 免费在线一区二区 | 久在线| 国产精品视频久久久 | 国产探花在线精品一区二区 | 精品欧美激情在线观看 | www.色综合 | 国产欧美在线 | 日本a级大片 | 99re6在线视频精品免费 | 国产欧美一区二区三区久久人妖 | 99精品在线免费观看 | 久久精品久久综合 | 日韩高清中文字幕 | 丁香综合 | 国产精品一区二区三区久久久 | 国产视频一区二区三区四区五区 | 国产福利视频 | 国产精品久久久久无码av | 欧美日韩国产传媒 | 国产一级片免费视频 | 亚洲二区在线观看 | 韩日视频在线观看 | 亚洲欧洲精品在线 | 亚洲视频三区 | 欧美一级黄带 | 夜夜精品浪潮av一区二区三区 | 一区二区三区国产在线观看 | 久久这里只有精品首页 | 欧美日韩久久久 | 精品久久久久一区二区国产 | 91精品亚洲 | 福利一区二区在线 | 久久亚洲一区 | 黄色在线免费观看 | 国产精品永久免费视频 | 欧美一区2区三区4区公司 | 欧美一级α片 |