|
#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; //声控开关引脚,声音超过阈值时低电平输出
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是左边的控制标志位
{
ENZ=1;
IN1 = 1; //控制轮子正转
IN2 = 0;
}
else
stop();
if(flag2==1) //flag2是右边的控制标志位
{
ENY=1;
IN3 = 1;
IN4 = 0;
}
else
stop();
}
void LEFT() //2,3同时检测到,左转
{
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,慢左转
LEFT();
if((OUT1==0)&&(OUT2=1)&&(OUT3==1)&&(OUT4==0)||(OUT1==0)&&(OUT2=1)&&(OUT3==0)&&(OUT4==0)) //2,3或2,慢右转
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检测到,快右转
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) //调左轮速改变此速度,越小速度越慢
flag1=0;
else
flag1=1;
if(num>=22) //调右轮速改变此速度,越小速度越慢
flag2=0;
else
flag2=1;
if(num==150)
num=0;
}
|
|