#include "IR.h"
#include <reg52.h>
/**********************************************************************************/
u8 PWML=0,PWMR=0,t=0; //定义PWM 占空比
u16 DE=0; //判断路线是否比较曲折
/**********************************************************************************/
void Delay(u8 i)
{
while(i--);
}
/**********************************************************************************/
void Timer0_Init() //设置定时器0
{ //通过设置定时器0来调制小车的转速
TMOD|=0x01; //选择16位的定时器
TH0=(65536-100)/256;
TL0=(65536-100)%256;
ET0=1; //开放定时器中断0
TR0=1;
EA=1;
}
void Timer0Init() interrupt 1 //中断 进入占空比的调节
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
t++;
if(t<PWML)
{
ENAL=1;
}
else
{ENAL=0;}
if(t<PWMR)
{
ENBR=1;
}
else
{ENBR=0;}
if(t>=100)
t=0;
}
/**********************************************************************************/
void Turn()
{
if(DE==0) //判断路线较为平缓
{
if(trct_R2==0&&trct_R1==0&&trct_L1==0&&trct_L2==0) //启动循迹前不要挡住小车的四个红外检测灯
{
PWML=20; //L298N同时控制两个电机时,电机转速不同
PWMR=19; //通过软件来调节,尽可能减小误差
Driv_Back();
}
///
if(trct_R1==0&&trct_L1==1) //小车左转
{
Delay(100);
if(trct_R1==0&&trct_L1==1)
{
PWML=7;
PWMR=25;
Driv_Go();
}
}
///
// if(trct_R2==0&&trct_R1==0&&trct_L1==0&&trct_L2==1) //小车左转(大幅度)
// {
// Delay(1000);
// if(trct_R1==0&&trct_L1==1)
// PWML=7;
// PWMR=25;
// Driv_Go();
// }
///
if(trct_R1==1&&trct_L1==0) //小车右转
{
Delay(100);
if(trct_R1==1&&trct_L1==0)
{
PWML=25;
PWMR=5;
Driv_Go();
}
}
///
// if(trct_R2==1&&trct_R1==0&&trct_L1==0&&trct_L2==0) //小车右转(大幅度)
// {
// Driv_Stop();
if(trct_R1==1&&trct_L1==0)
Delay(1000);
// PWML=25;
// PWMR=5;
// Driv_Go();
// }
///
if(trct_R1==1&&trct_L1==1) //小车直走 接收到信号就是0
{
Delay(100);
if(trct_R1==1&&trct_L1==1)
{
PWML=20;
PWMR=19;
Driv_Go();
}
}
}
else
{
if(trct_R2==0&&trct_R1==0&&trct_L1==0&&trct_L2==0)
{
PWML=20;
PWMR=19; //小车停止
Driv_Back();
Delay(10000); //延时一下
Driv_Stop();
DE=1;
}
///
if(trct_R1==0&&trct_L1==1) //小车左转(左轮后转 右轮正转 产生速差)
{
Delay(100);
if(trct_R1==0&&trct_L1==1)
Driv_Left_OPP();
}
///
if(trct_R1==1&&trct_L1==0) //小车右转(左轮正转 右轮后转)
{
Driv_Stop();
if(trct_R1==1&&trct_L1==0)
Driv_Right_OPP();
}
///
if(trct_R1==1&&trct_L1==1) //小车直走
{
Delay(100);
if(trct_R1==1&&trct_L1==1)
{
PWML=20;
PWMR=19;
Driv_Go();
}
}
DE=0;
}
}
void Driv_Go()
{RightMotoForward();LeftMotoForward();}
void Driv_Back()
{RightMotoBack();LeftMotoBack();}
void Driv_Right()
{RightMotoStop();LeftMotoForward();}
void Driv_Left_OPP()
{RightMotoForward();LeftMotoBack();}
void Driv_Right_OPP()
{RightMotoBack();LeftMotoForward();}
void Driv_Left()
{LeftMotoBack();RightMotoForward();}
void Driv_Stop()
{RightMotoStop();LeftMotoStop();}
void RightMotoForward()
{IN3=1; IN4=0;}
void RightMotoBack()
{IN3=0; IN4=1;}
void LeftMotoBack()
{IN1=1; IN2=0;}
void LeftMotoForward()
{IN1=0; IN2=1;}
void RightMotoStop()
{IN3=1; IN4=1;}
void LeftMotoStop()
{IN1=1; IN2=1;}
/**********************************************************************************/
/**********************************************************************************/
/**********************************************************************************/