做了智能小车,51的~
本来是想沿着黑线开的。。如果黑线或者前方有障碍物,被红外传感器识别到,程序通过外部中断,跳出循迹程序,开始避障程序
当绕过障碍物再次遇到黑线的时候再开始循迹程序
以上是设想--
实际中,循迹的程序运行没有问题
可以就算前面有障碍物,传感器也识别到了(有LED与传感器串联,有信号就亮了)
可是还是在执行循迹程序,没有执行中断啊。。
求助·!!!!
下面是程序,新人不是很懂。。
#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 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,(遇到黑线为1,无障碍 无信号)
void main()
{
P3_2=1;
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=0;//设置外部中断触发方式(0:低电平触发 1:下降沿触发)
delay(100);//打开电源--放下小车的时间
run();
while(1)
{
P3_2=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; //右边两个电机反转
}
if(Left_2_led==1&&Right_1_led==0) //左边检测到黑线,左转
{
Right_moto_go; //右边两个电机正转
Left_moto_back; //左边两个电机反式开始转
}
if (Left_1_led==0&&Right_2_led==0)//正前方有障碍物
{
P3_2=0;
}
if (Left_1_led==1&&Right_2_led==0)//右前方有障碍物
{
P3_2=0;
}
if (Left_1_led==0&&Right_2_led==1)//左前方有障碍物
{
P3_2=0;
}
}
}
}
/*********************************************************************/
//外部中断服务程序
void int0 () interrupt 0
{
EX0=0;
if( Left_1_led ==0&&Right_2_led==1)//左侧有障碍物,右转
rightrun();
else if( Right_2_led==1&&Left_1_led ==1)//左右都无障碍物,左转(直到左侧传感器识别到障碍)
leftrun();
else if(Right_1_led==1&&Left_2_led==0)
P3_2=1;
else if(Left_2_led==1&&Right_1_led==0)
P3_2=1;
else if(Left_2_led==0&&Right_1_led==0)
delay(5);
P3_2=1;
EX0=1;
} |