#include<AT89x52.H>
    #include <intrins.h>   
	#define Left_moto_go      {P1_0=1,P1_1=0,P1_2=1,P1_3=0;}    //左边两个电机向前走
	#define Left_moto_back    {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} 	//左边两个电机向后转
	#define Left_moto_Stop    {P1_0=0,P1_1=0,P1_2=0,P1_3=0;}    //左边两个电机停转                     
	#define Right_moto_go     {P1_4=1,P1_5=0,P1_6=1,P1_7=0;}	//右边两个电机向前走
	#define Right_moto_back   {P1_4=0,P1_5=1,P1_6=0,P1_7=1;}	//右边两个电机向前走
	#define Right_moto_Stop   {P1_4=0,P1_5=0,P1_6=0,P1_7=0;}	//右边两个电机停转   
   
	#define Sevro_moto_pwm    P2_7	 //接舵机信号端输入PWM信号调节速度
	#define left     'C'
    #define right    'D'
	#define up       'A'
    #define down     'B'
	#define stop     'F'
	#define Car      '1'	   //手机软件1号键
	unsigned char disbuff[4]	  ={ 0,0,0,0,};
    unsigned char posit=0;
 
	unsigned int  time=0;		    //时间变量
	unsigned int  timer1=0;		    //时间变量
    unsigned int  timer=0;			//延时基准变量
 
	bit  flag_REC=0; 				//串行接收标去位
	bit  flag    =0;  
	bit  flag_bz =0;
	unsigned char  i=0;
	unsigned char  dat=0;
    unsigned char  buff[5]=0;       //接收缓冲字节
   
/************************************************************************/	
//延时函数	
   void delay(unsigned int k)
{    
     unsigned int x,y;
	 for(x=0;x<k;x++) 
	   for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
     void  run(void)
{
	 Left_moto_go ;   //左电机往前走
	 Right_moto_go ;  //右电机往前走
}
//前速后退
     void  backrun(void)
{
    
	 Left_moto_back ;   //左电机往前走
	 Right_moto_back ;  //右电机往前走
}
//左转
     void  leftrun(void)
{
    
	 Left_moto_back ;   //左电机往前走
	 Right_moto_go ;    //右电机往前走
}
//右转
     void  rightrun(void)
{
    
	 Left_moto_go ;   //左电机往前走
	 Right_moto_back ;  //右电机往前走
}
//STOP
     void  stoprun(void)
{ 
	 Left_moto_Stop ;   //左电机往前走
	 Right_moto_Stop ;  //右电机往前走
}
//字符串发送函数
	  void send_str( )
                   // 传送字串
    {
	    unsigned char i = 0;
	    while(str[i] != '\0')
	   {
		SBUF = str[i];
		while(!TI);				// 等特数据传送
		TI = 0;					// 清除数据传送标志
		i++;					// 下一个字符
	   }	
    }
	
		  void send_str1( )
                   // 传送字串
    {
	    unsigned char i = 0;
	    while(str1[i] != '\0')
	   {
		SBUF = str1[i];
		while(!TI);				// 等特数据传送
		TI = 0;					// 清除数据传送标志
		i++;					// 下一个字符
	   }	
    }	
			  void send_str2( )
                   // 传送字串
    {
	    unsigned char i = 0;
	    while(str2[i] != '\0')
	   {
		SBUF = str2[i];
		while(!TI);				// 等特数据传送
		TI = 0;					// 清除数据传送标志
		i++;					// 下一个字符
	   }	
    }	
	    	
			  void send_str3()
                   // 传送字串
    {
	    unsigned char i = 0;
	    while(str3[i] != '\0')
	   {
		SBUF = str3[i];
		while(!TI);				// 等特数据传送
		TI = 0;					// 清除数据传送标志
		i++;					// 下一个字符
	   }	
    }	
	      void send_str4()
                   // 传送字串
    {
	    unsigned char i = 0;
	    while(str4[i] != '\0')
	   {
		SBUF = str4[i];
		while(!TI);				// 等特数据传送
		TI = 0;					// 清除数据传送标志
		i++;					// 下一个字符
	   }	
/************************************************************************/
void sint() interrupt 4	  //中断接收3个字节
{ 
 
    if(RI)	                 //是否接收中断
    {
       RI=0;
       dat=SBUF;
       if(dat=='O'&&(i==0)) //接收数据第一帧
         {
            buff[i]=dat;
            flag=1;        //开始接收数据
         }
       else
      if(flag==1)
     {
      i++;
      buff[i]=dat;
      if(i>=2)
      {i=0;flag=0;flag_REC=1 ;}  // 停止接收
     }
	 }
}
/*********************************************************************/		 
	void main(void)
{
	TMOD=0x11;  
    TH1=(65536-100)/256;	  //100US定时
	TL1=(65536-100)%256;
	TH0=0;
	TL0=0; 
    T2CON=0x34;
	T2MOD=0x00;
	RCAP2H=0xFF;
	RCAP2L=0xDC;
    SCON=0x50;  
    PCON=0x00; 
    PS=1;
    TR1=1;
	ET1=1;
	ES=1; 
    EA=1;  
	
	while(1)							/*无限循环*/
	{ 
			 while(flag_bz)		       /*无限循环*/
	   { 
	
	       if(timer>=1000)	  //100MS检测启动检测一次
	     {
	       timer=0;
		   StartModule(); //启动检测
           Conut();		  //计算距离
           if(S<20)		  //距离小于20CM
		   {
		   stoprun();	  //小车停止
		   COMM(); 		  //方向函数
		   }
		   else
		   if(S>30)		  //距离大于,30CM往前走
		   run();
	     }
		 	if(flag_REC==1)
			{
			  push_val_left=13;	  //舵机归中
			  stoprun();
			  break;
			}
	  }
		
	  if(flag_REC==1)				    //
	   {
		flag_REC=0;
		if(buff[0]=='O'&&buff[1]=='N')	//第一个字节为O,第二个字节为N,第三个字节为控制码
		switch(buff[2])
	     {
		      case up :						    // 前进
			  send_str( );
			  flag_bz=0;
			  run();
			  break;
		      case down:						// 后退
			  send_str1( );
			  flag_bz=0;
			  backrun();
			  break;
		      case left:						// 左转
			  send_str2( );
			  flag_bz=0;
			  leftrun();
			  break;
		      case right:						// 右转
			  send_str3( );
			  flag_bz=0;
			  rightrun();
			  break;
		      case stop:						// 停止
			  send_str4( );
			  flag_bz=0;
			  stoprun();
			  break;
			  case Car :						// 		
			  flag_bz=1;
			  break;
	     }
      
					 
	 }
	}
}