打印

智能车,想循迹时遇到障碍后跳出循迹程序之后绕开障碍物,再回到轨迹。可是中断无效

[复制链接]
4287|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
包子lxy|  楼主 | 2013-3-20 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了智能小车,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;
}

相关帖子

沙发
包子lxy|  楼主 | 2013-3-20 21:40 | 只看该作者
求助啊

使用特权

评论回复
板凳
包子lxy|  楼主 | 2013-3-21 13:24 | 只看该作者
求助啊

使用特权

评论回复
地板
zaffwong| | 2013-3-22 14:22 | 只看该作者
中断使能了么?

使用特权

评论回复
5
包子lxy|  楼主 | 2013-3-22 16:32 | 只看该作者
zaffwong 发表于 2013-3-22 14:22
中断使能了么?

什么是中断使能啊。。。EA=1?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

95

帖子

0

粉丝