|
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag1=0;
uchar flag2=0;
sbit led1=P1^6;
//光電管的引腳定義
sbit OUT4 = P1^1; //最左邊
sbit OUT3 = P1^2; //中間
sbit OUT2 = P1^3; //右邊
sbit OUT1 = P1^4; //最右前
//電機引腳定義
sbit ENZ = P0^5; //左邊輪子使能控制
sbit ENY = P0^6; //右邊輪子使能控制
sbit IN1 = P0^1; //電機控制輸入端
sbit IN2 = P0^2;
sbit IN3 = P0^3;
sbit IN4 = P0^4;
sbit SKey = P2^0; //聲控開關(guān)引腳,聲音超過閾值時低電平輸出
uchar flag=0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
ENZ=1;
ENY=1;
// SKey=0;
}
void stop() //只有3檢測到,直走
{
ENZ=0;
ENY=0;
}
void GO() //只有3檢測到,直走
{
if(flag1==1) //flag1是左邊的控制標(biāo)志位
{
ENZ=1;
IN1 = 1; //控制輪子正轉(zhuǎn)
IN2 = 0;
}
else
stop();
if(flag2==1) //flag2是右邊的控制標(biāo)志位
{
ENY=1;
IN3 = 1;
IN4 = 0;
}
else
stop();
}
void LEFT() //2,3同時檢測到,左轉(zhuǎn)
{
ENZ=0;
if(flag2==1)
{
ENY=1;
IN3=1;
IN4=0;
}
else
stop();
}
void RIGHT()
{
if(flag1==1)
{
ENZ=1;
IN1=1;
IN2=0;
}
else
stop();
if(flag2==1)
ENY=0;
else
stop();
}
void xunji() //檢測到黑線是1
{
if((OUT1==0)&&(OUT2=0)&&(OUT3==0)&&(OUT4==0)||(OUT1==0)&&(OUT2=0)&&(OUT3==1)&&(OUT4==0)) //都沒檢測到黑線,2檢測到,直走
GO();
if((OUT1==0)&&(OUT2=0)&&(OUT3==1)&&(OUT4==1)||(OUT1==0)&&(OUT2=0)&&(OUT3==0)&&(OUT4==1)) //3,4或4,慢左轉(zhuǎn)
LEFT();
if((OUT1==0)&&(OUT2=1)&&(OUT3==1)&&(OUT4==0)||(OUT1==0)&&(OUT2=1)&&(OUT3==0)&&(OUT4==0)) //2,3或2,慢右轉(zhuǎn)
RIGHT();
if((OUT1==1)&&(OUT2=0)&&(OUT3==0)&&(OUT4==0)||(OUT1==1)&&(OUT2=1)&&(OUT3==0)&&(OUT4==0)||(OUT1==1)&&(OUT2=0)&&(OUT3==1)&&(OUT4==0)||(OUT1==1)&&(OUT2=0)&&(OUT3==0)&&(OUT4==1)||(OUT1==1)&&(OUT2=1)&&(OUT3==1)&&(OUT4==0)||(OUT1==1)&&(OUT2=0)&&(OUT3==1)&&(OUT4==1)||(OUT1==1)&&(OUT2=1)&&(OUT3==1)&&(OUT4==1)) //5檢測到,快右轉(zhuǎn)
RIGHT();
else
GO();
}
void main()
{
delay(2000);
while(SKey);
delay(5);
init();
while(1)
{
GO();
// xunji();
}
}
void Timer() interrupt 1
{
uchar num;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
num++;
if(num>=19) //調(diào)左輪速改變此速度,越小速度越慢
flag1=0;
else
flag1=1;
if(num>=22) //調(diào)右輪速改變此速度,越小速度越慢
flag2=0;
else
flag2=1;
if(num==150)
num=0;
}
|
|