打印

我调试了半天的程序也没有整明白,今晚熬夜调试了!

[复制链接]
2202|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leaoking|  楼主 | 2009-8-31 21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
sbit ena=P2^1;       // 前轮使能端
sbit  enb=P2^4;  // 后轮使能端
sbit  zuozhuan=P2^0; //电机左转使能
sbit  youzhuan=P2^2; //电机右转使能
sbit  azheng=P2^3; //后轮正转使能
sbit  afan=P2^5;  //后轮反转使能
sbit zuo=P1^0;  //左里侧对管
sbit you=P1^1;  //右里侧对管
sbit    zuo1=P1^2;  //左外侧对管
sbit you1=P1^3;  //右外侧对管
sbit zhang=P1^4;   //光电管检测前方是否有障碍
void delay2()       //延时子函数
{
uchar b;
for(b=10;b>0;b--);
}
void main()
{  
while(1)
{
  if(zhang==1)//前方没有障碍  
  {
   while(zhang)
   {
//以下循迹程序,4个红外对管分别检测下方是否是黑线,如果是,传送低电平,相应的左转或者右转
    ena=1;
    enb=1;
    azheng=1;
    afan=0;
    zuozhuan=0;
    youzhuan=0;
    while(!zuo)
    {
     youzhuan=1;
     delay2();
    }
     youzhuan=0;
    while(!you)
    {
     zuozhuan=1;
     delay2();
    }
     zuozhuan=0;
    while(!zuo1)
    {
     youzhuan=1;
     delay2();
    while(zuo);
    }
    youzhuan=0;
    while(!you1)
    {
     zuozhuan=1;
     delay2();
     while(you);
    }
     zuozhuan=0;
   }
  }
  if(zhang==0)
  {
   while(!zhang)
   {
    ena=1;
    enb=1;
    azheng=0;
    afan=0;
    zuozhuan=0;
    youzhuan=0;
   }
  }
}
}

至于电路图的连接,太麻烦了,但是原理很简单,我想这不会影响到朋友们对这个程序的理解。
目的就是循迹,如果遇到障碍就停止。
但是目前,循迹功能正常,但是,当上电开始的时候光电管前方没有障碍物的时候,小车正常行走并正常循迹,但是当有障碍物的时候,小车没有任何停止的反应;如果刚上电的时候就在光电管前方设置障碍物,小车不会启动,当把障碍物移走,小车正常启动,正常循迹,再加障碍,小车没有动静。。。

求正解!

相关帖子

沙发
leaoking|  楼主 | 2009-8-31 21:22 | 只看该作者
看了一天电脑,眼睛快酸了,不改字体真是看不清了,热心的网友帮忙啊!
我真想早点儿睡········

使用特权

评论回复
板凳
jerkoh| | 2009-8-31 21:38 | 只看该作者
if(zhang==0)
  {  //有障碍物
   while(!zhang)     //(非0    一直循环)
   {
    ena=1;              //直到zhang 不是0 也就是没有障碍物才退出者各while  所以一直等在这里
    enb=1;
    azheng=0;
    afan=0;
    zuozhuan=0;
    youzhuan=0;   
   }
  }

使用特权

评论回复
地板
leaoking|  楼主 | 2009-8-31 21:40 | 只看该作者
3楼谢谢你的顶贴!但是我觉得逻辑上没有问题啊····
如果有障碍的话就是停在那里,知道障碍撤销·····

使用特权

评论回复
5
jerkoh| | 2009-8-31 21:41 | 只看该作者
不好意思 我可能没看清你的问题

使用特权

评论回复
6
jerkoh| | 2009-8-31 21:44 | 只看该作者
while(1)
前面 先初始化IO口 然后过个几百毫秒 检测zhang 呢?

使用特权

评论回复
7
leaoking|  楼主 | 2009-8-31 21:55 | 只看该作者
什么意思,我怎么没看明白呢?

使用特权

评论回复
8
NE5532| | 2009-8-31 22:03 | 只看该作者
程序这东西,你越是晕的时候就越不要去弄,还不如去睡觉。用你最自然的语言描述清楚了,想好了要做什么,怎么做,然后再开工,否则就不是调程序了,是练打字。

使用特权

评论回复
9
leaoking|  楼主 | 2009-8-31 22:33 | 只看该作者
哥,那你帮我看看是哪儿出错了呗,我也早点儿睡,我作息习惯很好的唉····说实话真是不想熬夜···

使用特权

评论回复
10
cxbcxb2000| | 2009-8-31 23:15 | 只看该作者
你的程序只处理了没有前方没有障碍物的情况,而没有处理前方有障碍物的情况,所以调试时会出现如你所说的问题.
if(zhang==1)//前方没有障碍  
  {
     //这部分你已经做了。
   }
else
{
    //这部分你还没有做.
}

请你仔细的看看,想一下吧,如需要的请与我联系,QQ:159013559

使用特权

评论回复
11
FDLock| | 2009-8-31 23:25 | 只看该作者
可能是以下几个while的问题, 因为只要有一个while成立, 就要去调整, 那么就不能及时去判断zhang了.  建议,每个while里都要判断zhang,如果发现zhang==0, 则立即停机处理.
   
        ......

                while(!zuo) // 左里侧对管
                {
                    youzhuan=1;
                    delay2();
                }               
                youzhuan=0;
               
                while(!you)
                {
                    zuozhuan=1;
                    delay2();
                }               
                zuozhuan=0;
               
                while(!zuo1)
                {
                    youzhuan=1;
                    delay2();
                    while(zuo);
                }               
                youzhuan=0;
               
               
                while(!you1)
                {
                    zuozhuan=1;
                    delay2();
                    while(you);
                }
                zuozhuan=0;
        ......

使用特权

评论回复
12
leaoking|  楼主 | 2009-9-1 09:02 | 只看该作者
11楼的,我在每一次的对管检测循迹的程序中又加了一个障碍的探测,结果发现,这次可以探测到障碍,但是一旦停下来,即使障碍拿走,小车也不行进。
这又是为什么呢?
现在的程序如下
#include<reg52.h>
#define uchar unsigned char
sbit        ena=P2^1;       // 前轮使能端
sbit         enb=P2^4;                // 后轮使能端
sbit         zuozhuan=P2^0;        //电机左转使能
sbit         youzhuan=P2^2;        //电机右转使能
sbit         azheng=P2^3;        //后轮正转使能
sbit         afan=P2^5;                //后轮反转使能
sbit        zuo=P1^0;                //左里侧对管
sbit        you=P1^1;                //右里侧对管
sbit    zuo1=P1^2;                //左外侧对管
sbit        you1=P1^3;                //右外侧对管
sbit        zhang=P1^4;                 //光电管检测前方是否有障碍
void delay2()       //延时子函数
{
        uchar b;
        for(b=10;b>0;b--);
}
void main()
{  
        while(1)
        {
                if(zhang==1)//前方没有障碍        
                {
                        while(zhang)
                        {
//以下循迹程序,4个红外对管分别检测下方是否是黑线,如果是,传送低电平,相应的左转或者右转
                                ena=1;
                                enb=1;
                                azheng=1;
                                afan=0;
                                zuozhuan=0;
                                youzhuan=0;       
                                while(!zuo)
                                {       
                                        if(zhang==0)
                                        {
                                                while(!zhang)
                                                {
                                                        ena=0;
                                                        enb=0;
                                                        azheng=0;
                                                        afan=0;
                                                        zuozhuan=0;
                                                        youzhuan=0;       
                                                }
                                        }
                                        youzhuan=1;
                                        delay2();
                                }
                                        youzhuan=0;
                                while(!you)
                                {
                                        if(zhang==0)
                                        {
                                                while(!zhang)
                                                {
                                                        ena=0;
                                                        enb=0;
                                                        azheng=0;
                                                        afan=0;
                                                        zuozhuan=0;
                                                        youzhuan=0;       
                                                }
                                        }
                                        zuozhuan=1;
                                        delay2();
                                }
                                        zuozhuan=0;       
                                while(!zuo1)
                                {
                                        if(zhang==0)
                                        {
                                                while(!zhang)
                                                {
                                                        ena=0;
                                                        enb=0;
                                                        azheng=0;
                                                        afan=0;
                                                        zuozhuan=0;
                                                        youzhuan=0;       
                                                }
                                        }
                                        youzhuan=1;
                                        delay2();
                                while(zuo);
                                }
                                youzhuan=0;
                                while(!you1)
                                {
                                        if(zhang==0)
                                        {
                                                while(!zhang)
                                                {
                                                        ena=0;
                                                        enb=0;
                                                        azheng=0;
                                                        afan=0;
                                                        zuozhuan=0;
                                                        youzhuan=0;       
                                                }
                                        }
                                        zuozhuan=1;
                                        delay2();
                                        while(you);
                                }
                                        zuozhuan=0;
                        }
                }
                else
                {
                        while(!zhang)
                        {
                                ena=0;
                                enb=0;
                                azheng=0;
                                afan=0;
                                zuozhuan=0;
                                youzhuan=0;
                        }       
                }
        }
}

使用特权

评论回复
13
hightech929| | 2009-9-1 10:50 | 只看该作者
12# leaoking

改成这样试试:
else
{
       while(!zhang)
        {
             ena=0;
              enb=0;
              azheng=0;
              afan=0;
              zuozhuan=0;
              youzhuan=0;
         }
         ena = 1;
         enb = 1;        
}

使用特权

评论回复
14
hightech929| | 2009-9-1 10:52 | 只看该作者
13# hightech929
更合理的逻辑应该是:
else
{
      ena=0;
      enb=0;
      while(!zhang);
      ena = 1;
      enb = 1;        
}

使用特权

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

本版积分规则

个人签名:我既然学的是电子就一定要成为电子工程师!

7

主题

56

帖子

0

粉丝