做了51的智能小车
要求是能够循迹,沿黑线行驶,这一点目前完成的没有问题
还有一点就是要能够在循迹过程中避开黑线上的障碍物。问题就在这里
本意是遇到黑线跳出主函数,进入中断函数,中断函数完成避障,之后遇到黑线再跳出中断,继续执行循迹程序。
以下是中断部分的一部分程序:
void int0 () interrupt 0
{
if( Left_1_led ==0&&Right_2_led==1) //左侧障碍
{
while( Left_1_led ==0&&Right_2_led==1)
{
rightrun();
delay(30);
if( Left_1_led ==1&&Right_2_led==1)
{
run();
delay(25);
if(Left_1_led ==0)
{
rightrun();
delay(20);
}
if(Right_2_led==0)
{
leftrun();
delay(20);
}
leftrun();
delay(35);
}
}
while(Left_2_led==0||Right_1_led==0)
{
break;
}
EX0=0;
}
相对应的还有右侧以及正面避障
但是实际过程中,遇到障碍物的确能够避开,但之后就一直直行,无法按照程序找回黑线。
其次,如果认为调整回黑线,再次遇到障碍的时候就无法臂章了。。就好像中断只能执行一次的感觉。。。
求解啊!!!!
以下附上全部程序:
#include<AT89x52.H>
#define Left_1_led P3_4 //P3_4接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
#define Left_2_led P3_5 //P3_5接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2
#define Right_1_led P3_6 //P3_6接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
#define Right_2_led P3_7 //P3_7接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
#define waibu P2_0
#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左边两个电机向前走
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左边两个电机向后转
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左边两个电机停转
#define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右边两个电机向前走
#define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右边两个电机向前走
#define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右边两个电机停转
unsigned char pwm_val_left =0;
unsigned char push_val_left =1;// 左电机占空比10/40
unsigned char pwm_val_right =0;
unsigned char push_val_right=1;// 右电机占空比10/40
bit Right_moto_stop=1;
bit Left_moto_stop =1;
/************************************************************************/
//延时函数
void delay(unsigned int k)
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
//前速前进
void run(void)
{
Left_moto_go ;
Right_moto_go ;
}
/************************************************************************/
//后退
void backrun(void)
{
Left_moto_back ; //左电机往前走
Right_moto_back ; //右电机往前走
}
/************************************************************************/
//停止
void stoprun(void)
{
Left_moto_Stop ; //左电机往前走
Right_moto_Stop ; //右电机往前走
}
/************************************************************************/
//左转
void leftrun(void)
{
Left_moto_back ; //左电机往前走
Right_moto_go ; //右电机往前走
}
/************************************************************************/
//右转
void rightrun(void)
{
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往前走
}
/*********************************************************************/
/*--主函数--*/
//有信号为0 没有信号为1
void main()
{
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=0;//设置外部中断触发方式(0:低电平触发 1:下降沿触发)
delay(100);//打开电源--放下小车的时间
run();
while(1)
{
if(Left_2_led==0&&Right_1_led==0)
run();
else
{
if(Right_1_led==1&&Left_2_led==0) //右边检测到黑线
{
Left_moto_go; //左边两个电机正转
Right_moto_back; //右边两个电机反转
}
else if(Left_2_led==1&&Right_1_led==0) //左边检测到黑线
{
Right_moto_go; //右边两个电机正转
Left_moto_back; //左边两个电机反式开始转
}
else if(Left_1_led==0&&Right_2_led==0)//正前方有障碍物
{
waibu=0;
}
else if(Left_1_led==1&&Right_2_led==0)//右前方有障碍物
{
waibu=0;
}
else if(Left_1_led==0&&Right_2_led==1)//左前方有障碍物
{
waibu=0;
}
}
}
}
/*********************************************************************/
//外部中断服务程序
void int0 () interrupt 0
{
if( Left_1_led ==0&&Right_2_led==1) //左侧障碍
{
while( Left_1_led ==0&&Right_2_led==1)
{
rightrun();
delay(30);
if( Left_1_led ==1&&Right_2_led==1)
{
run();
delay(25);
if(Left_1_led ==0)
{
rightrun();
delay(20);
}
if(Right_2_led==0)
{
leftrun();
delay(20);
}
leftrun();
delay(35);
/*if(Left_1_led ==1&&Right_2_led==1)
{
run();
delay(25);
leftrun();
delay(35);
}*/
}
}
while(Left_2_led==0||Right_1_led==0)
{
break;
}
EX0=0;
}
if( Right_2_led==0&&Left_1_led ==1) //右侧障碍
{
while( Left_1_led ==1&&Right_2_led==0)
{
leftrun();
if( Left_1_led ==1&&Right_2_led==1)
{
run();
delay(25);
if(Left_1_led ==0)
{
rightrun();
}
if(Right_2_led==0)
{
leftrun();
}
if(Left_1_led ==1&&Right_2_led==1)
{
run();
delay(25);
leftrun();
delay(25);
}
}
}
while(Left_2_led==0||Right_1_led==0)
{
break;
}
EX0=0;
}
if( Left_1_led ==0&&Right_2_led==0) //都有障碍
{
while( Left_1_led ==0&&Right_2_led==1)
{
rightrun();
if( Left_1_led ==1&&Right_2_led==1)
{
run();
delay(25);
if(Left_1_led ==0)
{
rightrun();
}
if(Right_2_led==0)
{
leftrun();
}
if(Left_1_led ==1&&Right_2_led==1)
{
run();
delay(25);
leftrun();
delay(25);
}
}
}
while(Left_2_led==0||Right_1_led==0)
{
break;
}
EX0=0;
}
} |