#include
sbit pwm = P2^0; //定义舵机p20
sbit ENA = P3^6; //定义驱动模块
sbit ENB = P3^7; //
sbit IN1 = P3^0;
sbit IN2 = P3^1;
sbit IN3 = P3^2;
sbit IN4 = P3^3; //定义驱动模
/*定义光电管,光电管检测到黑线输出高电平,否则输出低电平*/
sbit zuoz = P2^7; //定义最左边 光电
sbit zuo = P2^6; //定义中左边 光电
sbit you = P2^5; //定义中右边 光电
sbit youy = P2^4; //定义最右边光电模块
unsigned int sum1 = 0; //定义几个光电管的和1
unsigned int sum2= 0; //定义几个光电管的和2
unsigned int i ;
void zhengzhuan(); //前进
void tingzhi(); //停止
void youzhuan();
void zuozhuan();
void quansu();
void InitTimer();
typedef unsigned int uint;
typedef unsigned char uchar;
void delay_ms(uint x)
{
uint i;
while(x--)
for(i=0;i<125;i++);
}
void delay(int z)//延时函数,调节电机转速
{
int i,j;
for(i=2;i>0;i--)
for(j=z;j>0;j--);
}
void InitTimer(void)
{
TMOD=0x11;//开定时器0,1
TH0=-18432/256;//定时20MS,20MS为一个周期
TL0=-18432%256;
TH1=-1382/256;//定时1.5MS,这时舵机处于0度
TL1=-1382%256;
EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
TR1=1;//开定时器1
ET1=1;
}
//输出PWM信号
uint pwm_value=1382; //初值为1.5ms
uint value[]={1150,1290,1382,1474,1580,};//定义1.2ms,1.4ms,1.5ms,1.6ms,1.75ms;
void main()
{
while(1)
{
uint j;
InitTimer();
pwm_value=1382;
sum1=zuoz&zuo&you&youy;
sum2=zuoz|zuo|you|youy;
if(zuoz==1&&zuo==0)
j=0;
else if(zuo==1&&you==0&&zuoz==0)
j=1;
else if(you==1&&zuo==0&&youy==0)
j=2;
else if(youy==1&&you==0)
j=3 ;
else if(sum1==1) //所有光电管输出高电平,停止
j=4;
else if(sum2==0) //所有光电管输出低电平,前进
j=5;
else j= 6 ;
switch(j)
{
case 0: pwm_value=value[4]; delay_ms(100);break; //舵机输出小偏转角度 。高电平1.3ms
case 1: pwm_value=value[3]; delay_ms(50);break;
case 2: pwm_value=value[1]; delay_ms(50);break;
case 3: pwm_value=value[0]; delay_ms(100);break;
case 4: pwm_value=value[2]; delay_ms(50);break;
case 5: pwm_value=value[2]; delay_ms(50);break;
default : break;
}
while((zuoz==1)&&(zuo==0))//判断当左边光电管遇到黑线,
{ //右边和前边的光电管遇到白线时左转
zuozhuan();//调用左转函数
}
while((zuoz==0)&&(zuo==1)&&(you==0))//判断当右边光电管遇到黑线,
{ //左边和前边的光电管遇到白线时右转
zhengzhuan();//
}
while((zuo==0)&&(you==1)&&(youy==0))//判断当左边光电管遇到黑线,右边光电管也遇到黑线
{ //前边的光电管遇到白线时停止
zhengzhuan();//调用停止函数
}
while((you==0)&&(youy==1))
{
youzhuan();
}
while((zuo==0)&&(zuoz==0)&&(you==0)&&(youy==0))
{
zhengzhuan();
}
while((zuo==1)&&(zuoz=1)&&(you==1)&&(youy==1))
{
tingzhi();
}
}
}
/*以下调用函数*/
void timer0(void) interrupt 1//定时器0中断函数
{
pwm=1;
TH0=-18432/256;
TL0=-18432%256;
TR1=1;
}
void timer1(void) interrupt 3//定时器1中断函数
{
pwm=0;
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
}
void tingzhi()
{
ENA=1;
ENB=1;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
void zhengzhuan()//左右轮协同前进子函数
{ ENA=1;
ENB=1;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
delay(10-1);//pwm调速
IN1=0;
IN2=0;
IN3=0;
IN4=0;
delay(1);
}
void zuozhuan()//左右轮协同左转子函数
{ ENA=1;
ENB=1;
IN1=0;
IN2=0;
IN3=1;
IN4=0;
delay(10-1);//pwm调速
IN1=0;
IN2=0;
IN3=0;
IN4=0;
delay(1);
}
void youzhuan()//左右轮协同右转子函数
{ ENA=1;
ENB=1;
IN1=1;
IN2=0;
IN3=0;
IN4=0;
delay(10-1);//pwm调速
IN1=0;
IN2=0;
IN3=0;
IN4=0;
delay(1);
}
void quansu()
{
ENA=1;
ENB=1;
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}