#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit X1=P2^0;//前两轮
sbit X2=P2^1;//20 21为前右 22 23为前左
sbit X3=P2^2;
sbit X4=P2^3;
sbit X5=P1^0;//后两轮
sbit X6=P1^1;//10 11为后右 12 13为后左
sbit X7=P1^2;
sbit X8=P1^3;
#define qian_go {X1=0,X2=1,X3=0,X4=1;}
#define qian_hui {X1=1,X2=0,X3=1,X4=0;}
#define qian_tin {X1=0,X2=0,X3=0,X4=0;}
#define qian_zuo {X1=1,X2=0,X3=1,X4=0;}
#define qian_you {X1=0,X2=0,X3=1,X4=0;}
#define hou_go {X5=0,X6=1,X7=0,X8=1;}
#define hou_hui {X5=1,X6=0,X7=1,X8=0;}
#define hou_tin {X5=0,X6=0,X7=0,X8=0;}
#define hou_zuo {X5=0,X6=1,X7=1,X8=0;}
#define hou_you {X5=1,X6=0,X7=0,X8=1;}
void go( );
void hui( );
void tin( );
void zuo( );
void you( );
void delay(u16 i);
void init( );
u8 flag,X;
void main( )
{
init( );
while(1)
{
if(flag==1)//确认flag为1 开始执行
{
switch(X)//这里的x代表下面的字符 与下面的中断函数X无关
{
case ‘1’:
go( );
//delay(100);
break;
case ‘2’:
hui( );
break;
case '3':
zuo( );
break;
case '4':
you( );
break;
case '5':
tin( );
break;
default:
break;
}
}
RI=1;//串行口中断请求标志每次循环都将它置1.同意串行口请求 (一行串行数据被接收)
}
}
void init( )
{
TMOD=0x20;//0010 0000 TMOD中的gate为0 或门中为1 直接让TR1为1便可接通。ct中也选择了0即为定时模式 10是8位自动重装(与上者符合都用8位便于转换)
TH1=0xfd;//定时器重装初值
TL1=0xfd;//计数器重装
TR1=1;//开定时器1(若想开定时器0则将TR后数字换为0同时TH,TL后也换为0)
REN=1;//允许串行接收位(只能通过软件置1,启动串行接收位)
SM0=0;//10位异步是较为常用的方法
SM1=1;//01对应的是10位异步收发器
EA=1;//cpu开中断(总中断开关)
ES=1;//串行口中断允许位
flag=0;//先置为0 后中断函数中判断是否执行。
}
void go( )
{
qian_go;
hou_go;
}
void hui( )
{
qian_hui;
hou_hui;
}
void tin( )
{
qian_tin;
hou_tin;
}
void zuo( )
{
qian_zuo;
hou_zuo;
}
void you( )
{
qian_you;
hou_you;
}
void ser( )interrupt 4//4为串行口中断并进入程序中断函数
{
RI=0;//串行口不中断将接受的数据存入SBUF寄存器中
X=SBUF;//开始接受数据(将接收到的数据放入SBUF)定义的x是8位字节 恰好能够使用
flag=1;//重新置1
}