5279|12

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

谁有学习遥控器的代码参考啊? [复制链接]

各位大侠,最近在做学习型遥控器,可是老是不对,那位好心的人给个代码参考一下啊?

最新回复

还是自个吃透了逻辑,自个写的代码舒服哈!  详情 回复 发表于 2013-11-11 09:29
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
对方能接收到数据么?出问题的话,一般也就是红外发送的时候出问题了,一般的编码,只要对照编码规格书就不会有错的。。。
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
能收到数据啊,可是去控制设备的时候就不行了?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
恩,也就是收到的数据不正确,能检测到对方收到的是什么数据么?你的遥控器的发送端是不是用一个红外发送管,然后用个三极管来驱动它的?那么你在发送的时候,是不是要定时器来完成发送的编码脉冲时序的?检查下这个编码脉冲时序。这些东西讲很难讲,呵呵,相对比较难调,特别是没有示波器来抓的话,更难搞。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
#include        //51芯片管脚定义头文件
#include          //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint  unsigned int

//#define        DELAYNUM        40        //该数值可以调节显示的速度
sbit  SDATA_595=P1^5;   //串行数据输入
sbit  SCLK_595 =P1^6;   //移位时钟脉冲
sbit  RCK_595  =P1^7;   //输出锁存器控制脉冲
sbit  CS_LED8   =P1^1;   //片选
sbit  CS_1302   =P1^4;
sbit  IRIN = P3^2;         //红外接收器数据线
sbit  BEEP = P3^7;         //蜂鸣器驱动线
sbit  DCMOTO = P3^4;         //直流电机驱动线


//uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
uchar  dis[8];

void delay(unsigned char x);
void  display();
void beep();


/*******************************************************
*                                                      *
* 主函数                                               *
*                                                      *
*******************************************************/
main(void)
{
//        uchar k;
        TMOD|=0x01;
        TH0=0Xfc;
        TL0=0X66;
        TR0=1;
        EA=1;
        ET0=1;
        EX0=1;
        IP=0X01;
        CS_1302=0;
        DCMOTO=0;
        while(1)
        {
                dis[7]=table[IRCOM[4]];
                dis[6]=table[IRCOM[5]];
//                display();
                if(IRCOM[2]==0x01)                DCMOTO=~DCMOTO;                        //启动电机
                if(IRCOM[2]==0x02)                DCMOTO=0;                                //停止电机
        }

} //end of main()

void timer0(void)        interrupt 1
{
        TH0=0Xfc;
        TL0=0X66;
        display();
}

/*******************************************************
*                                                      *
* 显示函数                                    *
*                                                      *
*******************************************************/

void display()
{
        uchar num,c,i;
        for(i=0;i<8;i++)
        {
                num=dis;
                CS_LED8=0;
                for(c=0;c<8;c++)
                {
                        SCLK_595=0;
                        num=num<<1;
                        SDATA_595=CY;
                        SCLK_595=1;
                        SCLK_595=0;
                }
                num=~(1<                 for(c=0;c<8;c++)
                {
                        SCLK_595=0;
                        num=num>>1;
                        SDATA_595=CY;
                        SCLK_595=1;
                        SCLK_595=0;
                }
                RCK_595=0;
                _nop_();
                _nop_();
                RCK_595=1;
                _nop_();
                _nop_();
                RCK_595=0;
                delay(1);
                CS_LED8=1;
        }
}

void IR_IN() interrupt 0 //using 0
{
        unsigned char j,k,N=0;
        EA = 0;   
        delay(10);
       
        if (IRIN==1)
        {
                EA =1;
                return;
        }
                        //确认IR信号出现
        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
        {
                delay(1);
        }
        while (IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
        {
                delay(1);
        }
        for (j=0;j<4;j++)         //收集四组数据
        {
                for (k=0;k<8;k++)        //每组数据有8位
                {
                        while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
                        {
                                delay(1);
                        }
                        while (!IRIN)          //等 IR 变为高电平
                        {
                                delay(1);
                        }
                        while (IRIN)           //计算IR高电平时长
                        {
                                delay(1);
                                N++;   
                        }                        //高电平计数完毕     
                           if (N>=30)
                        {
                                EA=1;
                                return;                  //0.14ms计数过长自动离开。
                        }
                        IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
                        if (N>7)
                        {
                                IRCOM[j] = IRCOM[j] | 0x80;
                        }                                                  //数据最高位补“
                        N=0;
                }//end for k
        }//end for j
        /*
        if (IRCOM[2]!=~IRCOM[3])   //接收时间是否正确
    {
      EA=1;
      return;
    }
       
        if(IRCOM[0]!=0x00)         //比较用户码
    {
      EA=1;
      return;
    }*/
        IRCOM[4]=IRCOM[2] & 0x0F;     //取键码的低四位
        IRCOM[5]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位

        beep();

        EA = 1;
}

/**********************************************************/
void beep()
{
  unsigned char i;
  for (i=0;i<180;i++)
   {
     delay(6);
     BEEP=!BEEP;                 //BEEP取反
   }
  BEEP=1;                      //关闭蜂鸣器
}
/**********************************************************/
void delay(unsigned char x)    //x*0.14MS
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++) {}
}
}
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
上面的代码采用外部中断来实现接收。。接收放是1838的红外接收头。。已测试通过。。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼上是红外接收来控制电机的程序,不是发送的,呵呵
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果是学习型的就要在EEPROM里面加对比函数。。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
#include "../include/msp430x41x2.h"
#include "../include/ir.h"
#include "../include/e2rom.h"
#include "../include/time.h"

#include "../include/lcd.h"

#define ir_power_on()   P1OUT |= BIT0
#define ir_power_off()  P1OUT &= ~BIT0
#define ir_out0()       P3OUT &= ~BIT1
#define ir_out1()       P3OUT |= BIT1


typedef struct
{
    u8 carrier_cycle; //载波周期时间
    u8 num;          //字节数
    u16 lead_h;    //引导高载波周期
    u16 lead_l;    //引导低时间
    u16 bit1_high;   //位1 高电平载波周期
    u16 bit0_high;   //位0 高电平载波周期
    u16 bit1_low; //位1 低电平时间
    u16 bit0_low; //位0 低电平时间
    u8 bit_num_last_data;
    u8 data[15]; //数据
} ir_code_t;  //15 + 15

const u16 ir_config_addr[5] = {IR_CONFIG1_ADDR,IR_CONFIG2_ADDR,IR_CONFIG3_ADDR,IR_CONFIG4_ADDR,IR_CONFIG5_ADDR};


volatile u8 recv_int_flag = 0; //接收中断标志
volatile u8 recv_int_stop_flag = 0;
volatile u16 ta1_overflow = 0;
u16 recv_carrier_cycle = 0;    //每次接收载波周期
u16 count_bit = 8;   //学习数据位计数
ir_code_t ir_code;   //红外码变量

void ir_init(void)
{
    P1DIR |= BIT0;  //电源控制输出
    ir_power_off();
    ir_out0();
    P3DIR |= BIT1;   //   P3.1 output
    P3SEL |= BIT1 + BIT0;   //P3.1 P3.0 option select
}

void ir_stop(void)
{
    TA1CTL = 0;
    //TA1CCTL0 = 0;
    TA1CCTL2 = 0;
    TA1CCTL3 = 0;
}


//TA1  1MHZ  capture
u8 ir_ta1_capture_1mhz(void)
{
    u8 step = 0;
   
    ta1_overflow = 0;
    while (ta1_overflow < 154)
    {
        if (recv_int_flag)
        {
            recv_int_flag = 0;
            switch (step)
            {
                case 0: //接收到IR信号,准备接收
                    TA1CCTL2 &= ~CM_1;
                    TA1CCTL2 |= CM_2;//neg.
                    recv_carrier_cycle = 0;
                    ir_code.carrier_cycle = 0xff;
                    ir_code.bit0_high = 0;
                    ir_code.bit0_low = 0;
                    ir_code.bit1_high = 0;
                    ir_code.bit1_low = 0;
                    ir_code.lead_h = 0;
                    ir_code.lead_l = 0;
                    ir_code.num = 0;
                    for (u16 i = 0; i < 16; i++)
                    {
                        ir_code.data = 0;
                    }
                    count_bit = 8;
                    recv_int_stop_flag = 0;
                    ta1_overflow = 0;
                    step = 10;
                    break;
                case 10://判断是否有载波
                    if (recv_carrier_cycle > 1000)//no
                    {
                        ir_code.lead_h = recv_carrier_cycle;
                        ir_code.carrier_cycle = 0;
                        TA1CCTL2 &= ~CM_2;
                        TA1CCTL2 |= CM_3;//both
                        step = 11;
                    }
                    else
                    {
                        TA1CCTL2 &= ~CM_2;
                        TA1CCTL2 |= CM_1;//pos.
                        step = 1;
                    }
                    break;
                case 1: //开始接收,解码载波周期
                    ir_code.lead_h ++;  //引导码高电平加1
                    if ((ir_code.lead_h > 10) && (20 < recv_carrier_cycle) && (recv_carrier_cycle < 30))//33k-50k
                    {
                        ir_code.carrier_cycle = recv_carrier_cycle; //记录载波周期
                        step = 2;
                    }
                    break;
                case 2: //解码引导码
                    if (recv_carrier_cycle >> 8)
                    {
                        ir_code.lead_l = recv_carrier_cycle - ir_code.carrier_cycle;//记录引导码低电平                        
                        step = 3;                    
                    }
                    else
                    {
                        ir_code.lead_h ++;  //引导码高电平加1
                    }
                    break;
                case 3: //解码数据bit1
                    if (recv_carrier_cycle >> 8)
                    {
                        ir_code.bit1_low = recv_carrier_cycle - ir_code.carrier_cycle;//记录数据bit1低电平
                        ir_code.data[ir_code.num] <<= 1;
                        ir_code.data[ir_code.num]++;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                        step = 4;
                    }
                    else
                    {
                        ir_code.bit1_high ++;   //数据bit1高电平加1
                    }
                    break;
                case 4: //解码数据bit0
                    if (recv_carrier_cycle >> 8)
                    {
                        recv_carrier_cycle -= ir_code.carrier_cycle;   //低电平时间
                        if (((recv_carrier_cycle <= ir_code.bit1_low) && ((ir_code.bit1_low - recv_carrier_cycle) < 10))
                            || ((ir_code.bit1_low < recv_carrier_cycle)  && ((recv_carrier_cycle - ir_code.bit1_low) < 10)))//误差为10
                        {
                            ir_code.data[ir_code.num] <<= 1;
                            ir_code.data[ir_code.num]++;
                            if (!(--count_bit))
                            {
                                count_bit = 8;
                                ir_code.num ++;
                            }
                            ir_code.bit0_high = 0;
                        }
                        else
                        {
                            ir_code.bit0_low = recv_carrier_cycle;//记录数据bit0低电平
                            ir_code.data[ir_code.num] <<= 1;
                            if (!(--count_bit))
                            {
                                count_bit = 8;
                                ir_code.num ++;
                            }
                            step = 5;
                        }
                    }
                    else
                    {
                        ir_code.bit0_high ++;
                    }
                    break;
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
               case 5: //解码数据
                    if (recv_carrier_cycle >> 8)
                    {
                        recv_int_stop_flag = 1;
                        recv_carrier_cycle -= ir_code.carrier_cycle;   //低电平时间
                        
                        if (recv_carrier_cycle > ir_code.lead_l)
                        {
                            recv_int_stop_flag = 0;
                            return OK;
                        }
                        else if (ir_code.bit1_low < ir_code.bit0_low)
                        {
                            if (recv_carrier_cycle <= ir_code.bit1_low)
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                ir_code.data[ir_code.num]++;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                            else if (ir_code.bit0_low <= recv_carrier_cycle)
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                            else if ((recv_carrier_cycle - ir_code.bit1_low) < (ir_code.bit0_low - recv_carrier_cycle))
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                ir_code.data[ir_code.num]++;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                            else
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                        }
                        else//ir_code.bit0_low < ir_code.bit1_low
                        {
                            if (recv_carrier_cycle <= ir_code.bit0_low)
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                            else if (ir_code.bit1_low <= recv_carrier_cycle)
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                ir_code.data[ir_code.num]++;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                            else if ((recv_carrier_cycle - ir_code.bit0_low) < (ir_code.bit1_low - recv_carrier_cycle))
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                            else
                            {
                                ir_code.data[ir_code.num] <<= 1;
                                ir_code.data[ir_code.num]++;
                                if (!(--count_bit))
                                {
                                    count_bit = 8;
                                    ir_code.num ++;
                                }
                            }
                        }
                        recv_int_stop_flag = 0;
                    }
                    break;
                    
                case 11://无载波  引导低
                    ir_code.lead_l = recv_carrier_cycle;
                    step = 12;
                    break;
                case 12://BIT1 high
                    ir_code.bit1_high = recv_carrier_cycle;
                    step = 13;
                    break;
                case 13://BIT1 low
                    ir_code.bit1_low = recv_carrier_cycle;
                    ir_code.data[ir_code.num] <<= 1;
                    ir_code.data[ir_code.num]++;
                    count_bit--;
                    step = 14;
                    break;
                case 14://BIT0 high
                    ir_code.bit0_high = recv_carrier_cycle;
                    step = 15;
                    break;
                case 15://BIT0 low
                    if (((recv_carrier_cycle <= ir_code.bit1_low) && ((ir_code.bit1_low - recv_carrier_cycle) < 50))
                        || ((ir_code.bit1_low < recv_carrier_cycle)  && ((recv_carrier_cycle - ir_code.bit1_low) < 50)))//误差为50
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        ir_code.data[ir_code.num]++;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                        ir_code.bit0_high = 0;
                        step = 14;
                    }
                    else
                    {
                        ir_code.bit0_low = recv_carrier_cycle;
                        ir_code.data[ir_code.num] <<= 1;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                        step = 16;
                    }
                    break;
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
                case 16://neg.
                    if (ir_code.bit1_low < ir_code.bit0_low)
                    {
                        step = 17;
                    }
                    else
                    {
                        step = 18;
                    }
                    break;
                case 17://pos. ir_code.bit1_low < ir_code.bit0_low
                    if (recv_carrier_cycle > ir_code.lead_l)
                    {
                        return OK;
                    }
                    if (recv_carrier_cycle <= ir_code.bit1_low)
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        ir_code.data[ir_code.num]++;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    else if (ir_code.bit0_low <= recv_carrier_cycle)
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    else if ((recv_carrier_cycle - ir_code.bit1_low) < (ir_code.bit0_low - recv_carrier_cycle))
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        ir_code.data[ir_code.num]++;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    else
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    step = 16;
                case 18://pos. ir_code.bit0_low < ir_code.bit1_low
                    if (recv_carrier_cycle > ir_code.lead_l)
                    {
                        return OK;
                    }

                    if (recv_carrier_cycle <= ir_code.bit0_low)
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    else if (ir_code.bit1_low <= recv_carrier_cycle)
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        ir_code.data[ir_code.num]++;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    else if ((recv_carrier_cycle - ir_code.bit0_low) < (ir_code.bit1_low - recv_carrier_cycle))
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    else
                    {
                        ir_code.data[ir_code.num] <<= 1;
                        ir_code.data[ir_code.num]++;
                        if (!(--count_bit))
                        {
                            count_bit = 8;
                            ir_code.num ++;
                        }
                    }
                    step = 16;
                    break;
                    
            }
        }
    }
    return FALSE;

}

//学习至ir_code
//成功返回OK,失败返回FALSE
u8 ir_learn(void)
{
    u16 temp = 0;
   
    ir_power_on();
    osc_setup(8);
    TA1CTL = TASSEL_2 + ID_3 + MC_2 + TAIE;     // SMCLK, 8 Div, Contmode int enable
    TA1CCTL2 = CM_1 + CCIS_0 + SCS + CAP + CCIE;    //上升沿捕捉,CCI2A,同步捕获,CCIFG0中断允许
    temp = ir_ta1_capture_1mhz();
    ir_stop();
    osc_setup(1);
    ir_power_off();
   
    if (OK == temp)
    {
        if (count_bit != 8)
        {
            ir_code.data[ir_code.num] <<= count_bit;
            ir_code.bit_num_last_data = 8 - count_bit;
            ir_code.num ++;
        }
        else
        {
            ir_code.bit_num_last_data = 8;
        }
        ////////////////////////////test//////////////////////////
        
        /*uart_sendbyte(ir_code.carrier_cycle);
       uart_sendbyte(ir_code.num);
        uart_sendbyte(ir_code.lead_h >> 8);
        uart_sendbyte(ir_code.lead_h);
        uart_sendbyte(ir_code.lead_l >> 8);
        uart_sendbyte(ir_code.lead_l);
        uart_sendbyte(ir_code.bit1_high >> 8);
        uart_sendbyte(ir_code.bit1_high);
        uart_sendbyte(ir_code.bit1_low >> 8);
        uart_sendbyte(ir_code.bit1_low);
        uart_sendbyte(ir_code.bit0_high >> 8);
        uart_sendbyte(ir_code.bit0_high);
        uart_sendbyte(ir_code.bit0_low >> 8);
        uart_sendbyte(ir_code.bit0_low);
        uart_sendbyte(ir_code.bit_num_last_data);
        for (u16 j = 0; j < 15; j++)
        {
            uart_sendbyte(ir_code.data[j]);
        }
        */
        /////////////////////////////////////////////////////////
        return OK;
    }
    else
    {
        return FALSE;
    }
}
 
 
 

回复

69

帖子

1

TA的资源

一粒金砂(高级)

12
 
学习一下,回去试试看
 
 
 

回复

301

帖子

2

TA的资源

一粒金砂(中级)

13
 
还是自个吃透了逻辑,自个写的代码舒服哈!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表