搜索
bottom↓
12
返回列表 发新帖
楼主: winfuture

高效NEC遥控解码,任意IO(精简10行C语言)

  [复制链接]

出0入0汤圆

发表于 2013-5-1 18:31:51 | 显示全部楼层
思路很好  学习了

出0入0汤圆

发表于 2013-5-1 21:54:44 | 显示全部楼层
LZ,我用你的程序修改了下,,解不了码,,帮我看下有什么问题吗程序!!用那种开发板带的小遥控能解得了吗??请教了!!

#include "STC12C5Ax.h"

#define uchar unsigned char
#define uint unsigned  int

uchar IR_data[4];
uchar IR_dataBuffer[4];
uchar ReIR_Data[4];

sbit IR_IO= P3^2;
sbit download=P3^0;

bit Irprot_LastState;
bit IR_FlagSend;


/*
* UART初始化
* 波特率:2400
*/
void uart_init(void)
{
    TMOD = 0x21;
    SCON = 0x50;
    TH1 = 0xF3;
    TL1 = 0xF3;
    TR1 = 1;
}

/*
* UART发送一字节
*/
void UART_Send_Byte(uchar dat)
{
        SBUF = dat;
        while (TI == 0);
        TI = 0;
}

void main()
{       
        uart_init();
        ET0=1;
        TR0=1;
        TH0=(65536-125)/256;
        TL0=(65536-125)%256;
        P2M0=0x04;
        P2M1=0x00;
                          
        while(1)
        {                               
//                if(!download)        IAP_CONTR=0x63;
               
//                P0=0x00;
        }

}

void timer1(void) interrupt 0 using 0
{
          static uchar irTime,codeCnt;
          static uint  Counter1S;
          TF1=0;
          TH1=(65536-125)/256;
          TL1=(65536-125)%256;
       
          irTime++;
          if(irTime==240) {irTime--;  codeCnt=0x3f;} // ir解码后码值存放时间, 240*125us = 30ms
          if(IR_IO)   Irprot_LastState=1; // 记录IO状态
          else if(Irprot_LastState)       // 有下降沿
          {
                 
                   Irprot_LastState = 0;        // 下降沿后IO状态记录为0
                  if(irTime<24)                // 小于24*125us=3ms的间隔才进行处理
                  {
                     codeCnt++;  codeCnt &= 0x1f;
                IR_data[codeCnt>>3] <<= 1;
                if( irTime>15 )   IR_data[codeCnt>>3]++;  // 大于15*125us=1.875ms的间隔为数据1
                  }
                  irTime = 0;                  // 下降沿处理完成,将时间清0
                       
                    if(codeCnt>31)
                 {
                        IR_dataBuffer[0]=~IR_data[0];
                        IR_dataBuffer[1]=IR_data[1];
                        IR_dataBuffer[2]=~IR_data[2];
                        IR_dataBuffer[3]=IR_data[3];
               
                        ReIR_Data[0]=~IR_dataBuffer[0];
                        ReIR_Data[1]=IR_dataBuffer[1];
                        ReIR_Data[2]=IR_dataBuffer[2];
                        ReIR_Data[3]=IR_dataBuffer[3];
                               
                        if(ReIR_Data[0]==ReIR_Data[1] && ReIR_Data[3]==ReIR_Data[2])        IR_FlagSend=1;
       
                  }                       
      }               
           if(IR_FlagSend)
           {
                        if(++Counter1S==40)
                        {
                                Counter1S=0;
                                IR_FlagSend=0;
                                UART_Send_Byte(ReIR_Data[3]);
                                P0=ReIR_Data[3];
                                ReIR_Data[3]=0;
                                IR_data[3]=0;

                        }
                }       
}       


出0入0汤圆

发表于 2013-5-1 22:52:36 | 显示全部楼层
这个不得不学呀。

出0入0汤圆

 楼主| 发表于 2013-5-1 23:06:37 | 显示全部楼层
l769109884 发表于 2013-5-1 21:54
LZ,我用你的程序修改了下,,解不了码,,帮我看下有什么问题吗程序!!用那种开发板带的小遥控能解得了吗 ...

问题1:
void timer1(void) interrupt 0 using 0  -----> timer1用的是interrupt 3,这个你用错了吧,
问题2:
timer1中断里放的东西太多了,中断程序应尽量精简,尽量在中断里用标志位,然后在主程序中根据标志位来处理,所以你中断程序中的后面修改加上去的最好拿到外面来处理。

开发板带的小遥控只要是NEC编码的都可以解码的(我猜想90%可能性是NEC的,目前我用过几十个遥控,只遇到过一个非NEC的)

出0入0汤圆

发表于 2013-5-2 12:44:20 | 显示全部楼层
谢谢,MARK

出0入0汤圆

发表于 2013-5-2 13:22:17 | 显示全部楼层
很好   值得学习

出0入0汤圆

发表于 2013-5-3 19:50:44 | 显示全部楼层
怎么感觉不管有没有解码定时器中断总是开着的    ??

出0入0汤圆

发表于 2013-5-3 20:19:36 | 显示全部楼层
收藏下,这要学习。

出0入0汤圆

发表于 2013-5-3 21:28:11 | 显示全部楼层
一般用用没问题,做产品最好加上超时处理,和起始码、重复码判断

出0入0汤圆

发表于 2013-5-3 22:17:54 | 显示全部楼层
不错 先收着

出0入0汤圆

发表于 2013-5-7 18:09:55 | 显示全部楼层
winfuture 发表于 2013-4-28 19:33
解码过后(或者没有下降沿后)30ms irTime就会加到240,然后会一直为240(如果没有下降沿过来),codeCnt就 ...

精妙!

出0入0汤圆

发表于 2013-5-10 10:46:41 来自手机 | 显示全部楼层
我看了楼主的程序,应该不错,不过,一开始的解释是不是有点不对呀,初始化的地方!!!

出0入0汤圆

发表于 2013-5-10 15:11:23 来自手机 | 显示全部楼层
不错,只是对51而言晶震的频率得高些才行,不然就没办法做其他事了。我想至少要24M吧?

出0入0汤圆

发表于 2013-6-13 11:28:37 | 显示全部楼层
没有超时处理的话,如果接受的编码发生干扰,导致接收序列错位,就会一直错下去,
需要加入超时处理,可以超时的时候拉入到正规

出0入0汤圆

发表于 2013-6-13 12:13:07 | 显示全部楼层
不建议如此省代码,当遥控器距接收头较远,或有干扰时,同样需要像按键去抖动相似的做处理,红外编码一般有头,有尾,有重复数据或重复尾,数据长的话,需要适当的随时做同步处理。数据中有些还有校验。

要处理好一种红外编码,与其沉浸于精简代码的喜悦中,不如仔细用示波器测试各种情况下接收部份的波形。经过我说的各种处理,遥控的距离必然明显提高不少。也不容易出现误操作。给客户的体验也完全不一样。

出0入0汤圆

发表于 2013-6-13 12:17:19 | 显示全部楼层
还有,有没考虑不同的遥控器厂家可能生产同一样遥控器,头、尾、0、1各时间会有差异呢?各遥控器一般使用陶瓷振荡器,有些还使用RC振荡器,频率并不一定很准,代码太短,有些情况下是否可能会出现不能使用的情况?

出0入0汤圆

发表于 2013-6-13 14:47:46 | 显示全部楼层

出0入0汤圆

发表于 2013-6-13 15:06:31 | 显示全部楼层
收藏,有时间再看

出0入0汤圆

发表于 2013-6-13 15:06:33 | 显示全部楼层
现在感觉做什么通讯,必须要加上超时处理,要不然做出来就会出问题。

出0入0汤圆

发表于 2013-12-17 21:26:28 | 显示全部楼层
要回复才能看!???

出0入0汤圆

发表于 2014-2-15 19:55:45 | 显示全部楼层
先看看,谢谢!

出0入0汤圆

发表于 2014-2-15 20:59:14 | 显示全部楼层
不错,谢谢

出0入0汤圆

发表于 2014-3-28 22:53:45 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2014-4-1 11:37:59 | 显示全部楼层
谢谢你的共享

出0入0汤圆

发表于 2014-4-1 13:37:50 | 显示全部楼层
火钳流明

出0入0汤圆

发表于 2014-4-1 20:48:34 | 显示全部楼层
不错收藏了

出0入0汤圆

发表于 2014-4-2 20:21:48 | 显示全部楼层
收藏了                       

出0入0汤圆

发表于 2014-4-2 20:48:01 | 显示全部楼层
不错,谢谢了

出0入0汤圆

发表于 2014-4-2 21:18:04 | 显示全部楼层
谢谢,收藏一下。

出0入0汤圆

发表于 2014-4-2 22:14:16 | 显示全部楼层
留爪

出0入0汤圆

发表于 2014-8-23 13:14:22 | 显示全部楼层
有个问题想不明白,如果irTime  累计加时间 不到逻辑电平0 的时间 也判断为0吗, 比如次数是3,
希望有时间的时候解答下

出0入0汤圆

 楼主| 发表于 2014-8-23 14:25:51 | 显示全部楼层
jiangzhimin 发表于 2014-8-23 13:14
有个问题想不明白,如果irTime  累计加时间 不到逻辑电平0 的时间 也判断为0吗, 比如次数是3,
希望有时间 ...

对头哈,只要大irTime大于15就会存为bit 1,小于15(当然包含3)就会存为0,这里看起来对波形高低电平时间限制太宽,感觉会收到很多误码的样子。其实使用时可以发现,实际上能干扰到遥控头且使irTime的32次接收都在15上下摆动并且还要使这32bit的数据最后两byte满足A=~A这样的干扰几率实在是小得可怜。至少我是从来没发现过误触发IR的现象。

出0入0汤圆

发表于 2014-8-23 16:59:43 | 显示全部楼层
winfuture 发表于 2014-8-23 14:25
对头哈,只要大irTime大于15就会存为bit 1,小于15(当然包含3)就会存为0,这里看起来对波形高低电平时间 ...

哦,多谢
小弟c比较弱,再次请教下代码的意思啊
codeCnt++;  codeCnt &= 0x1f;    这句话的意思是确保,数据码位计数是32个对吗
IR_data[codeCnt>>3] <<= 1------- IR_data[codeCnt>>3]++ 这两句话有些迷糊,好像第二句作用好像是把位是1的加一下,为什么要右移3位呢
实在是想不明白,望解答下具体意思

出0入0汤圆

发表于 2014-8-23 17:02:59 | 显示全部楼层
抗干扰是个渣渣

出0入0汤圆

 楼主| 发表于 2014-8-23 17:15:02 | 显示全部楼层
jiangzhimin 发表于 2014-8-23 16:59
哦,多谢
小弟c比较弱,再次请教下代码的意思啊
codeCnt++;  codeCnt &= 0x1f;    这句话的意 ...

右移3位表示除以8求整,codeCnt是小于32的,所以codeCnt右移后出来的结果就只有0-3这4个数

出0入0汤圆

 楼主| 发表于 2014-8-23 17:16:02 | 显示全部楼层

这位兄弟情绪有点大,我也只能呵呵,不解释

出0入0汤圆

发表于 2014-8-24 08:05:43 来自手机 | 显示全部楼层
实际应用加上头尾及超时即可。

出0入0汤圆

发表于 2014-8-24 09:19:25 | 显示全部楼层
mark酒酒酒酒酒酒酒酒酒酒酒酒酒

出0入0汤圆

发表于 2014-8-24 10:14:24 | 显示全部楼层
嗯嗯,不错!好思路~~~谢谢

出10入10汤圆

发表于 2014-8-24 10:44:53 | 显示全部楼层
标记一下,备用吧

出0入0汤圆

发表于 2014-8-24 23:17:17 | 显示全部楼层
这种设计也是有缺点的。

出0入0汤圆

发表于 2015-9-6 15:49:04 | 显示全部楼层
好东西,谢谢!

出0入0汤圆

发表于 2015-9-7 22:24:53 | 显示全部楼层
感谢楼主分享!

出0入0汤圆

发表于 2015-9-8 13:31:11 | 显示全部楼层
不错!楼主真NB。

出0入0汤圆

发表于 2015-9-8 22:13:53 | 显示全部楼层
这个是多年前有一个牛人放出来的,我都用二年了,准确性很好,也很灵敏。

出0入0汤圆

发表于 2015-9-9 07:51:10 | 显示全部楼层
125微秒,压力比较大

出0入8汤圆

发表于 2015-9-9 08:04:45 | 显示全部楼层
呵,发现了这个好东西,谢谢各位!!

出0入0汤圆

发表于 2016-3-14 13:04:59 来自手机 | 显示全部楼层
很有参考价值   nec高效10行代码遥控器解码

出0入0汤圆

发表于 2016-4-14 11:51:01 | 显示全部楼层
mark ,学习一下

出0入0汤圆

发表于 2016-4-14 12:30:29 | 显示全部楼层
mark ,学习一下

出0入0汤圆

发表于 2016-8-26 14:31:59 | 显示全部楼层
这个解码程序真简洁

出5入10汤圆

发表于 2016-8-29 12:40:03 | 显示全部楼层
东西很给力,回去测试下。

出0入0汤圆

发表于 2016-8-29 12:44:18 | 显示全部楼层
谢谢分享注释版

出0入0汤圆

发表于 2016-8-29 14:18:31 | 显示全部楼层
记得! 125us的定时中断! 思路很好!

出0入0汤圆

发表于 2016-8-29 14:23:15 | 显示全部楼层
藏了,留备

出0入0汤圆

发表于 2016-10-13 08:40:35 | 显示全部楼层
有机会试试

出0入0汤圆

发表于 2016-10-13 08:58:01 | 显示全部楼层
就这程序楼主那十多行将其搞起也真是佩服了。

出0入0汤圆

发表于 2016-10-13 09:24:43 | 显示全部楼层
多谢你,不错的东西

出0入0汤圆

发表于 2019-1-27 13:42:52 | 显示全部楼层
楼主为啥解出来跟普通的码值对应不上啊

出0入0汤圆

发表于 2019-2-1 13:42:49 | 显示全部楼层
irTime++;
   if(irTime==240) {irTime--;  codeCnt=0x3f;} // ir解码后码值存放时间, 240*125us = 30ms   //如果已經過了30MS,還要把      irTime-,為何要這樣做可以給個解釋嗎




     

出0入0汤圆

发表于 2019-2-1 17:43:00 | 显示全部楼层

好东西  收藏先
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 19:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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