#include<reg52.h>
#include "MacroandConst.h"
#include "L298_2.h"
#include "main.h"
sbit IR=P3^2;
uchar flag;
uchar IRcom[6];
uint LowTime,HighTime;
/*函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat*/
bit DeCode(void)
{
uchar i,j;
uchar temp;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
temp=temp>>1;
TH0=0;
TL0=0;
TR0=1;
while(IR==0);
TR0=0;
LowTime=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
while(IR==1);
TR0=0;
HighTime=TH0*256+TL0;
if((LowTime<390)||(LowTime>680))
return 0;
if((HighTime>450)&&(HighTime<670))
temp=temp&0x7f;
if((HighTime>1400)&&(HighTime<1890))
temp=temp|0x80;
}
IRcom[i]=temp;
}
if(IRcom[2]=~IRcom[3])
{ IRcom[5]=IRcom[2]&0x0f;
IRcom[4]=IRcom[2]>>4;
if(IRcom[4]>9) {IRcom[4]=IRcom[4]+0x37;}
else {IRcom[4]=IRcom[4]+0x30;}
if(IRcom[5]>9) {IRcom[5]=IRcom[5]+0x37;}
else {IRcom[5]=IRcom[5]+0x30;}
}
return 1;
}
/***********************************************/
//红外感应处理程序,用的键盘值是本人用于做LED灯
//调控的遥控器中的7个按键,具体看遥控器。
/***********************************************/
void Function(void)
{
TR1 = 1;
switch(IRcom[2])
{
case 0x5a: Go();break; //向上,对应小车的前进
case 0x1c: Stop();break; //中间,对应小车的停止
case 0x18: Right_Run();break; //向下,对应小车的后退
case 0x52: Left_Run();break; //向左,对应小车的左转
case 0x08: Back();break; //向左,对应小车的右转
case 0x42: Dangwei += 1;
if(Dangwei>10) Dangwei=10;break;
case 0x4a: Dangwei -= 1;
if(Dangwei<=1) Dangwei=1;break;
}
}
/*函数功能:红外线触发的外中断处理函数*/
void Int0(void) interrupt 0 using 0
{
EX0=0;
TH0=0;
TL0=0;
TR0=1;
while(IR==0);
TR0=0;
LowTime=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
while(IR==1);
TR0=0;
HighTime=TH0*256+TL0;
if((LowTime>8400)&&(LowTime<9600)&&(HighTime>3900)&&(HighTime<5100))
{
if(DeCode()==1)
{
Function();
}
}
EX0=1;
}
|