haoDIY创好电子音响电脑科技DIY小制作发明移动版

主页 > 音响DIY > 功放DIY > 前级DIY >

单片机的应用例子--多功能红外线遥控前级(3)


        ldx                T1H,#%0                        ; 定时器重新置零
        orx                _ir_flag,#1                ; 标记收到红外线信号
c3_x
        iret


;=============================================================

vector        TIMER1=_isr_T1                        ;23.52mS
_isr_T1:                ;
        ldx                _step_ctr,#0        ; 无红外线信号空挡,步骤置零
        iret                                       


//C 语言部分
////////////////////////////////////////////////////////
// NEC uPD6121 波形 红外线读码 2007-08-23 江文正
// 方法 : 接收管输出下降沿触发中断子程序,读取下降沿之间的时间 width 后把定时器重新置零
// width 单位= 92.23uS, 前提是 定时器时钟 = 5.5296 MHz, prescale = 2
// 两个下降沿之间时段: 引导码, >11.81mS : width=128
// 重复码, >9mS : width=97
// >1.69mS : width=18 = 高电平数据,  <1.69mS : width=18 = 低电平数据


IR_decode()
{       
char rcv_8bit=0;
int rcv_16bit=0;

        ir_flag &= 0xFE;        //标记已处理
        if (step_ctr ==0)
        {
                step_ctr=1;        //开始
        }
        else
        {
                if (width > 128)        //引导码
                {
                        step_ctr=2;
                        user_code=0;        // 清0
                        cmd_code=0;        // 清0
                }
                else
                {
                        if (width > 97)        //重复码
                        {
                                step_ctr=34;        //
                        }
                    else
                        {
                                if (width > 18)        //高电平
                                {
                                        rcv_8bit=1;
                                        rcv_16bit=1;
                                }

                                if (step_ctr<18)        //用户码
                                        {
                                                rcv_16bit = rcv_16bit << (step_ctr-1);
                                                user_code |= rcv_16bit;
                                        }
                                else
                                {
                                        if (step_ctr<26)        //控制码
                                        {
                                                rcv_8bit = rcv_8bit << (step_ctr-17);
                                                cmd_code |= rcv_8bit;
                                        }
                                }
                                if (step_ctr>25)                //反码
                                {
                                        rcv_8bit = rcv_8bit << (step_ctr-25);
                                        comp_code |= rcv_8bit;
                                }
                       
                                step_ctr++;
                                if (step_ctr>33)                //有效码
                                {
                                        comp_code ^= 0xFF;        //2反位,2'complement
                                        comp_code--;
                                    if (cmd_code != comp_code)
                                        {
                                                step_ctr = 0;        //错码,无效
                                        }
                                }
                        }
                }
        }
}




大部分国内生产的遥控器都使用NEC码,你先按照提示找出你手中遥控器的用户码,然后再找出你所想使用的那几个按键的功能码,再把这些码取代以下的部分

//所用遥控器的控制码, 不同遥控器的码会不一样
#define user         0xFF00;// 用户码
#define vol_up         0x58;        // 增音量 <vol +> 按键
#define vol_dn         0x59;        // 减音量 <vol -> 按键
#define ch_up         0x4A;        // 下一个切换位置 <tune +> 按键
#define ch_dn         0x1E;        // 前一个切换位置 <tune -> 按键
#define mute         0x46;        // 静音 <mute> 按键
#define pwr                 0x40;        // 电源开关 <pwr> 按键 (责任编辑:admin)
haoDIY创好电子 版权所有,电话微信13977534587