每次都是执行这个函数时候出现问题

[复制链接]
 楼主| jiahy 发表于 2015-3-8 20:57 | 显示全部楼层 |阅读模式

void main()   
{
SP=0x60;
eight();
delay_nms(2000);
light();
delay_nms(2000);
bizhang();
…………
这个程序原意是先执行eight(),然后延时一段时间,再执行light()……
这些函数之间没有调用关系,但是他们都调用了一些其他函数,但在执行过程中,当执行到bizhang()这个函数的时候,bizhang()内部调用的一个子函数执行完之后(这个子函数是固定的,每次都是执行它的时候出现这个问题,但是它本身是没有毛病的),程序会跳出bizhang(),转而回到主函数的开始去执行eight(),
午夜粪车 发表于 2015-3-8 20:57 | 显示全部楼层
堆栈溢出的问题吧
 楼主| jiahy 发表于 2015-3-8 20:58 | 显示全部楼层
我用万用表测试9引脚,结果是有一个电压的跳动,然后就复位了,但是不明白会对那个引脚有影响,我把9引脚直接接到地了,但是还是会出现复位的问题
zhenykun 发表于 2015-3-8 21:00 | 显示全部楼层
程序逻辑有问题、。多检查几遍。、
 楼主| jiahy 发表于 2015-3-8 21:00 | 显示全部楼层
没发现问题 啊,好像不是这个问题吧
在bizhang()中是接受外部信号的,我要是不给它信号,不让它执行那个子函数,程序是可以执行正确的
jiajs 发表于 2015-3-8 21:02 | 显示全部楼层
(没写成死循环,肯定会循环执行的...)

另:一般是因为堆栈指针SP造成的,修改为:SP=0X60 就好了
zhanghqi 发表于 2015-3-8 21:02 | 显示全部楼层
首先不要去赋值SP,因为这是C
 楼主| jiahy 发表于 2015-3-8 21:02 | 显示全部楼层
sbit LeftIR=P1^5  ;//左边红外接收连接到P15
sbit RightIR=P3^6  ; //右边红外接收连接到P36
sbit LeftLaunch=P1^4 ;//左边红外发射连接到P14
sbit RightLaunch=P3^5 ;//右边红外发射连接到P35



void bizhang()
{
        unit j=500;
        unchar i,k;
        bit  irDetectLeft, irDetectRight;

      for(j=500;j>0;j--)
      {
           IRLaunch(1);
          irDetectRight = RightIR; //右边接收
           IRLaunch(0);
          irDetectLeft = LeftIR;      //左边接收
          if((irDetectLeft==1)&&(irDetectRight==1))        //停止
           {
                 stop();
           }
          if((irDetectLeft==1)&&(irDetectRight==0))            //左转
          {
                 for(i=0;i<2;i++)
                 {
                         for(k=0;k<50;k++)
                          {
                              p12=~p12;
                               delay_nus(1000);
                            }
                         left();
                 }
          }
         if((irDetectLeft==0)&&(irDetectRight==1))            //右转
         {
                 for(i=0;i<2;i++)
                  {
                        for(k=0;k<50;k++)
                        {
                             p12=~p12;
                             delay_nus(1000);
                         }
                       right();
                   }
         
            }
/* if((irDetectLeft==0)&&(irDetectRight==0))//就是每次执行到这的时候它就会
                                                                  //回到主函数的开始处
   {
    zhizou();      //向前走
   }*/


void IRLaunch(unsigned char IR)
{
unsigned int counter;
if(IR==0)
    for(counter=0;counter<1000;counter++)
     {
      LeftLaunch=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
      LeftLaunch=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
     }
   else
     for(counter=0;counter<1000;counter++)//右边发射
     {
       RightLaunch=0;
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
       RightLaunch=1;
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
     }
}

}

下面是zhizou()
void zhizou()//直走
{
unchar i;
for(i=0;i<5;i++)
{
        P11=1;
        delay_nus(1700);
        P11=0;
        delay_nms(20);
        P10=1;
        delay_nus(1300);
        P10=0;
        delay_nms(20);
}
}


程序我贴出来了,麻烦大家帮我看看,程序稍微有点长,没有全部贴出来,如果大家还需要看别的程序我再贴出来
}
zhaoxqi 发表于 2015-3-8 21:03 | 显示全部楼层

程序主循环好像没有,架构也不好。
 楼主| jiahy 发表于 2015-3-8 21:03 | 显示全部楼层
我前面设置堆栈指针了啊
wyjie 发表于 2015-3-8 21:05 | 显示全部楼层
堆栈指针由编译器设置
 楼主| jiahy 发表于 2015-3-8 21:05 | 显示全部楼层
除了这个问题,还有其他的问题吗?
lizye 发表于 2015-3-8 21:06 | 显示全部楼层
基本程序架构
void main(void)
{
     init();
     
    while(1)
     {
         f1();
         f2();
          .....
     }
}

void isr_uart(void) interrupt 4
{

}
 楼主| jiahy 发表于 2015-3-8 21:06 | 显示全部楼层
我后面最后的一个程序是要一直执行的,所以前面没有加while(1),不知道这样是不是会出问题
zhanghqi 发表于 2015-3-8 21:07 | 显示全部楼层
这样没有问题
写程序要注意空行,程序关系密切的可以不空行,不密切的空行,这样方便程序分析
lizye 发表于 2015-3-8 21:07 | 显示全部楼层
从头到尾看不到一个死循环,不知楼主所谓“要是不给它信号,不让它执行那个子函数,程序是可以执行正确的”是怎么实现正确执行的。
 楼主| jiahy 发表于 2015-3-8 21:08 | 显示全部楼层
就是程序是可以按顺序执行到最后,不会在中途返回到主函数的开始处
shimx 发表于 2015-3-8 21:09 | 显示全部楼层
要知道程序的流程,可以仿真啊,没有硬件仿真也可以软件仿真嘛,大不了设置断点,然后单步执行,不就知道什么原因了?
yszong 发表于 2015-3-8 21:09 | 显示全部楼层

你在主函数里加个循环不就可以了。
主函数执行到最后跟其它函数一样会返回的,你没加循环那么返回到哪里呢?
yszong 发表于 2015-3-8 21:09 | 显示全部楼层
这个跟主函数调用其它函数一样,再调用结束后将会返回到调用前的下一条语句执行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

862

主题

9861

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

862

主题

9861

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部