#include<reg52.h> //白0黑1
#define uint unsigned int
#define uchar unsigned char
sbit IN1=P1^3; //P10與電機驅動IN1相連
sbit IN2=P1^4; //P11與電機驅動IN2相連
sbit IN3=P1^5; //P12與電機驅動IN3相連
sbit IN4=P1^6; //P13與電機驅動IN4相連
sbit P10=P1^0;//左
sbit P11=P1^1;//
sbit P12=P1^2;
sbit Trig = P2^0;//輸出
sbit Echo = P3^2;//輸入
sbit IN11=P2^4;//傳送帶電機IN11
sbit IN12=P2^5;//傳送帶電機IN2
uint time = 0;
uint timeH,timeL,distance=0;
uchar succeed_flag;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_20us()
{
uchar a ;
for(a=0;a<100;a++);
}
void Turn_left() {IN1=1;IN2=1;IN3=1;IN4=0; }
void Turn_right() {IN1=1;IN2=0;IN3=1;IN4=1;}
void qian_jin() {IN1=1;IN2=0; IN3=1;IN4=0;}
void Tingzhi1() {IN1=1;IN2=1; IN3=1; IN4=1;}
//void Tingzhi2() {IN1=1; IN2=1; IN3=1; IN4=1;}
void xunji()
{
while(1)
{ if((P10==1&&P11==0&&P12==1)&&(P10==1&&P11==1&&P12==1))
{qian_jin(); }
if(P10==1&&P11==1&&P12==0)
{Turn_left(); }
if(P10==0&&P11==1&&P12==1)
{Turn_right();}
}
}
void ceju()
{
Trig=0; //首先拉低脈沖輸入引腳
EA=1;//打開總中斷0
TMOD=0x10;//定時器1,16位工作方式
while(1)
{
EA=0; //關總中斷
Trig=1; //超聲波輸入端
delay_20us(); //延時20us
Trig=0; //產生一個20us的脈沖
while(Echo==0); //等待Echo回波引腳變高電平
succeed_flag=0; //清測量成功標志
EA=1;
EX0=1; //打開外部中斷0
TH1=0; //定時器1清零
TL1=0;//定時器1清零
TF1=0; //計數溢出標志
TR1=1; //啟動定時器1
delay(20);//等待測量的結果
TR1=0;//關閉定時器1
EX0=0; //關閉外部中斷0
if(succeed_flag==1)
{
time=timeH * 256+timeL;
distance=time*0.0172; //厘米
}
if(succeed_flag==0)
{
distance=0; //沒有回波則清零
}
}
}
void main()
{
while(1)
{
xunji();
ceju();
if(P10==0&&P11==0&&P12==0) //30cm外
{ if(distance>30)
{Tingzhi1();
delay(300);}
}
else if(P10==0&&P11==0&&P12==0)//30cm內
{ if(distance<30)
{ uint i=400;
Tingzhi1();
while(i--)
{
IN11=1;IN12=0;
}
}
}
}
}
void exter() interrupt 0 // 外部中斷0是0號
{
timeH =TH1;//取出定時器的值
timeL =TL1;//取出定時器的值
succeed_flag=1;//至成功測量的標志
EX0=0; //關閉外部中斷
}
void timer1() interrupt 3
{
TH1=0;
TL1=0;
}