文档库 最新最全的文档下载
当前位置:文档库 › CARMP3_红外线控制LED_51与2051程序

CARMP3_红外线控制LED_51与2051程序

#include
#define u8 unsigned char
#define u16 unsigned int
u8 code shu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管显示数据
u8 code ma[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管位选择数据
u8 shu1[33]; ///接收码时间函数
u8 shu2[4]; ///接收码函数
u8 shu3[8]; ///显示接收码函数
sbit s1=P3^5; /// 段选
sbit s2=P3^4; /// 位选
sbit led=P3^7;
u8 t,b1,b2,b3,b4; ////各个标志位变量

void delay(u16 d) ///延时函数
{
u8 d1;
while(d--)
for(d1=123;d1>0;d1--);
}

void dx() ///显示段码脉冲
{

s1=1;
s1=0;
}
void wx() ///显示位码脉冲
{

s2=1;
s2=0;
}


void t0int() ///定时器T0方式2自动重载模式初始函数
{
TMOD=0X02;
TH0=0X00;
TL0=0X00;
ET0=1;
EA=1;
TR0=1;
}

void in0() ////外部中断低电平出发初始函数
{
IT0=1;
EX0=1;
EA=1;
}

void chuli_1() ////处理遥控码
{
u8 zhi,k=1,i,j;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
zhi=zhi>>1;
if(shu1[k]>6) ////判断接收数据的值
{
zhi=zhi|0x80;
}
k++;
}
shu2[j]=zhi;
}
b4=1;

}

void chuli_2() ////处理显示码
{
shu3[0]=shu2[0]/16;
shu3[1]=shu2[0]%16;
shu3[2]=shu2[1]/16;
shu3[3]=shu2[1]%16;
shu3[4]=shu2[2]/16;
shu3[5]=shu2[2]%16;
shu3[6]=shu2[3]/16;
shu3[7]=shu2[3]%16;


}

void xianshi() //////显示函数
{
u8 s;
for(s=0;s<8;s++)
{
P1=shu[shu3[s]];
dx();
P1=ma[s];
wx();
delay(3);
P1=0xff;
wx();
P1=0x00;
dx();
delay(1);

}
}

void chuli_3()
{
if(b3==1) ///判断是否接收到数据
{
b3=0;
chuli_1(); ///接收到数据将数据处理
}
if(b4==1) ///判断是否处理好数据
{
b4=0;
chuli_2(); ///处理好数据将数据处理为显示数据
}

}
void main() ////主函数
{
t0int();
in0();
while(1)
{
chuli_3(); ///数据处理3
if(shu2[2]==0x45) led=0; ///开LED
if(shu2[2]==0x46) led=1; ///关LED


xianshi(); ////显示数码管
}
}

void t0() interrupt 1 ////时间中断T0函数
{
t++;
}
void in() interrupt 0 /////外部中断0函数
{
if(b1)
{
if(t>32) ///再次进入数据判断手否启动码
{
b2=0; ///是启动码将存储位置标志清零;
}
shu1[b2]=t; ///开始接收每次外部中断的时间数t
t=0; ///清零t重新开始下次外部中断计数
b2++; ///将存储标志位加一
if(b2==33) ////判断是否接收数据完成
{
b2=0; ////清零存储标志位
b3=1; ////置位接收完成标志位
}
}
else
{
b1=1; ///置位接收数据位。
t=0; ///定时器计数值清零,重新开始计数
}
}


相关文档