打印

单片机莫名其妙复位

[复制链接]
24537|51
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
不戴帽子|  楼主 | 2010-5-20 18:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 不戴帽子 于 2010-5-21 22:21 编辑

void main()   
{
SP=0x60;
eight();
delay_nms(2000);
light();
delay_nms(2000);
bizhang();
…………
这个程序原意是先执行eight(),然后延时一段时间,再执行light()……
这些函数之间没有调用关系,但是他们都调用了一些其他函数,但在执行过程中,当执行到bizhang()这个函数的时候,bizhang()内部调用的一个子函数执行完之后(这个子函数是固定的,每次都是执行它的时候出现这个问题,但是它本身是没有毛病的),程序会跳出bizhang(),转而回到主函数的开始去执行eight(),不知道有没有高手也遇到过这个问题,请帮帮我,我表达的不是很清楚,请见谅。有人说是堆栈溢出的问题,我不知道是不是这个问题,请高手告诉我该怎么解决,谢谢。我用的是STC89c52

好像单片机莫名其妙的复位了,这是怎么回事啊?我用万用表测试9引脚,结果是有一个电压的跳动,然后就复位了,但是不明白会对那个引脚有影响,我把9引脚直接接到地了,但是还是会出现复位的问题,请高手帮帮我吧,小弟实在是不知道该怎么办了

相关帖子

沙发
wangjie5540| | 2010-5-20 18:52 | 只看该作者
你有调试的过程么?  多截几个图片上来看看

使用特权

评论回复
板凳
一棵小草| | 2010-5-20 20:47 | 只看该作者
唉----------仿真啊

使用特权

评论回复
地板
strang| | 2010-5-20 20:54 | 只看该作者
程序逻辑有问题、。多检查几遍。、

使用特权

评论回复
5
不戴帽子|  楼主 | 2010-5-20 21:20 | 只看该作者
3# 一棵小草
是什么意思?

使用特权

评论回复
6
不戴帽子|  楼主 | 2010-5-20 21:22 | 只看该作者
4# strang
没发现问题 啊,好像不是这个问题吧
在bizhang()中是接受外部信号的,我要是不给它信号,不让它执行那个子函数,程序是可以执行正确的

使用特权

评论回复
7
ningling_21| | 2010-5-20 22:51 | 只看该作者
(没写成死循环,肯定会循环执行的...)

另:一般是因为堆栈指针SP造成的,修改为:SP=0X60 就好了

使用特权

评论回复
8
ayb_ice| | 2010-5-21 08:49 | 只看该作者
首先不要去赋值SP,因为这是C

使用特权

评论回复
9
yuyetufu| | 2010-5-21 08:54 | 只看该作者
关键的程序不贴出来,瞎猜也没意思

使用特权

评论回复
10
不戴帽子|  楼主 | 2010-5-21 09:22 | 只看该作者
本帖最后由 不戴帽子 于 2010-5-21 09:33 编辑

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


程序我贴出来了,麻烦大家帮我看看,程序稍微有点长,没有全部贴出来,如果大家还需要看别的程序我再贴出来
}

使用特权

评论回复
11
whlz58| | 2010-5-21 09:27 | 只看该作者
程序主循环好像没有,架构也不好。

使用特权

评论回复
12
不戴帽子|  楼主 | 2010-5-21 09:35 | 只看该作者
11# whlz58
请问这到底是什么问题啊?还有您说的主循环没有事什么意思啊?我是新手,还望您指教

使用特权

评论回复
13
不戴帽子|  楼主 | 2010-5-21 09:36 | 只看该作者
7# ningling_21
我前面设置堆栈指针了啊

使用特权

评论回复
14
ayb_ice| | 2010-5-21 10:17 | 只看该作者
堆栈指针由编译器设置

使用特权

评论回复
15
不戴帽子|  楼主 | 2010-5-21 10:24 | 只看该作者
14# ayb_ice
除了这个问题,还有其他的问题吗?

使用特权

评论回复
16
ayb_ice| | 2010-5-21 10:48 | 只看该作者
基本程序架构
void main(void)
{
    init();
   
    while(1)
    {
        f1();
        f2();
         .....
    }
}

void isr_uart(void) interrupt 4
{

}

使用特权

评论回复
17
不戴帽子|  楼主 | 2010-5-21 10:53 | 只看该作者
16# ayb_ice
我后面最后的一个程序是要一直执行的,所以前面没有加while(1),不知道这样是不是会出问题

使用特权

评论回复
18
ayb_ice| | 2010-5-21 11:52 | 只看该作者
这样没有问题
写程序要注意空行,程序关系密切的可以不空行,不密切的空行,这样方便程序分析

使用特权

评论回复
19
hgjinwei| | 2010-5-21 12:27 | 只看该作者
从头到尾看不到一个死循环,不知楼主所谓“要是不给它信号,不让它执行那个子函数,程序是可以执行正确的”是怎么实现正确执行的。

使用特权

评论回复
20
不戴帽子|  楼主 | 2010-5-21 12:29 | 只看该作者
19# hgjinwei
就是程序是可以按顺序执行到最后,不会在中途返回到主函数的开始处

使用特权

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

本版积分规则

0

主题

44

帖子

1

粉丝