数码之家

 找回密码
 立即注册
搜索
查看: 7826|回复: 10

红外解码程序:格力YB0F2、YAD0F,美的R05d,其他NEC

[复制链接]
发表于 2020-8-28 11:10:27 | 显示全部楼层 |阅读模式
本帖最后由 cx_star 于 2020-8-28 11:16 编辑

刷到了这个帖子都说守时的人靠谱,但首先你得有个走时精准的钟表(RX8025应用),买了RX8025改了自己的时钟,又想要一个频率计
又搜到了这个帖子:STC89C52单片机等精度频率计(带仿真),没有M币啊


发个自己改的程序,骗点打赏
共三个版本:参考版本、记录原始定时器值的第二个版本、优化ram版本,可识别格力YB0F2、YAD0F,美的R05d,其他NEC等各种红外

原始程序:格力空调遥控器(YB0F2)单片机解码程序,复制是乱码,清楚乱码后的效果:
  1. /* 格力空调遥控器(YB0F2)解码      
  2.     CUP:STC89C52RC     晶振:11.0569MHz
  3.     直接由串口输出      波特率:57600
  4. ************************************   说 明 **********************************************
  5. 解码方式:
  6. 以一个9ms的低电平和4.5ms的高电平为引导码,后跟35位二进制代码 接着0.565ms低电平和20MS高电平跟32位二进制代码
  7. 前4个字节每个字节为8位,中间1个字节只有3位,接着为20MS高电平,跟后4个字节每个字节为8位
  8.     以低电平为0.565ms、高电平为0.56ms、 周期为1.125ms的组合表示"0";
  9.     以低电平为0.565ms、高电平为1.685ms、周期为2.25ms的组合表示"1"。;
  10. 注意:经过红外接收头解调后单片机接收到的高低电平是和遥控器发射时是相反的一个过程
  11. * 兼容 1T-12T单片机中断方式红外接收数据,并通过串口发送
  12. 程序编辑: lbq691477940         22/07/2011

  13. */
  14. /*******************************************************************************************/
  15. #include "STC_NEW_8051.H"
  16. #include "intrins.h"
  17. #include "stdio.h"
  18. typedef unsigned char uint8;
  19. #define FOSC 22118400L
  20. #define T1RE (256-FOSC/12/19200/32)
  21. #define T0MS30 1/FOSC*12*1000*30

  22. sbit Ir_Pin = P3^2;
  23. sbit LED = P1^0;
  24. sbit LED1 = P1^1;
  25. sbit LED2 = P1^2;
  26. sbit LED3 = P1^3;
  27. uint8 Ir_Buf[9]; //用于保存解码结果
  28. uint8 r,t;
  29. unsigned int tttt;

  30. /*******************************************************************************************
  31. * 外部中断0初始化
  32. /*******************************************************************************************/
  33. void int1_init(void)
  34. {
  35.         IT0 = 1; //下降沿有效
  36.         EX0 = 1;
  37.         EA = 1;
  38. }
  39. void T0Init(){
  40.         TMOD |= 0x01;//工作模式:16位重装
  41. }
  42. void Delay500ms()                //@22.1184MHz
  43. {
  44.         unsigned char i, j, k;

  45.         _nop_();
  46.         i = 8;
  47.         j = 1;
  48.         k = 243;
  49.         do
  50.         {
  51.                 do
  52.                 {
  53.                         while (--k);
  54.                 } while (--j);
  55.         } while (--i);
  56. }
  57. /*******************************************************************************************
  58. * UART初始化
  59. /*******************************************************************************************/
  60. void UartInit(void)                //115200bps@22.1184MHz
  61. {
  62.         SCON = 0x50;                //8位数据,可变波特率
  63.         AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
  64.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  65.         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  66.         TL1 = 0xFC;                //设定定时初值
  67.         TH1 = 0xFF;                //设定定时初值
  68.         ET1 = 0;                //禁止定时器1中断
  69.         TR1 = 1;                //启动定时器1
  70. }

  71. /******************************   延时21ms子程序   ************************************/
  72. void Delay20ms()                //@22.1184MHz
  73. {
  74.         unsigned char i, j;

  75.         i = 72;
  76.         j = 181;
  77.         do
  78.         {
  79.                 while (--j);
  80.         } while (--i);
  81. }

  82. /*******************************************************************************************/
  83. /*******************************************************************************************
  84. * UART发送一字节
  85. /*******************************************************************************************/

  86. void UART_Send_Byte_Inverted (uint8 dat)
  87. {
  88.         uint8 t,i;
  89.         
  90.         for(i=0;i<8;i++){
  91.                 t += dat&1;
  92.                 t <<= 1;
  93.                 dat >>= 1;
  94.         }
  95.         SBUF = t;
  96.         while (TI == 0);
  97.                 TI = 0;
  98. }
  99. void UART_Send_Byte (uint8 dat)
  100. {
  101.         SBUF = dat;
  102.         while (TI == 0);
  103.                 TI = 0;
  104. }
  105. void UART_Send_String(uint8 *dat)
  106. {
  107.         while(*dat!=0)
  108.                 UART_Send_Byte(*dat++);
  109. }
  110. char putchar(char c)
  111. {
  112.         UART_Send_Byte(c);
  113.         return c;
  114. }

  115. /*******************************************************************************************
  116. * 获取低电平时间/
  117. /*******************************************************************************************/
  118. unsigned int Ir_Get_Low()
  119. {
  120.         TL0 = 0;
  121.         TH0 = 0;
  122.         TR0 = 1;
  123.         //while (!Ir_Pin && (TH0 & 0x80)==0);//一直计到Ir_Pin不等0与计到大于1.085*32768=35553.28us
  124.         while (!Ir_Pin && (TH0<0xF0) )     // 1/22118400*12*0xf000 = 33333.33us
  125.                 ;
  126.         TR0 = 0;
  127.         return (TH0 * 256 + TL0); //返回T1 高八位和低八位计数值
  128. }

  129. /*******************************************************************************************
  130. * 获取高电平时间
  131. /*******************************************************************************************/
  132. unsigned int Ir_Get_High()
  133. {
  134.         TL0 = 0;
  135.         TH0 = 0;
  136.         TR0 = 1;
  137.         //while (Ir_Pin && (TH0 & 0x80)==0);//一直计到Ir_Pin不等1与计到大于1.085*32768=35553.28us
  138.         while (Ir_Pin && (TH0<0xF0) )
  139.                 ;
  140.         TR0 = 0;
  141.         return (TH0 * 256 + TL0); //返回T1 高八位和低八位计数值
  142. }
  143. /**********************************  主函数  ****************************************/
  144. //#define MY_DEBUG
  145. main()
  146. {
  147.         int i=1;
  148.         UartInit();
  149.         int1_init();
  150.         T0Init();
  151.         while(i--){
  152.                 Delay500ms();
  153.                 UART_Send_String("hello\r\n");
  154.                 LED = ~LED;
  155.         }
  156.         while (1){
  157.                 #ifdef MY_DEBUG
  158.                 if(r!=0) {
  159.                         t = r;
  160.                         printf("r:%bx %u\r\n",t, tttt);
  161.                         r=0;
  162.                 }
  163.                 #endif
  164.         };
  165. }
  166. /**************************** 外部中断0解码函数 ****************************************/
  167. // 1/11.0569*12 = 1.085295155061545
  168. // 1/22.1184*12 = 0.5425347222222222

  169. // 8500us 8500*22.1184/12 15667.2
  170. #define us8500 15667
  171. // 9500us 22.1184/12*9500 17510.4
  172. #define us9500 17510
  173. // 4000us 22.1184/12*4000 7372.8
  174. #define us4000 7372
  175. // 5000us 22.1184/12*5000 9216
  176. #define us5000 9216
  177. //  200us 22.1184/12*200  368.64
  178. #define us200 368
  179. //  800us 22.1184/12*800  1474.56
  180. #define us800 1474
  181. // 2000us 22.1184/12*2000 3686.4
  182. #define us2000 3686
  183. // 1120us 22.1184/12*1120 2064.384
  184. #define us1120 2064
  185. // 19ms   22.1184/12*19000 35020.8
  186. #define ms19 35020
  187. // 21ms   22.1184/12*21000 38707.2
  188. #define ms21 38707

  189. void int1_isr() interrupt 0
  190. {
  191.         unsigned int temp=0;
  192.         char i,j;
  193.         LED1 = ~LED1;
  194.         temp = Ir_Get_Low();
  195.         if ((temp < us8500) || (temp > us9500))    //引导脉冲低电平8500~9500us (1/11.0569*12*8500)
  196.         {
  197.                 #ifdef MY_DEBUG
  198.                 r = 1;
  199.                 tttt = temp;
  200.                 #endif
  201.                 return;   //不在9ms范围则说明出错 //1.085*7833=8498us ~ 1.085*8755=9499us
  202.         }
  203.         temp = Ir_Get_High();
  204.         if ((temp < us4000) || (temp > us5000))    //引导脉冲高电平4000~5000us
  205.         {  
  206.                 #ifdef MY_DEBUG
  207.                 r = 2;
  208.                 tttt = temp;
  209.                 #endif
  210.                 return;    //不在4ms范围则说明出错 //1.085*3686=3999us ~ 1.085*4608=4999us
  211.         }
  212.         /*******************************************************************************************/
  213.         for (i = 0; i < 4; i++)      //4个字节
  214.         {
  215.                 for (j = 0; j < 8; j++)     //每个字节8位
  216.                 {
  217.                         temp = Ir_Get_Low();
  218.                         if ((temp < us200) || (temp > us800))  //200~800us
  219.                         {
  220.                                 #ifdef MY_DEBUG
  221.                                 r = 3;
  222.                                 tttt = temp;
  223.                                 #endif
  224.                                 return; //不在这范围则说明出错 //1.085*200=217us ~ 1.085*800=868us
  225.                         }
  226.                         temp = Ir_Get_High();
  227.                         if ((temp < us200) || (temp > us2000))  //200~2000us
  228.                         {   
  229.                                 #ifdef MY_DEBUG
  230.                                 r = 4;
  231.                                 tttt = temp;
  232.                                 #endif
  233.                                 return; //不在这范围则说明出错 //1.085*200=217us
  234.                         }
  235.                         Ir_Buf[i] >>= 1;     //先将它自动补0
  236.                         if (temp > us1120) //1120us   //1.085*1032=1119us
  237.                                 Ir_Buf[i] |= 0x80;    //如果大于1119us才将它设为1
  238.                 }
  239.         }
  240. /**************************   第5个字节只有三位故只读其低三位即可 ************************/
  241.         for (i = 4; i <= 4; i++)      //1个字节
  242.         {
  243.                 Ir_Buf[i] = 0;
  244.                 for (j = 0; j < 3; j++)     //每个字节8位
  245.                 {
  246.                         temp = Ir_Get_Low();
  247.                         if ((temp < us200) || (temp > us800))  //200~800us
  248.                         {  
  249.                                 #ifdef MY_DEBUG
  250.                                 r = 5;
  251.                                 tttt = temp;
  252.                                 #endif
  253.                                 return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us
  254.                         }
  255.                         temp = Ir_Get_High();
  256.                         if ((temp < us200) || (temp > us2000))  //200~2000us
  257.                         {  
  258.                                 #ifdef MY_DEBUG
  259.                                 r = 6;
  260.                                 tttt = temp;
  261.                                 #endif
  262.                                 return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*2000 = 2170us
  263.                         }
  264.                         Ir_Buf[i] <<= 1;     //先将它自动补0
  265.                         if (temp > us1120)  //1120us   //1.085*1032 = 1119us
  266.                                 Ir_Buf[i] |= 0x01;    //如果大于1119us才将它设为1
  267.                 }
  268.         }
  269. /*******************************************************************************************/

  270.         temp = Ir_Get_Low();
  271.         if ((temp < us200) || (temp > us800))  //200~800us
  272.         {   
  273.                 #ifdef MY_DEBUG
  274.                 r = 7;
  275.                 tttt = temp;
  276.                 #endif
  277.                 return; //不在565us范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us
  278.         }
  279.         //delay21ms(); //实测波形只20ms但如果只延时20ms读出会出错故延时21ms
  280.         //Delay20ms();
  281.         temp = Ir_Get_High();
  282.         if ((temp < ms19) || (temp > ms21))   //19~21ms
  283.         {
  284.                 #ifdef MY_DEBUG
  285.                 r = 8;
  286.                 tttt = temp;
  287.                 #endif
  288.                 return;   //不在这范围则说明出错 //1.085*17498 = 18985us ~ 1.085*19354 = 20999us
  289.         }
  290.         /*******************************************************************************************/
  291.         for (i = 5; i < 9; i++)       //4个字节3
  292.         {
  293.                 for (j = 0; j < 8; j++)     //每个字节8位8
  294.                 {
  295.                         temp = Ir_Get_Low();
  296.                         if ((temp < us200) || (temp > us800))  //200~800us
  297.                         {
  298.                                 #ifdef MY_DEBUG
  299.                                 r = 9;
  300.                                 tttt = temp;
  301.                                 #endif
  302.                                 return; //不在565us范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us
  303.                         }
  304.                         temp = Ir_Get_High();
  305.                         if ((temp < us200) || (temp > us2000))  //200~2000us
  306.                         {
  307.                                 #ifdef MY_DEBUG
  308.                                 r = 10;
  309.                                 tttt = temp;
  310.                                 #endif
  311.                                 return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*2000 = 2170us
  312.                         }
  313.                         Ir_Buf[i] >>= 1;     //先将它自动补0
  314.                         if (temp > us1120)  //1120us   //1.085*1032 = 1119us
  315.                                 Ir_Buf[i] |= 0x80;    //如果大于1119us才将它设为1
  316.                 }
  317.         }
  318. /*******************************************************************************************/
  319.         for(i = 0;i < 9;i++)             //通过串口将代码发出
  320.         {
  321.                 UART_Send_Byte_Inverted(Ir_Buf[i]);    //将9个字节的遥控键值通过串口输出
  322.         }
  323. }
复制代码
修改后的第一个版本(只记录定时器原始数据):

  1. #include "STC_NEW_8051.H"
  2. #include "intrins.h"
  3. #include "stdio.h"
  4. typedef unsigned char uint8;

  5. sbit Ir_Pin = P3^2;        // 外部中断0(INT0)

  6. //YB0F2编码   9ms+4.5ms  35位(0.565ms+0.56ms/1.685)  0.565ms+20ms  32位  [0.565ms+Nms]  2+70+2+64 = 138 (+2)
  7. //YAD0F编码   YB0F2  0.565ms+40ms  YB0F2    [0.565ms+Nms]                               138+2+138 = 278 (+2)
  8. #define IR_BUF_SIZE 300            
  9. xdata unsigned int Ir_Buf_PWM[IR_BUF_SIZE]; //用于保存解码结果
  10. unsigned int BUF_i;

  11. void int1_init(void)
  12. {
  13.     IT0 = 1; //下降沿有效
  14.     EX0 = 1;
  15.     EA = 1;
  16. }
  17. void T0Init(){
  18.     TMOD |= 0x01;//工作模式:16位重装
  19. }
  20. void Delay500ms()        //@22.1184MHz
  21. {
  22.     unsigned char i, j, k;

  23.     _nop_();
  24.     i = 8;
  25.     j = 1;
  26.     k = 243;
  27.     do
  28.     {
  29.         do
  30.         {
  31.             while (--k);
  32.         } while (--j);
  33.     } while (--i);
  34. }
  35. /*******************************************************************************************
  36. * UART初始化
  37. /*******************************************************************************************/
  38. void UartInit(void)        //115200bps@11.0592MHz
  39. {
  40.     SCON = 0x50;        //8位数据,可变波特率
  41.     AUXR &= 0xBF;        //定时器1时钟为Fosc/12,即12T
  42.     AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
  43.     TMOD &= 0x0F;        //设定定时器1为16位自动重装方式
  44.     TL1 = 0xFE;        //设定定时初值
  45.     TH1 = 0xFF;        //设定定时初值
  46.     ET1 = 0;        //禁止定时器1中断
  47.     TR1 = 1;        //启动定时器1
  48. }

  49. void UART_Send_Byte (uint8 dat)
  50. {
  51.     SBUF = dat;
  52.     while (TI == 0);
  53.         TI = 0;
  54. }
  55. void UART_Send_String(uint8 *dat)
  56. {
  57.     while(*dat!=0)
  58.         UART_Send_Byte(*dat++);
  59. }
  60. char putchar(char c)
  61. {
  62.     UART_Send_Byte(c);
  63.     return c;
  64. }

  65. /*******************************************************************************************
  66. * 获取低电平时间/
  67. /*******************************************************************************************/
  68. unsigned int Ir_Get_Low(uint8 maxTH0)
  69. {
  70.     TL0 = 0;
  71.     TH0 = 0;
  72.     TR0 = 1;
  73.     while (!Ir_Pin && (TH0<maxTH0) )
  74.         ;
  75.     TR0 = 0;
  76.     return (TH0 * 256 + TL0);
  77. }

  78. /*******************************************************************************************
  79. * 获取高电平时间
  80. /*******************************************************************************************/
  81. unsigned int Ir_Get_High(uint8 maxTH0)
  82. {
  83.     TL0 = 0;
  84.     TH0 = 0;
  85.     TR0 = 1;
  86.     while (Ir_Pin && (TH0<maxTH0) )
  87.         ;
  88.     TR0 = 0;
  89.     return (TH0 * 256 + TL0);
  90. }
  91. /**********************************  主函数  ****************************************/
  92. //#define MY_DEBUG
  93. main()
  94. {
  95.     int i=1;
  96.     UartInit();
  97.     int1_init();
  98.     T0Init();
  99.     BUF_i = 0;
  100.     while(i--){
  101.         Delay500ms();
  102.         Delay500ms();
  103.         UART_Send_String("hello\r\n");
  104.     }
  105.     while (1){
  106.         if(BUF_i!=0){
  107.             printf("BUF_i:%u\r\n",BUF_i);
  108.             for(i=0;i<BUF_i;i++)
  109.                 printf("%u ",Ir_Buf_PWM[i]);
  110.             printf("\r\n");
  111.             BUF_i = 0;
  112.         }
  113.     };
  114. }

  115. //#define FOSC_M 22.1184F
  116. #define FOSC_M 11.0569F
  117. // 1/11.0569*12 = 1.085295155061545
  118. // 1/22.1184*12 = 0.5425347222222222
  119. // max 65535/22.1184*12  35555us
  120. // max 65535/11.0569*12  71124us
  121. typedef unsigned int uint;
  122. #define us9500 (uint)(9500*FOSC_M/12)
  123. #define us8500 (uint)(8500*FOSC_M/12)
  124. #define us5000 (uint)(5000*FOSC_M/12)
  125. #define us4000 (uint)(4000*FOSC_M/12)
  126. #define us2000 (uint)(2000*FOSC_M/12)
  127. #define us200  (uint)(200*FOSC_M/12)
  128. #define ms21   (uint)(21000*FOSC_M/12)
  129. #define ms42   (uint)(42000*FOSC_M/12)

  130. void int1_isr() interrupt 0
  131. {
  132.     unsigned int temp=0;
  133.    
  134.     if(BUF_i!=0)
  135.         return;
  136.    
  137.     temp = Ir_Get_Low(us9500>>8);
  138.     if ((temp < us8500) )   
  139.     {
  140.         return;   
  141.     }
  142.     Ir_Buf_PWM[BUF_i++] = temp;
  143.     temp = Ir_Get_High(us5000>>8);
  144.     if ((temp < us4000) )   
  145.     {  
  146.         return;   
  147.     }
  148.     Ir_Buf_PWM[BUF_i++] = temp;

  149.     while(1){
  150.         temp = Ir_Get_Low(us9500>>8);
  151.         if ((temp < us200) )   
  152.         {
  153.             return;   
  154.         }
  155.         Ir_Buf_PWM[BUF_i++] = temp;
  156.         temp = Ir_Get_High(ms42>>8);
  157.         if ((temp < us200) )   
  158.         {  
  159.             return;   
  160.         }
  161.         Ir_Buf_PWM[BUF_i++] = temp;
  162.     }
  163. }
复制代码
上面一个版本挺要RAM的,又修改了一个版本://格力
//YB0F2编码   9ms+4.5ms  35位(0.565ms+0.56ms/1.685)  0.565ms+20ms  32位  [0.565ms+Nms]  2+70+2+64 = 138 (+2)
//YAD0F编码   YB0F2  0.565ms+40ms  YB0F2    [0.565ms+Nms]                               138+2+138 = 278 (+2)
//美的
//R05d                L,A,A’,B,B’,C,C’, S, L,A,A’,B,B’,C,C’
//                        4.4ms+4.4ms 2*8*3(0.54ms+0.54ms/1.62ms) 0.54ms+5.22ms 4.4ms+4.4ms 2*8*3(0.54ms+0.54ms/1.62ms) 0.54ms+Nms
//NEC遥控器
//                        9ms低+4.5ms高  32位(0.58+0.55/1.66)  0.565ms+40ms  (9ms低+2.25ms高+0.56ms低+高 )
  1. uint8 Ir_Buf_PWM[IR_BUF_SIZE]; //用于保存解码结果
复制代码
  1. uint Ir_Get_Low(uint8 maxTH0)
  2. {
  3.         uint r;
  4.         TL0 = 0;
  5.         TH0 = 0;
  6.         TR0 = 1;
  7.         while (!Ir_Rec && (TH0<=maxTH0) )
  8.                 ;
  9.         TR0 = 0;
  10.         r = TH0;
  11.         r <<= 8;
  12.         r += TL0;
  13.         return r;
  14. }

  15. uint Ir_Get_High(uint8 maxTH0)
  16. {
  17.         uint r;
  18.         TL0 = 0;
  19.         TH0 = 0;
  20.         TR0 = 1;
  21.         while (Ir_Rec && (TH0<=maxTH0) )
  22.                 ;
  23.         TR0 = 0;
  24.         r = TH0;
  25.         r <<= 8;
  26.         r += TL0;
  27.         return r;
  28. }
  29. //#define FOSC_M 22.1184F
  30. #define FOSC_M 11.0569F
  31. // 1/11.0569*12 = 1.085295155061545
  32. // 1/22.1184*12 = 0.5425347222222222
  33. // max 65535/22.1184*12  35555us
  34. // max 65535/11.0569*12  71124us
  35. // 256/11.0569*12        277.8355596957556
  36. // feff/11.0569*12  5903.9us
  37. #define us9500 (uint)(9500*FOSC_M/12)        //8753.379166666667
  38. #define us8500 (uint)(8500*FOSC_M/12)   //7831.970833333333
  39. #define us6000 (uint)(6000*FOSC_M/12)
  40. #define us5500 (uint)(5500*FOSC_M/12)
  41. #define us5000 (uint)(5000*FOSC_M/12)
  42. #define us4000 (uint)(4000*FOSC_M/12)
  43. #define us2020 (uint)(2020*FOSC_M/12)     //1861.244833333333
  44. #define us1000 (uint)(1000*FOSC_M/12)
  45. #define us600  (uint)(600*FOSC_M/12)
  46. #define us200  (uint)(200*FOSC_M/12)
  47. #define ms10   (uint)(10000*FOSC_M/12)
  48. #define ms21   (uint)(21000*FOSC_M/12)
  49. #define ms38   (uint)(38000*FOSC_M/12)
  50. #define ms42   (uint)(42000*FOSC_M/12)
  51. #define ms50   (uint)(50000*FOSC_M/12)
  52. #define ms60   (uint)(60000*FOSC_M/12)     //

  53. void int1_isr() interrupt 2
  54. {
  55.         uint8 i=0;
  56.         if(BUF_i!=0)
  57.                 return;
  58.         if(int1_err!=0)
  59.                 return;
  60.         IR_Low = Ir_Get_Low(us9500>>8);
  61.         if ( IR_Low < us4000 )   
  62.         {
  63.                 return;   
  64.         }
  65.         IR_High = Ir_Get_High(us5000>>8);
  66.         if ( IR_High < us4000 )   
  67.         {  
  68.                 return;   
  69.         }
  70.         while( BUF_i < IR_BUF_SIZE )
  71.         {
  72.                 IR_Low = Ir_Get_Low(us9500>>8);
  73.                 if ((IR_Low < us200) )   
  74.                 {
  75.                         //DQ = ~DQ;
  76.                         int1_err = 1;               
  77.                         return;   
  78.                 }
  79.                 IR_High = Ir_Get_High(ms50>>8);
  80.                 if ((IR_High < us200) )   
  81.                 {
  82.                         int1_err = 2;
  83.                         return;   
  84.                 }
  85.                 if(IR_High>=ms50){   //可能为结尾或者重复编码
  86.                         Ir_Get_High(ms60>>8);
  87.                         if(IR_High>=ms60|0xff00){
  88.                                 //int1_err = 3;
  89.                                 return;      //结尾
  90.                         }
  91.                         //重复
  92.                 }
  93.                 if(IR_High>=us2020)//功能位
  94.                 {
  95.                         BUF_i++;
  96.                         Ir_Buf_PWM[BUF_i] = 0;
  97.                         i=7;
  98.                 }
  99.                 i++;
  100.                 if(i>8)
  101.                 {
  102.                         BUF_i++;
  103.                         Ir_Buf_PWM[BUF_i] = 0;
  104.                         i=1;
  105.                 }
  106.                 Ir_Buf_PWM[BUF_i] <<= 1;
  107.                 //Ir_send = ~Ir_send;
  108.                 if( IR_High > (IR_Low+us600) ){
  109.                         Ir_Buf_PWM[BUF_i] |= 0x01;
  110.                 }
  111.         }
  112. }
复制代码






补充内容 (2020-8-31 14:24):
程序效果见5楼
https://www.mydigit.cn/forum.php ... 734&pid=5876234

打赏

参与人数 1家元 +3 收起 理由
qiang7260 + 3 優秀文章

查看全部打赏

发表于 2020-8-28 12:38:12 | 显示全部楼层

解过几个,发现不是简单的数值,中间间隔的长短也要差不多才可以成功。
回复 支持 反对

使用道具 举报

发表于 2020-8-30 00:14:06 | 显示全部楼层
申请买过几只淘宝卖的个人DIY产品:空调来电自动开机器,使用效果还不错,可以录制各种品牌空调的遥控器编码
回复 支持 反对

使用道具 举报

发表于 2020-8-31 09:10:03 | 显示全部楼层
本帖最后由 netbeetle 于 2020-8-31 09:12 编辑

几乎所有的红外遥控都遵循一个大的格式,就是引导码+地址码+地址码反码+数据码+数据码反码的形式,当然数据的长度各不相同。用逻辑分析仪把波形读出来,很容易就分析出来了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 12:51:19 | 显示全部楼层
写程序时的调试过程没有截图,刷回以前的程序,截个图

YAD0F:
//格力
//YB0F2编码   9ms+4.5ms  35位(0.565ms+0.56ms/1.685)  0.565ms+20ms  32位  [0.565ms+Nms]  2+70+2+64 = 138 (+2)
//YAD0F编码   YB0F2  0.565ms+40ms  YB0F2    [0.565ms+Nms]                               138+2+138 = 278 (+2)



波形图全貌



波形图第一部分YB0F2

波形图第二部分YB0F2



使用程序二串口输出



人工分析



程序三输出


输出说明:











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 12:54:20 | 显示全部楼层
devcang 发表于 2020-8-28 12:38
解过几个,发现不是简单的数值,中间间隔的长短也要差不多才可以成功。 ...

有一个USB的逻辑分析仪,就容易多了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 12:55:35 | 显示全部楼层
40560335 发表于 2020-8-30 00:14
申请买过几只淘宝卖的个人DIY产品:空调来电自动开机器,使用效果还不错,可以录制各种品牌空调的遥控器编 ...

我也是想自己DIY一个类似的东西,8PIN的STC单片机,一个红外接收,一个红外发射,还带个DS18B20,以及两个按键。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 12:56:40 | 显示全部楼层
netbeetle 发表于 2020-8-31 09:10
几乎所有的红外遥控都遵循一个大的格式,就是引导码+地址码+地址码反码+数据码+数据码反码的形式,当然数据 ...

反码来反码去的就费神了,我就直接获取原始数据,然后照样发出去,不关心具体谁是谁的反码
回复 支持 反对

使用道具 举报

发表于 2020-8-31 15:26:48 来自手机浏览器 | 显示全部楼层
楼主  如果能 改造 安卓 那些万能遥控 APP,  接收 遥控器信号  并 翻译显示出 编码类型 和 数据结构,  那些 带 红外遥控功能的手机 就是  随身  红外遥控 检测器了, 时常逛地摊 ,碰到满多遥控器,不知遥控代码,  有些电器原装遥控都要百元以上。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-31 17:42:16 | 显示全部楼层
qidao 发表于 2020-8-31 15:26
楼主  如果能 改造 安卓 那些万能遥控 APP,  接收 遥控器信号  并 翻译显示出 编码类型 和 数据结构,  那 ...

有能用的遥控器,学习红外编码,然后解码都好说,就是怕没有遥控器,这个编码库不好弄
回复 支持 反对

使用道具 举报

发表于 2020-9-1 11:47:44 来自手机浏览器 | 显示全部楼层
cx_star 发表于 2020-8-31 17:42
有能用的遥控器,学习红外编码,然后解码都好说,就是怕没有遥控器,这个编码库不好弄 ...

编码库不是重点, 装个  遥控精灵 APP  选择  遥控  按发即可,

主要是 测试 未知遥控器  按键代码,
比如说能显示 NEC 编码规则和 键值 即可,  空调编码 太复杂 不用判断。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 13:48 , Processed in 0.234000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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