#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0 ; //**左邊電機的占空比**//
unsigned char zkb2=0 ; //**右邊電機的占空比**//
unsigned char t=0; //**定時器中斷計數器**//
sbit LSEN1=P1^0; // 右光對管1
sbit LSEN2=P1^1; //右光對管2
sbit RSEN1=P1^2; //左光對管1
sbit RSEN2=P1^3; //左光對管2
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit ENA=P0^4;
sbit ENB=P0^5;
//****************延時函數****************//
void delay(int z)
{ while (z--); }
//**********初始化定時器,中斷***********//
void init()
{ TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
}
//***********中斷函數+脈寬調制***********//
void timer0() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(t<zkb1)
ENA=1;
else
ENA=0;
if(t<zkb2)
ENB=1;
else
ENB=0;
t++;
if(t>=100)
{t=0;}
}
//******************直行******************//
void qianjin()
{ IN1=1; //******給電機加電啟動******//
IN2=0;
IN3=1;
IN4=0;
zkb1=30;
zkb2=30;
}
//***************左轉函數1***************//
void turn_left1()
{
IN1=1; //******給電機加電啟動******//
IN2=0;
IN3=1;
IN4=0;
zkb1=0;
zkb2=50;
}
//***************左轉函數2***************//
void turn_left2()
{
IN1=1; //******給電機加電啟動******//
IN2=0;
IN3=1;
IN4=0;
zkb1=0;
zkb2=60;
}
//***************右轉函數1***************//
void turn_right1()
{
IN1=1; //******給電機加電啟動******//
IN2=0;
IN3=1;
IN4=0;
zkb1=50;
zkb2=0;
}
//***************右轉函數2***************//
void turn_right2()
{
IN1=1; //******給電機加電啟動******//
IN2=0;
IN3=1;
IN4=0;
zkb1=60;
zkb2=0;
}
//***************stop***************//
void goback()
{
IN1=0; //******給電機加電啟動******//
IN2=1;
IN3=0;
IN4=1;
zkb1=50;
zkb2=50;
}
//***************循跡函數*****************//
void xunji()
{ uchar flag;
if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
{ flag=0; }//*******直行*******//
else if((RSEN1==1)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
{ flag=1;} //***左偏1,右轉1***//
else if(((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))||((RSEN1==0)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)))
{ flag=2;} //***左偏2,右轉2***//
else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==1))
{ flag=3; }//***右偏1,左轉1***//
else if(((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))||((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==0)))
{ flag=4; }//***右偏2,左轉2***//
else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
{ flag=5; }//***stop***//
switch (flag)
{ case 0:qianjin();
break;
case 1:turn_right1();
break;
case 2:turn_right2();
break;
case 3:turn_left1();
break;
case 4:turn_left2();
break;
case 5:goback();
break;
default: break;
}
}
//****************主程序****************//
void main()
{ init();
zkb1=30;
zkb2=30;
while(1)
{ IN1=1; //******給電機加電啟動******//
IN2=0;
IN3=1;
IN4=0;
ENA=1;
ENB=1;
while(1)
{ xunji(); //*********尋跡**********//
}
}
}
|