单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:8256|回复:31

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, 下载次数: 512)

评分

黑币 +65
收起理由
+ 15
共享资料的黑币奖励!
+ 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|显示全部楼层
谢谢大佬分享  我学习一下

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

Powered by 单片机教程网