打印

求助!51智能车,循迹过程的蔽障程序,中断有问题!

[复制链接]
2725|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
包子lxy|  楼主 | 2013-4-29 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了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;

         }
}

相关帖子

沙发
LZB| | 2013-4-29 15:50 | 只看该作者
你在中断中不该加延时,这样做是在浪费资源,程序中碰到硬件接口请求等待,那就让它等下一个主程序周期来执行,别用延时来浪费资源

使用特权

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

本版积分规则

28

主题

95

帖子

0

粉丝