因为跟上班需要,经常要修遥控器所以我也弄个遥控接收解码的板子,
[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]