赞助论坛
  • 5358阅读
  • 0回复

我也弄个遥控接收测码的 [复制链接]

楼层直达
发帖
13
精华
0
金币
47
威望
0
贡献
0
好评
0
注册
2010-06-12
楼主    tanfplayer 发表于: 2013-03-18 08:16:24 
因为跟上班需要,经常要修遥控器所以我也弄个遥控接收解码的板子,
[img]http://e.hiphotos.baidu.com/album/s%3D550%3Bq%3D90%3Bc%3Dxiangce%2C100%2C100/sign=f537f5f53ac79f3d8be1e4358a9abc2c/71cf3bc79f3df8dced0a3f9bcc11728b47102880.jpg?referer=33b98a1e43a7d933e6bfd143889e&x=.jpg[/img]
前两位为地址码中间两位为按键值,最后两位为按键次数记数


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


//******************************************************************
//*****************载入头文件***************************************
#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[i]>>=1;date[i]=date[i]|0x00;}
        else if(P33==1){delay1000();date[i]>>=1;date[i]=date[i]|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]