• 赞助网站
  • 您的位置:  首页 >> 技术交流区 >> MCU技术 >> 我也弄个遥控接收测码的
    我也弄个遥控接收测码的
    2013年03月18日 点击: 编辑: tanfplayer
    因为跟上班需要,经常要修遥控器所以我也弄个遥控接收解码的板子,


    IMAGE: http://e.hiphotos.baidu.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=f537f5f53ac79f3d8be1e4358a9abc2c/71cf3bc79f3df8dced0a3f9bcc11728b47102880.jpg?referer=33b98a1e43a7d933e6bfd143889e&x=.jpg
    前两位为地址码中间两位为按键值,最后两位为按键次数记数


    程序是乱写的 , 但可以用,我附在下面 希望有大虾帮忙优化优化


    //******************************************************************
    //*****************载入头文件***************************************
    #include <reg51.h>
    //******************************************************************

    //*****************数据定义部分*************************************
    #define uchar unsigned char
    #define uint unsigned int
    sbit P20=P2^0;
    sbit P21=P2^1;
    sbit P22=P2^2;
    sbit P23=P2^3;
    sbit P24=P2^4;
    sbit P25=P2^5;
    sbit P33=P3^3;
    uchar code leddata[16]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X98,0X88,0X83,0XC6,0XA1,0X86,0X8E};
    bit k=0;                 //红外解码判断标志位,为0则为有效信号,为1则为无效
    uchar date[4]={0,0,0,0};       //date数组为存放地址原码,反码,数据原码,反码
    uchar times=0;
    //******************************************************************

    //*****************子函数部分***************************************
    delay1000()                     //延时1MS
    {uchar i,j;i=5;do{j=95;do{j--;}while(j);i--;}while(i);}
    delay882()                       //延时882US
    {uchar i,j;i=6;do{j=71;do{j--;}while(j);i--;}while(i);}
    delay2400()                     //延时2400US
    {uchar i,j;i=5;do{j=237;do{j--;}while(j);i--;}while(i);}
    void delay1ms(unsigned int j)         //延时1MS
    {unsigned char i;
    for(;j>0;j--){for(i=0;i<125;i++){;}}
    }
    void displayirled(void)               //显示
    { uchar IR;
    IR=date[0]&0xF0;IR=IR>>4;
    P0=leddata[IR];P25=0;delay1ms(1);P2=0XFF;P0=0XFF;delay1ms(1);
    IR=date[0]&0x0F;
    P0=leddata[IR];P24=0;delay1ms(1);P2=0XFF;P0=0XFF;delay1ms(1);
    IR=date[2]&0xF0;IR=IR>>4;
    P0=leddata[IR];P23=0;delay1ms(1);P2=0XFF;P0=0XFF;delay1ms(1);
    IR=date[2]&0x0F;
    P0=leddata[IR];P22=0;delay1ms(1);P2=0XFF;P0=0XFF;delay1ms(1);
    IR=times&0xF0;IR=IR>>4;
    P0=leddata[IR];P20=0;delay1ms(1);P2=0XFF;P0=0XFF;delay1ms(1);
    IR=times&0x0F;
    P0=leddata[IR];P21=0;delay1ms(1);P2=0XFF;P0=0XFF;delay1ms(1);

    }
    void IR_decode(void)               //红外解码程序
    {uchar i,j;
    while(P33==0);
    delay2400();
    if(P33==1)           //延时2.4ms后如果是高电平则是新码
      {delay1000();
      delay1000();
      for(i=0;i<4;i++)
        {for(j=0;j<8;j++)
          {while(P33==0);                   //等待地址码第1位高电平到来
            delay882();                       //延时882us判断此时引脚电平
            if(P33==0){date>>=1;date=date|0x00;}
            else if(P33==1){delay1000();date>>=1;date=date|0x80;}
          }                             //1位数据接收结束
        }                               //32位二进制码接收结束
      }
    }
    void int1_int(void) interrupt 2       //外部中断1
    {uchar i;
    k=0;
    EX1=0;                               //检测到有效信号关中断,防止干扰
    for(i=0;i<4;i++){delay1000();if(P33==1){k=1;}}     //刚开始为9ms的引导码.
    if(k==0){EX1=0;                         //检测到有效信号关中断,防止干扰
          IR_decode();                     //如果接收到的是有效信号,则调用解码程序
            times++;
            if((times&0X0F)==0X0A){times=times+6;}
            if(times==0XA0){times=0;}
          }
    EX1=1;                               //开外部中断,允许新的遥控按键

    }
    //******************************************************************

    //*****************主函数部分***************************************
    void main(void)
    { SP=0x60;                           //堆栈指针

    P0=0XFF;
    P1=0XFF;
    P2=0XFF;
    P3=0XFF;

    EX1=1;EA=1;

    while(1)
    {displayirled();
    }
    }
    //******************************************************************
    [audio10]