打印

中断函数无法触发,求助!智能车

[复制链接]
2190|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
包子lxy|  楼主 | 2013-3-26 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做了智能小车,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
{
        if( Left_1_led ==0&&Right_2_led==1)//左侧有障碍物,右转
        {
                rightrun();
                while( Right_2_led==1&&Left_1_led ==1)//左右都无障碍物,左转(直到左侧传感器识别到障碍)
                 {
                         leftrun();
                }
        }
    else if( Left_1_led ==1&&Right_2_led==0)//右侧有障碍物,左转
        {
                leftrun();
                while( Right_2_led==1&&Left_1_led ==1)
                {
                         rightrun();
                }
        }
        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)
        {
                P3_2=1;
        }
        else
        {
                P3_2=1;
        }
}




为什么我的中断无法触发?每次有障碍物在黑线的时候就直接装上去了。。
程序有点长,想了很久了。。希望高手能帮帮忙

相关帖子

沙发
nino_1| | 2013-3-27 09:27 | 只看该作者
本帖最后由 nino_1 于 2013-3-27 09:33 编辑

中断口用的哪个?P3_2的话就错了

使用特权

评论回复
板凳
包子lxy|  楼主 | 2013-3-27 12:16 | 只看该作者
nino_1 发表于 2013-3-27 09:27
中断口用的哪个?P3_2的话就错了

外部中断0 不就是P3^2吗。。。

使用特权

评论回复
地板
nino_1| | 2013-3-27 12:45 | 只看该作者
既然P3_2是中断口,那就是输入口,你怎么可以在程序中置1或置0

使用特权

评论回复
5
包子lxy|  楼主 | 2013-3-27 17:41 | 只看该作者
nino_1 发表于 2013-3-27 12:45
既然P3_2是中断口,那就是输入口,你怎么可以在程序中置1或置0

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;
                         }


我是把外部情况和P3^2口的逻辑关系练到一起了。。就是如果有障碍物,p32给低电平(我设定的是低电平触发),触发中断,如果不是,就给高电平,不触发中断函数

这样不行吗?我觉得这样也可以用P32的高低电平来反映我外部是否有障碍的实际情况啊。。

使用特权

评论回复
6
flttxlj| | 2013-3-27 18:59 | 只看该作者
中断是外部触发的  不能自己指定   另外把动作函数放在中断函数里  别放在主函数里

使用特权

评论回复
7
包子lxy|  楼主 | 2013-3-27 19:34 | 只看该作者
flttxlj 发表于 2013-3-27 18:59
中断是外部触发的  不能自己指定   另外把动作函数放在中断函数里  别放在主函数里 ...

恩~原来是这样啊。。一直以为只要是低电平就可以触发中断了呢。。。
我的中断动作函数是在中断程序的,主函数里面的都是不触发中断的函数,这样没关系吧?

使用特权

评论回复
8
包子lxy|  楼主 | 2013-3-27 19:41 | 只看该作者
flttxlj 发表于 2013-3-27 18:59
中断是外部触发的  不能自己指定   另外把动作函数放在中断函数里  别放在主函数里 ...

还有啊。。如果我把我程序的P32口给成其他空闲端口,然后根据实际情况给予这个端口低电平,再把这个端口用杜邦线和P32口连在一起可以吗?

使用特权

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

本版积分规则

28

主题

95

帖子

0

粉丝