找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11047|回复: 32
收起左侧

315-433MHZ单片机学习遥控器无线解码程序

  [复制链接]
ID:127035 发表于 2023-6-10 22:32 | 显示全部楼层 |阅读模式
315-433MHZ学习遥控器芯片设置说明

支持1527  2264  2260  2262   SC5211  HS2240等解码,自动适应振荡电阻
2260 2262 2264 如果不进行人工地址编码,好多个遥控器地址编码一样的,只要学习一个遥控器,所有的遥控器都能同时用

一:如何设置自锁,互锁,点动输出
1:断电。按住学习键然后上电保持1-2秒钟后松开,学习灯闪3次,设置为自锁输出。
2:断电。按住学习键然后上电保持1-2秒钟后松开,学习灯闪1次,设置为互锁输出。
3:断电。按住学习键然后上电保持1-2秒钟后松开,学习灯闪2次,设置为点动输出。
二:遥控器学习:
以上输出模式设置后断开电源,然后上电,按一下学习键,学习灯保持亮,再按遥控器上的任意一键,学习灯熄灭,遥控器学习成功。重复上述操作可以学习多达20个遥控器。1527 2260 2262 2264等的遥控器可以混合学习使用。
三:如何清空已学习过的遥控器:
断电,按住学习键然后上电保持4秒以上再松开按键,学习灯闪烁4次,说明已学习过的遥控器已被清空。

电路原理图如下:
51hei.png

下载烧录说明
IRC频率选11.0592M
如果已烧录过的单片机,烧录前必须下载后恢复下出厂设置。才能再烧录,新单片机不用恢复
操作:按住学习键,上电保持10秒以上松开即可。

单片机源程序如下:
  1. //内部晶振:11.0592M
  2. //测试芯片:STC15F104E/STC11F04W        
  3. //By David Xu 2020/08/18
  4. //硬件最简版
  5. //实现2262、1527解码输出,学习、自适应多阻值,片内EEPROM存储相关信息

  6. #include <reg52.h>
  7. #include <intrins.h>
  8.                                                          
  9. sfr AUXR=0x8e;

  10. sfr IAP_DATA    = 0xC2;                //片内EEPROM资源声明
  11. sfr IAP_ADDRH   = 0xC3;
  12. sfr IAP_ADDRL   = 0xC4;
  13. sfr IAP_CMD     = 0xC5;
  14. sfr IAP_TRIG    = 0xC6;
  15. sfr IAP_CONTR   = 0xC7;

  16. sfr P3M0                =0xb2;
  17. sfr P3M1                =0xb1;

  18. #define uchar unsigned char
  19. #define uint  unsigned int

  20. sbit RF                        =        P3^4;          //射频引脚定义                                                                                                                    
  21. sbit set                 =        P3^3;          //设置键定义
  22.          
  23. sbit keya                =        P3^0;          //第一路
  24. sbit keyb                =        P3^1;          //第二路  
  25. sbit keyc                =        P3^2;          //第三路
  26. sbit keyd                =        P3^5;          //第四路


  27. uint   ll_w;
  28. uchar  hh_w;           //高,低电平宽度
  29. uchar  ma_x;                //接收到第几位编码了
  30. uchar  idata bma1,bma2,bma3; //用于接收过程存放遥控编码,编码比较两次,这是第一次
  31. uchar idata mmb1,mmb2,mmb3; //        用于接收过程存放遥控编码,第二次
  32. uchar key_data;   
  33. uchar short_k;
  34. uchar  mma1,mma2,mma3; //用于解码过程                        
  35. uchar L_M_select;
  36. uchar xplx;
  37. uint s,s1;

  38. bit old_rc5;             //保存上一次查询到的电平状态
  39. bit tb_ok;               //接收到同步的马时置1
  40. bit rf_ok1,rf_ok2;                 //解码过程中的临时接收成功标志
  41. bit rf_ok;               //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
  42. bit study;                                 //进入学习状态标志
  43. bit system_int;                         //系统清零标志
  44. bit m1,m2,m3,m4;
  45. bit flag_zs;
  46. bit  decode_ok;                 //解码成功

  47. uchar idata key_number[61];               


  48. void delay_1ms(uint x)    //1毫秒延时
  49. {
  50.         uchar b,c;
  51.         for(x;x>0;x--)
  52.                 {
  53.                         for(b=5;b>0;b--)
  54.                                 {
  55.                                         for(c=150;c>0;c--);
  56.                                 }
  57.                 }
  58. }

  59. void BB(uint size,uchar Number)
  60. {
  61.                                                                           
  62.         if(Number)
  63.                 {
  64.                         for(Number;Number>0;Number--)
  65.                                 {
  66.                                         set=0;
  67.                                          delay_1ms(size);
  68.                                         set=1;
  69.                                         delay_1ms(size);                                
  70.                                 }               
  71.                 }
  72.              else
  73.                            {
  74.                                 set=0;
  75.                                  delay_1ms(size);
  76.                                 set=1;                        
  77.                         }
  78. }

  79. void chick1527(uchar d)
  80. {
  81.         uchar u;
  82.         for(u=0;u<4;u++)
  83.                 {
  84.                         if(((d>>(u*2)) & 3)==2)
  85.                                  {
  86.                                          xplx=0x55;
  87.                                   }
  88.                 }
  89. }


  90. //====================================================
  91. /////////片内EEPROM读写驱动程序///////////////////////////
  92. //====================================================


  93. void IAP_Disable()           //关闭IAP
  94. {
  95.     //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  96.     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  97.     IAP_CONTR = 0;      //关闭IAP 功能
  98.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
  99.     IAP_TRIG = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
  100.     IAP_ADDRH = 0;
  101.     IAP_ADDRL = 0;
  102. }//



  103. //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
  104. uchar read_add(uint addr)         //读EEPROM
  105. {
  106.     IAP_DATA = 0x00;
  107.     IAP_CONTR = 0x84;         //打开IAP 功能, 设置Flash 操作等待时间
  108.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令

  109.     IAP_ADDRH = addr>>8;    //设置目标单元地址的高8 位地址
  110.     IAP_ADDRL = addr&0xff;    //设置目标单元地址的低8 位地址

  111.     EA = 0;
  112.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
  113.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
  114.     _nop_();
  115.     EA = 1;
  116.     IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  117.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  118.     return (IAP_DATA);
  119. }//------------------------------------------------------------------------------


  120. //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
  121. void write_add(uint addr,uchar ch)         //直接写EEPROM
  122. {
  123.     IAP_CONTR = 0x84;         //打开 IAP 功能, 设置Flash 操作等待时间
  124.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令


  125.     IAP_ADDRH = addr>>8;    //设置目标单元地址的高8 位地址
  126.     IAP_ADDRL = addr&0xff;    //设置目标单元地址的低8 位地址

  127.     IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
  128.     EA = 0;
  129.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
  130.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
  131.     _nop_();
  132.     EA = 1;
  133.     IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  134.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  135. }//------------------------------------------------------------------------------
  136. //擦除扇区, 入口:DPTR = 扇区地址


  137. void Sector_Erase(uint addr)         //扇区擦除
  138. {
  139.     IAP_CONTR = 0x84;         //打开IAP 功能, 设置Flash 操作等待时间
  140.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令

  141.     IAP_ADDRH =addr>>8;    //设置目标单元地址的高8 位地址
  142.     IAP_ADDRL =addr&0xff;    //设置目标单元地址的低8 位地址

  143.     EA = 0;
  144.     IAP_TRIG = 0x5a;   //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此
  145.     IAP_TRIG = 0xa5;   //送完 B9h 后,ISP/IAP 命令立即被触发起动
  146.     _nop_();
  147.     EA = 1;
  148. }//------------------------------------------------------------------------------

  149. void timeint() interrupt 1    //遥控接收,通过定时器0中断,定时去查询
  150.    {           
  151.           uchar x1;
  152.           TF0=0;           // 清除T0中断标志
  153.           TL0=0x30;           //b5
  154.           TH0=0xff;           //fe
  155.                         
  156.       if (!RF) { ll_w++;old_rc5=0; }           // 检测到低电平 低电平时间加1,记录本次电平状态
  157.         else                                      // 检测到高电平
  158.                { hh_w++;
  159.                  if (!old_rc5)                          // 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
  160.                   {
  161.                                  if (((hh_w*16)<ll_w) && (hh_w*38)>ll_w )          //判同步码                           
  162.                        {                                 
  163.                                        
  164.                                                 short_k=ll_w/31;
  165.                                                 ma_x=0;
  166.                                                 tb_ok=1;
  167.                                                 bma1=0;
  168.                                                 bma2=0;
  169.                                                 bma3=0;          //根据不同 同步码 宽度,T0加载不同初值                        
  170.                        }        
  171.             else if ((tb_ok)&&((ll_w>short_k*2)&&(ll_w<short_k*5)))         //   10/14
  172.                                 {         
  173.                                         ma_x++;                                //已经接收到同步码,判0
  174.                                         if(ma_x>23)
  175.                                                 {
  176.                                                    if(!rf_ok1)
  177.                                                           {
  178.                                                                   mma1=bma1;mma2=bma2;mma3=bma3;//将接收到的编码复制到解码寄存器中                             
  179.                                                rf_ok1=1;                                // 通知解码子程序可以解码了
  180.                                                tb_ok=0;
  181.                                                                   s=5000;                                                               
  182.                                                         }
  183.                                                         else
  184.                                                                 {
  185.                                                                   mmb1=bma1;mmb2=bma2;mmb3=bma3;//将接收到的编码复制到解码寄存器中                             
  186.                                   rf_ok2=1;                                // 通知解码子程序可以解码了
  187.                                   tb_ok=0;                                                                                                                                                        
  188.                                                                 }
  189.                                                 }
  190.                                  }  
  191.             else if ((tb_ok)&&((ll_w>short_k/6)&&(ll_w<short_k*2)))                   //   3/5
  192.                   { switch (ma_x)
  193.                      {
  194.                                            case 0 : { bma1=bma1 | 0x80; break; }//遥控编码第1位
  195.                        case 1 : { bma1=bma1 | 0x40; break; }
  196.                        case 2 : { bma1=bma1 | 0x20; break; }
  197.                        case 3 : { bma1=bma1 | 0x10; break; }
  198.                        case 4 : { bma1=bma1 | 0x08; break; }
  199.                        case 5 : { bma1=bma1 | 0x04; break; }
  200.                        case 6 : { bma1=bma1 | 0x02; break; }
  201.                        case 7 : { bma1=bma1 | 0x01; break; }
  202.                        case 8 : { bma2=bma2 | 0x80; break; }
  203.                        case 9 : { bma2=bma2 | 0x40; break; }
  204.                        case 10: { bma2=bma2 | 0x20; break; }
  205.                        case 11: { bma2=bma2 | 0x10; break; }
  206.                        case 12: { bma2=bma2 | 0x08; break; }
  207.                        case 13: { bma2=bma2 | 0x04; break; }
  208.                        case 14: { bma2=bma2 | 0x02; break; }
  209.                        case 15: { bma2=bma2 | 0x01; break; }
  210.                        case 16: { bma3=bma3 | 0x80; break; }
  211.                        case 17: { bma3=bma3 | 0x40; break; }
  212.                        case 18: { bma3=bma3 | 0x20; break; }
  213.                        case 19: { bma3=bma3 | 0x10; break; }
  214.                        case 20: { bma3=bma3 | 0x08; break; }//按键状态第1位
  215.                        case 21: { bma3=bma3 | 0x04; break; }
  216.                        case 22: { bma3=bma3 | 0x02; break; }
  217.                        case 23: { bma3=bma3 | 0x01;
  218.                                           
  219.                                                                      if(!rf_ok1)
  220.                                                                           {
  221.                                                                           mma1=bma1;mma2=bma2;mma3=bma3;//将接收到的编码复制到解码寄存器中                             
  222.                                                     rf_ok1=1;                                // 通知解码子程序可以解码了
  223.                                                     tb_ok=0;
  224.                                                                           s=5000;
  225.                                                                           break;                                                                        
  226.                                                                         }
  227.                                                                         else
  228.                                                                                 {
  229.                                                                                   mmb1=bma1;mmb2=bma2;mmb3=bma3;//将再次接收到的编码复制到解码寄存器中,                             
  230.                                                   rf_ok2=1;                                // 通知解码子程序可以解码了
  231.                                                   tb_ok=0;
  232.                                                                                   break;                                                                                                                                                        
  233.                                                                                 }
  234.                                    
  235.                                 }
  236.                      }
  237.                     ma_x++;
  238.                                        
  239.                   }
  240.            else {ma_x=0; tb_ok=0; bma1=0; bma2=0; bma3=0;hh_w=1;ll_w=0;}      //接收到不符合的高-低电平序列
  241.                ll_w=0;hh_w=1;         
  242.                            }         
  243.          old_rc5=1;      // 记录本次电平状态
  244.        }

  245.         if(rf_ok1)                //规定时间内接受到2帧相同的编码数据才有效
  246.                 {
  247.                         s--;
  248.                         if(!s) rf_ok1=0;
  249.                         if(rf_ok2)
  250.                                 {
  251.                                   if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
  252.                                            {                                          
  253.                                                   rf_ok=1;rf_ok1=0;rf_ok2=0;                                                                                                            
  254.                                          }
  255.                                          else
  256.                                            {
  257.                                                   rf_ok=0;
  258.                                                   rf_ok1=0;
  259.                                                   rf_ok2=0;                                         
  260.                                            }
  261.                                                                   
  262.                                 }                                       
  263.                 }


  264.     if(rf_ok)                 //判断是否是学习状态&&()
  265.                         {         
  266.                                 
  267.                                 EA=0;
  268.                                 chick1527(mma1);         
  269.                             if(xplx!=0x55){chick1527(mma2);}
  270.                             if(xplx!=0x55){chick1527(mma3);}
  271.      
  272.                  if(xplx==0x55)
  273.                     {
  274.                               xplx=0;        
  275.                               key_data=mma3 & 0x0f;         
  276.                                         mma3=mma3>>4;
  277.                     }
  278.                   else      
  279.                      {               
  280.                           xplx=1;
  281.                                           key_data=0;
  282.                           for(x1=0;x1<4;x1++){if(((mma3>>(x1*2))&3)==3) key_data|=1<<x1;}                                   
  283.                           mma3=0;
  284.                      }

  285.                                 if(!study)
  286.                                         {        
  287.                                                  rf_ok=0;
  288.                                                  for(x1=0;x1<20;x1++)
  289.                                                    {
  290.                                                                 if((mma1==key_number[x1*3+1])&&(mma2==key_number[x1*3+2])&&(mma3==key_number[x1*3+3]))
  291.                                                                         {
  292.                                                                                 if((!((mma1==0)&&(mma2==0)))&&(!((mma1==0xff)&&(mma2==0xff)))&&key_data)
  293.                                                                                         {
  294.                                                                                                 if(L_M_select==3)
  295.                                                                                                         {
  296.                                                                                                                 m1=(key_data & 0x08);              
  297.                                                                                                                 m2=(key_data & 0x04);
  298.                                                                                                                 m3=(key_data & 0x02);        
  299.                                                                                                                 m4=(key_data & 0x01);                                                                        
  300.                                                                                                         }
  301.                                                                                                    else
  302.                                                                                                              {
  303.                                                                                                                     keya=(key_data & 0x08);      
  304.                                                                                                                   keyb=(key_data & 0x04);
  305.                                                                                                           keyc=(key_data & 0x02);        
  306.                                                                                                           keyd=(key_data & 0x01);
  307.                                                                                                           }
  308.                                                                                                 decode_ok=1;
  309.                                                                                                 set=0;                                       
  310.                                                                                                 s1=12000;
  311.                                                                                                 break;
  312.                                                                                         }
  313.                                                                         }
  314.                                                                                                 
  315.                                                         }
  316.                                                 EA=1;
  317.                                         }                                 
  318.                                 
  319.                         }


  320.     if(decode_ok)   
  321.                   {
  322.                         s1--;
  323.                         if(!s1)
  324.                                 {
  325.                                         set=1;
  326.                                         decode_ok=0;
  327.                                         flag_zs=0;
  328.                                         if(L_M_select==2)
  329.                                                 {
  330.                                                         keya=0;
  331.                                                         keyb=0;
  332.                                                         keyc=0;
  333.                                                         keyd=0;                                                
  334.                                                 }
  335.                                        
  336.                                 }
  337.                         if((L_M_select==3)&&(!flag_zs)&&decode_ok)
  338.                                 {

  339.                                                    flag_zs=1;
  340.                                                    if(m1)keya=!keya;
  341.                                                    if(m2)keyb=!keyb;
  342.                                                    if(m3)keyc=!keyc;
  343.                                                    if(m4)keyd=!keyd;                                
  344.                                 }                                                                          
  345.                   }         
  346.    }


  347. void key_buffer()                  //把遥控器码从 EEPROM 复制到DATA
  348. {
  349.         uchar n;

  350.         for(n=0;n<61;n++)
  351.                 {
  352.                    key_number[n]=read_add(0x0000+n);                        
  353.                 }
  354. }

  355. void KEY_study()        //遥控器学习
  356. {        
  357.         uchar num_rf;
  358.         uchar d_num;
  359.         if(study==1)
  360.                 {
  361.                            rf_ok=0;
  362.                         d_num=0;
  363.         
  364.                         while(!rf_ok)
  365.                                 {
  366.                                         delay_1ms(100);
  367.                                         d_num++;
  368.                                         if(d_num>200) break;                                                                        
  369.                                 }
  370.                         d_num=0;
  371.                         if(rf_ok==1)
  372.                                 {
  373.                                         EA=0;
  374.                                         num_rf=key_number[0];                   //取已学习的遥控器数量
  375.                                         if(num_rf>20){num_rf=0;}        //如果遥控器数量超过20个,覆盖最先学习的
  376.                                         key_number[num_rf*3+1]=mma1;
  377.                                         key_number[num_rf*3+2]=mma2;
  378.                                         key_number[num_rf*3+3]=mma3;
  379.                                         key_number[0]=num_rf+1;

  380.                                         Sector_Erase(0x0000);
  381.                                         for(num_rf=0;num_rf<61;num_rf++)
  382.                                                 {
  383.                                                         write_add(0x0000+num_rf,key_number[num_rf]);
  384.                                                         
  385.                                                 }

  386.                                         rf_ok=0;
  387.                                         set=1;                   //学习成功
  388.                                         EA=1;
  389.                                        
  390.                                   }        
  391.                                 else
  392.                                         {
  393.                                                 rf_ok=0;        //操作超时
  394.                                                 BB(300,4);
  395.                                        
  396.                                         }
  397.                         d_num=0;
  398.                         study=0;                 
  399.                 }
  400. }

  401. void system_res()  //系统清零           
  402. {
  403.         
  404.           Sector_Erase(0x0000);        
  405.         write_add(0x0000,0x00);        
  406.         key_buffer();               

  407. }

  408. void set_scan()          //判断学习键状态
  409. {
  410.   uchar h=0;

  411.   while((!set)&&(!study)&&(!decode_ok))         
  412.         {        
  413.                 if(h>2)
  414.                         {
  415.                                 study=1;
  416.                                 h=0;                                
  417.                                 while(!set);
  418.                                 set=0;
  419.                         }
  420.                  delay_1ms(100);
  421.                   h++;
  422.          }                                                                                
  423.          
  424. }

  425. void system_start()   //上电初始化
  426. {        
  427.          uchar h;
  428.         P3M0=0x27;
  429.         P3M1=0x10;
  430.           P3=0xd8;


  431.         L_M_select=read_add(0x0200);
  432.         if((L_M_select>3)||(L_M_select==0))L_M_select=3;
  433.         if(!set)
  434.           {
  435.                   while(!set)
  436.                           {
  437.                           delay_1ms(50);
  438.                           h++;
  439.                           if(h>2)
  440.                                   {                                                        
  441.                                         while(!set)
  442.                                           {
  443.                                                     delay_1ms(100);
  444.                                                   h++;
  445.                                                   if(h>90)
  446.                                                           {        
  447.                                                                 system_int=1;
  448.                                                                 while(!set);
  449.                                                            }                                          
  450.                                           }
  451.                                                 if(system_int)
  452.                                                         {
  453.                                                                 h=0;
  454.                                                                 system_int=0;
  455.                                                                 system_res();
  456.                                                                 delay_1ms(1500);
  457.                                                                 BB(500,4);                                
  458.                                                         }
  459. ……………………

  460. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil代码下载:
学习型无线遥控解码程序2023.7z (192.14 KB, 下载次数: 522)

评分

参与人数 2黑币 +65 收起 理由
lkc8210 + 15 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:235691 发表于 2023-6-11 11:15 | 显示全部楼层
有没有用STC8系列8脚单片机的程序
回复

使用道具 举报

ID:401478 发表于 2023-6-11 11:15 | 显示全部楼层
谢谢大佬分享  我学习一下下
回复

使用道具 举报

ID:17647 发表于 2023-6-12 15:51 | 显示全部楼层
太感谢了,刚做了一个2272解码程序,但是没有这个好。
回复

使用道具 举报

ID:1006814 发表于 2023-6-13 08:50 | 显示全部楼层
感谢大佬,正在学习遥控器呢。
回复

使用道具 举报

ID:461382 发表于 2023-6-18 21:30 | 显示全部楼层
神来之作,我要啥你就来啥
回复

使用道具 举报

ID:68189 发表于 2023-6-19 09:18 | 显示全部楼层
买来的代码,放到这里来了。
回复

使用道具 举报

ID:430492 发表于 2023-6-19 16:04 | 显示全部楼层
感谢楼主分享的学习型无线遥控解码程序,值得学习借鉴!
回复

使用道具 举报

ID:200118 发表于 2023-7-2 22:28 | 显示全部楼层
谢谢分享,值得学习。。。
回复

使用道具 举报

ID:287898 发表于 2023-7-13 15:09 | 显示全部楼层
很完善的资料  非常感谢
回复

使用道具 举报

ID:12816 发表于 2023-8-28 18:04 | 显示全部楼层
wpppmlah 发表于 2023-6-19 09:18
买来的代码,放到这里来了。

说不好是这下的代码人家拿去卖
回复

使用道具 举报

ID:227484 发表于 2023-9-25 16:38 | 显示全部楼层
很实用的程序,下载看看
回复

使用道具 举报

ID:33319 发表于 2023-9-28 17:35 | 显示全部楼层
卖的好像还能单独学习四路输出的遥控码。
回复

使用道具 举报

ID:36007 发表于 2023-10-6 21:25 | 显示全部楼层
4路输出的学些遥控码
回复

使用道具 举报

ID:1083996 发表于 2023-10-23 09:17 | 显示全部楼层
很棒的操作,学习了
回复

使用道具 举报

ID:31094 发表于 2023-10-29 17:11 | 显示全部楼层

很实用的程序
回复

使用道具 举报

ID:72088 发表于 2023-10-30 19:36 | 显示全部楼层
单片机解码,距离近是硬伤,没专业芯片灵敏度高,我实验多次,修改,无解
回复

使用道具 举报

ID:195496 发表于 2023-11-1 07:51 | 显示全部楼层
学习一下,有价值的帖子
回复

使用道具 举报

ID:103411 发表于 2023-11-7 16:04 | 显示全部楼层
感谢分享,下载学习一下。
回复

使用道具 举报

ID:1058675 发表于 2023-11-9 09:48 | 显示全部楼层
兄弟们,有没有实测过,能正常使用输出信号吗
回复

使用道具 举报

ID:110231 发表于 2023-11-22 16:31 | 显示全部楼层
好东西 已做成功
回复

使用道具 举报

ID:16023 发表于 2023-11-24 20:56 | 显示全部楼层
stc8a8k测试成功,只是点动自锁互锁切换很麻烦,如果检测按键的次数去切换模式或学习功能就好了。<--正在研究中......
回复

使用道具 举报

ID:77785 发表于 2024-1-5 23:39 | 显示全部楼层
我怎么在代码里,没有找到互锁的逻辑啊...
回复

使用道具 举报

ID:34298 发表于 2024-5-3 20:05 | 显示全部楼层
当A、B键同时按下时  无法实在互锁,控制电机正反转容易烧电机 ,不知道怎么改程序
回复

使用道具 举报

ID:81135 发表于 2024-5-4 18:12 | 显示全部楼层
谢谢资料,下载学习中,多多上传啊
回复

使用道具 举报

ID:27456 发表于 2024-5-7 12:44 | 显示全部楼层
fancunwu 发表于 2024-5-3 20:05
当A、B键同时按下时  无法实在互锁,控制电机正反转容易烧电机 ,不知道怎么改程序

if(!study)
                {       
                         rf_ok=0;
                         for(x1=0;x1<20;x1++)
                           {
                                if((mma1==key_number[x1*3+1])&&(mma2==key_number[x1*3+2])&&(mma3==key_number[x1*3+3]))
                                {
                                        if((!((mma1==0)&&(mma2==0)))&&(!((mma1==0xff)&&(mma2==0xff)))&&key_data)
                                        {
                                                if(L_M_select==3)
                                                {
                                                        m1=(key_data & 0x08);              
                                                        m2=(key_data & 0x04);
                                                        m3=(key_data & 0x02);       
                                                        m4=(key_data & 0x01);                                                                       
                                                }
                                           else
                                             {
                                                  if((key_data & 0x04)&&!(key_data & 0x02)&&!(key_data & 0x01))keyb=1;  //上 ▲
                                                  if(!(key_data & 0x04)&&(key_data & 0x02)&&!(key_data & 0x01))keyc=1;  //停 ■
                                                  if(!(key_data & 0x04)&&!(key_data & 0x02)&&(key_data & 0x01))keyd=1;  //下 ▼
                                          }

                                          decode_ok=1;

                                          if((key_data & 0x02)&&(key_data & 0x01)&&decode_ok) sc=1;        // ■+▼
                                          if((key_data & 0x04)&&(key_data & 0x01)&&decode_ok) yk_xx=1;// ▲+▼

                                //          if((key_data & 0x04)&&(key_data & 0x02)&&(key_data & 0x01)&&decode_ok)xw_sc=1;

                                //          if((key_data & 0x02)&&(key_data & 0x01)&&decode_ok)
                                                       
回复

使用道具 举报

ID:766282 发表于 2024-5-10 04:14 来自手机 | 显示全部楼层
很实用
回复

使用道具 举报

ID:100749 发表于 2024-5-10 09:14 | 显示全部楼层
学习学习 下载了,有时间做一下
回复

使用道具 举报

ID:465279 发表于 2024-5-29 23:52 来自手机 | 显示全部楼层
好的,非常好的资料
回复

使用道具 举报

ID:1093842 发表于 2024-5-30 18:07 | 显示全部楼层

谢谢分享,值得学习。。
回复

使用道具 举报

ID:808676 发表于 2024-6-8 21:26 | 显示全部楼层
谢谢楼主分享,感谢
回复

使用道具 举报

ID:25103 发表于 2024-6-29 16:21 | 显示全部楼层
谢谢大佬分享  我学习一下
回复

使用道具 举报

ID:285301 发表于 2024-12-20 08:56 | 显示全部楼层
试着用FMD的也写一个,那个2毛芯片用的不少
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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