搜索
bottom↓
回复: 24

发个20多行代码的遥控解码程序,用定时器查询

  [复制链接]

出140入158汤圆

发表于 2014-9-16 09:17:01 | 显示全部楼层 |阅读模式
放在定时器中断中调用,根据定时中断的时间间隔,调整一下#define 的参数就可以用了,够简单了吧


#define        LeadCodeMin                                70               
#define        LeadCodeMax                                130               
#define        OneCodeMin                                12               
#define        OneCodeMax                                25               
#define        ZeroCodeMin                                4               
#define        ZeroCodeMax                                12               

uint8 IR_RecvCt=0;                                // 捕捉数据暂存
uint8 IR_Recv_Step=0;                //接收状态
uint8 IR_Recv_int=0;                //接收到一次有效的遥控指令就置1
uint8 IR_RecvBuf[IR_BUF_LEN];                //接收到的数据
uint8  PulseWidth;                //捕捉到的脉冲宽度
#define IR_RecvCt_Srv()  {IR_RecvCt++;if(IR_RecvCt>=250){IR_RecvCt=0;IR_Recv_Step=0;}}  
void IR_Recv_Srv(void){                //遥控解码,定时中断
        uint8 i;                                       
        static uint8  BitCt=0;        //                //接收位计数器
        static uint8  tmpByte=0;                //正在接收的字节
        static uint8 preIRin=1;
        uint8 IRin;
        uint8 IRin_falling=0;
        IR_RecvCt_Srv();
        IRin=IR_INPUT();                //定义您的输入
        if(IRin==0 && preIRin) IRin_falling=1;
        preIRin=IRin;
        if(IRin_falling){
                PulseWidth=IR_RecvCt;IR_RecvCt=0;
                if (IR_Recv_Step==0){BitCt=0;IR_Recv_Step=1;return;}
                if(IR_Recv_Step==1){
                        BitCt=0;
                        if ((PulseWidth<=LeadCodeMax)&&(PulseWidth>=LeadCodeMin)){IR_Recv_Step=2;}
                        return;
                }
                if (IR_Recv_int!=0){IR_Recv_Step=0;return;} //如果主循环还未响应遥控信号,则不接收新的遥控信号
                if(IR_Recv_Step!=2){IR_Recv_Step=0;}
                if (PulseWidth<ZeroCodeMin){IR_Recv_Step=0;return;}        
                if (PulseWidth>=OneCodeMax){IR_Recv_Step=0;return;}
                tmpByte>>=1;
                if (PulseWidth>=OneCodeMin){tmpByte|=0x80;}
                BitCt++;i=BitCt>>3;
                if (((BitCt&0x07)==0)&&(i>0)){IR_RecvBuf[i-1]=tmpByte;}
                if (BitCt>=(IR_BUF_LEN*8)){BitCt=0;IR_Recv_int=1;IR_Recv_Step=0;}
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-9-16 09:45:55 | 显示全部楼层
不错,收下了,感谢分享!

出0入0汤圆

发表于 2014-9-16 09:46:53 | 显示全部楼层
顶一下,上升沿的应该跟这个差不多吧。

出0入0汤圆

发表于 2014-9-16 09:54:52 | 显示全部楼层
把几行代码写成一行了

出0入0汤圆

发表于 2014-9-16 10:00:12 | 显示全部楼层
前段时间自己写过一个,IO中断+定时器,算出红外码,不过我用了两个资源

出0入0汤圆

发表于 2014-9-16 17:20:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-9-16 19:08:15 | 显示全部楼层
支持一下。

出0入0汤圆

发表于 2014-9-17 11:56:49 | 显示全部楼层
头像牛逼+10086

出0入0汤圆

发表于 2014-9-17 12:06:08 | 显示全部楼层
遥控接收信号还没搞懂,学习了

出0入0汤圆

发表于 2016-2-14 18:54:46 | 显示全部楼层
学习了,谢谢分享!最近在DIY……

出0入0汤圆

发表于 2016-2-15 09:04:33 | 显示全部楼层
最近刚好做了一个,学习一下

出0入0汤圆

发表于 2016-2-17 12:26:11 | 显示全部楼层

头像像是不能说的秘密里的....

出0入0汤圆

发表于 2016-4-10 22:29:03 | 显示全部楼层
红外的   没有无线的吗  

出0入0汤圆

发表于 2016-4-11 08:56:45 | 显示全部楼层
我是用外部中断加上定时器的方式,计算脉宽得出红外码,支持重复码

出0入0汤圆

发表于 2016-4-11 09:30:33 | 显示全部楼层
学习了,谢谢!

出0入0汤圆

发表于 2017-11-19 19:28:14 | 显示全部楼层
IR_BUF_LEN  是收到数据格式的长度?

IR_INPUT();     是读取IO的状态?

这个适应在多长的定时器中断?  我改过去没反应   

uint8 IR_Recv_int=0;                //接收到一次有效的遥控指令就置1
这个等于 1 的时候 就是收到遥控器按键了?  还是手动置1? 

出0入8汤圆

发表于 2017-11-21 17:22:06 | 显示全部楼层
本帖最后由 kebaojun305 于 2017-11-21 17:24 编辑

一直用定时器定时扫描来解码  可以任意IO口解码。  顺便定时器可以可以任意口驱动交流蜂鸣器  2k  4k 。

出0入0汤圆

发表于 2017-11-23 07:41:48 来自手机 | 显示全部楼层
可以用了 很好用  不用开外部中断  任意io就可以了  就是我现在可以用但是我的中断是多久我也不知道   谢谢楼主66666

出0入0汤圆

发表于 2018-6-17 20:59:34 | 显示全部楼层
留个脚印

出0入0汤圆

发表于 2018-7-6 14:17:07 | 显示全部楼层
请问一下定时器的中断间隔是多少呢?

出0入0汤圆

发表于 2018-7-6 14:38:46 | 显示全部楼层
我去,这都追问了4年了,楼主还是没有回答定时器中断到底是多少?该不会成为永久的迷了吧?

出0入0汤圆

发表于 2018-7-7 10:06:33 | 显示全部楼层
zhongsandaoren 发表于 2018-7-6 14:38
我去,这都追问了4年了,楼主还是没有回答定时器中断到底是多少?该不会成为永久的迷了吧? ...

何必呢,告诉你吧,一般是100us

出0入0汤圆

发表于 2018-7-7 11:08:34 | 显示全部楼层
本帖最后由 3DA502 于 2018-7-7 11:19 编辑

我写比lz的更简单
货真价实不到20行



  1. void tm0() interrupt 1 using 1
  2. {
  3.     static WORD  hwWaiteCnt;
  4.     static WORD  hwTicCnt;
  5.     static WORD  hwTicStampPosedge ;
  6.     WORD  hwTicStampNegedge;
  7.     WORD  hwTicInc;
  8.    
  9.     static BYTE streamBuf;
  10.    
  11.      
  12.     if (--TCNT == 0)
  13.     {
  14.         TCNT = 3;                       //reset send baudrate counter
  15.         if (TING)                       //judge whether sending
  16.         {
  17.             if (TBIT == 0) {
  18.                 PinTXB = 0;                //send start bit
  19.                 TDAT = TBUF;            //load data from TBUF to TDAT
  20.                 TBIT = 9;               //initial send bit number (8 data bits + 1 stop bit)
  21.             } else {
  22.                 TDAT >>= 1;             //shift data to CY
  23.                 if (--TBIT == 0) {
  24.                     PinTXB = 1;
  25.                     TING = 0;           //stop send
  26.                     TEND = 1;           //set send completed flag
  27.                 } else {
  28.                     PinTXB = CY;           //write CY to TX port
  29.                 }
  30.             }
  31.         }
  32.     }
  33.    
  34.         
  35.     if(STATE_BLAND == state.stateNum){ /* stop test and waite a time*/
  36.         if(hwWaiteCnt > 0){
  37.             hwWaiteCnt -= 1;
  38.             return;
  39.         }else{
  40.             hwWaiteCnt = BLAND_TICK;
  41.             state.stateNum = STATE_WAITE4_SYNC ;
  42.         }
  43.         }
  44.    
  45.     streamBuf <<= 1;
  46.     streamBuf |= PinRF;         /* bit stream buff*/
  47.    
  48.     hwTicCnt += 1;              /* tick increase */
  49.      
  50.     if(STATE_WAITE4_SYNC == state.stateNum){
  51.                 if(streamBuf == 0){
  52.                         state.syncLowCnt += 1;     /* if low , keep  count*/
  53.                         if(state.syncLowCnt > SYNC_LENGTH){ /* if get sync signal*/
  54.                                
  55.                                 state.rcvBufIdex = 0; /* reset the buffer index*/
  56.                                
  57.                                 state.stateNum = STATE_SAMPLE_START;
  58.                                  rcvID.rcvIDlong =0;
  59.                         }
  60.                 }else{  
  61.                         state.syncLowCnt = 0;      /* reset , if any pulse */
  62.                 }
  63.         }
  64.    

  65.     if(STATE_SAMPLE_START == state.stateNum){
  66.             if( streamBuf == 0x01 ){ /* rising edge*/
  67.             hwTicStampPosedge = hwTicCnt;/* sample ticks1*/
  68.                 }
  69.                 if( streamBuf == 0xfe ){ /* rising edge*/
  70.                         hwTicStampNegedge = hwTicCnt;/* sample ticks2*/
  71.                 //        if(hwTicStampNegedge > hwTicStampPosedge){
  72.                          hwTicInc = hwTicStampNegedge - hwTicStampPosedge; /* ignoi a little bug*/
  73.                         //}
  74.                         if(hwTicInc > 0xb0){
  75.                 state.rcvBuf[state.rcvBufIdex] = '1';
  76.             }else{
  77.                 state.rcvBuf[state.rcvBufIdex] = '0';
  78.             }   
  79.             
  80.                         if(hwTicInc > 0xb0){
  81.                 rcvID.rcvIDlong += 1;
  82.             }              
  83.             rcvID.rcvIDlong <<= 1;
  84.                           
  85.                         state.rcvBufIdex += 1;       /* index ++*/
  86.                         if(state.rcvBufIdex >= 23){
  87.                                 state.rcvBufIdex = 0;
  88.                 state.stateNum = STATE_SEND;
  89.                         }
  90.                 }
  91.     }
  92. }
  93.    
复制代码

   
   

出0入0汤圆

发表于 2023-11-3 08:56:05 | 显示全部楼层
zhongsandaoren 发表于 2018-7-6 14:38
我去,这都追问了4年了,楼主还是没有回答定时器中断到底是多少?该不会成为永久的迷了吧? ...
(引用自21楼)

/*
遥控码由三部分组成
1、leader code 9ms的高电平 + 4.5ms 的低电平
2、系统识别码 区别不同的红外遥控设备
3、操作码 8bit操作码和8bit的操作反码组成

0和1均以0.56ms的低电平开始(实际测量是500us的样子),不同的是后面出现的高电平,
如果高电平是0.56ms(实际测量是500us的样子),则表示0,如果高电平是1.68ms(0.56*3=1.68)则表示1

结束码
高电平超过40ms,然后出现9ms的低电平
连发码 2.1ms的高电平
*/


1码判断范围是4~12 个时间单位   协议要求高电平持续时间是0.56ms  实测500us   所以程序中定时器的中断时间应该是100us


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

本版积分规则

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

GMT+8, 2024-3-29 01:37

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

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