[器件资料] 飞利蒲RC5编码遥控器C51解码

[复制链接] 查看: 3837|回复: 0

39

主题

0

好友

1072

积分
     

侠之大者 当前离线

Rank: 6Rank: 6

UID
6252
帖子
1057
精华
0
经验
1072 点
金钱
566 ¥
注册时间
2005-11-9
发表于 2008-10-31 10:09 | 显示全部楼层
网上找了一些都感觉不怎么好用,写了个比较短小精悍的,测试遥控器就是那些CDM3,4那些转盘用的遥控器:
//rc5.h
#ifndef                __RC5_H_
#define                __RC5_H_
#ifdef                __RC5SRC__
/*
remote control ic:M34280MK-345FP
d d d  ddddd dddddd
d=889*2
bit0:1_0
bit1:0_1
X-12.00000M
*/
unsigned int                currentRecvkey;
unsigned char                ir_int_pos;
bit                         NextBitVal;
bit                        IR_NewKey;
unsigned int                IR_KeyVal;
unsigned char                IR_Temp;
void                         IrInit();
#else
extern bit                IR_NewKey;
extern unsigned int        IR_KeyVal;
extern void                 IrInit();
#endif
#endif

//RC5.c
#include <AT89X52.h>
#include <intrins.h>
#define __RC5SRC__
#include <rc5.h>
//----------------------------------------------------------
void IrInit()
{               
    TMOD=0x11;//实际只用到timer0(16位定时器由应用程序控制)
    TR0=0;ET0=0;TH0=0xfc;TL0=0x91;
    //这里产生一个889us的中断,减掉外中断跳转需要的11us[65534-889+11]
    EX0=1;
    EA=1;
}
//----------------------------------------------------------
void timer0() interrupt 1
{               
    TL0=0x2e;TH0=0xf9;
    //这里产生一个1778us的中断,减掉定时中断跳转需要的33us[65534-1778+33]
    currentRecvkey=currentRecvkey<<1;
    if(NextBitVal)
            currentRecvkey++;
    ir_int_pos++;
    if(ir_int_pos>13){       
        currentRecvkey=currentRecvkey&0X1FFF;
        if(currentRecvkey>0){
                    IR_KeyVal=currentRecvkey;
            IR_NewKey=1;
        }
        IrInit();
    }
    else
    NextBitVal=P3_2;
}
//----------------------------------------------------------
void exint0() interrupt         0        //下降边沿触发  
{
        TR0=1;ET0=1;        //启动T0
        EX0=0;                //关闭EX0
        ir_int_pos=0;
        NextBitVal=1;
        currentRecvkey=0;
        IR_Temp=0;
        //jitter
        while(P3_2==0&&IR_Temp<16){
                IR_Temp++;
        }
        if(IR_Temp<15){
                IrInit();
        }
}
//--------------------------------------------------------
IR_NewKey=1时候说明有新的按键收到了,数据在IR_KeyVal
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部