标题: 这个C语言程序为什么跳不出for循环? [打印本页]

作者: 陈二土    时间: 2020-6-24 18:34
标题: 这个C语言程序为什么跳不出for循环?
要求:开机后,P2.0控制的LED灯闪烁6次,闪烁间隔为500ms;闪烁结束后P4.7控制的LED灯常亮。
程序:
#include<reg52.h>
sbit LED=P2^0;


void delay(int i)
{
        while(i--);      
}


void main()
{
        int a;
        for(a=0;a<12;a++)
        {
                LED=~LED;
                delay(50000);
        }
        LED=0;
}
仿真的时候一直闪烁不知道为什么....求解答

51hei图片20200624183144.png (49.43 KB, 下载次数: 62)

51hei图片20200624183144.png

作者: wulin    时间: 2020-6-28 05:18
void main()
{
    int a;
    for(a=0;a<12;a++)
    {
        LED=~LED;
        delay(50000);
    }
    LED=0;
    while(1);
}
作者: 青桑叶    时间: 2020-6-28 08:48
main 函数一直在执行。led灯会一直闪烁。
作者: SKYLAR123    时间: 2020-6-28 09:25
加入while,防止程序跑飞,

作者: ouyangshishi    时间: 2020-6-28 09:32
这段代码中有一个最大的问题是没有主循环体,没有while循环体,而直接是main函数,有一种可能性就是函数执行完一次后,回到开头,重新执行,这就造成了一直闪烁
作者: heu_dzh    时间: 2020-6-28 09:59
我觉得程序是没问题的,但是可能仿真软件哪里有问题,你可以给程序里面加一个if(a==11)break;试试
作者: 黑麦威士忌    时间: 2020-6-28 10:37
应该是没有while(1)导致程序跑飞,建议改成这样
void main()
{
        int a;
        for(a=0;a<12;a++)
        {
                LED=~LED;
                delay(50000);
        }
        while(1)
        {
        LED=0;
        }
}
作者: wwh2382    时间: 2020-6-28 15:42
为什么不跟踪一下呢?将断点设在LED=0处,看程序有没有跳出for循环
作者: zeall1    时间: 2020-6-28 15:45
应该是没有while(1)导致程序跑飞
作者: 不要黑    时间: 2020-6-28 16:10
#include<reg52.h>
sbit LED=P2^0;
void delay(int i)
{
        while(i--);      
}

void main()
{
        int a;
        for(a=0;a<12;a++)
        {
                LED=~LED;
                delay(50000);
        }
        LED=0;
        while(1)
        {
                                       
        }
}
加while(1),实测有效。
作者: 湖南    时间: 2020-6-28 17:01
设置断点  调试一下代码看看
作者: f556    时间: 2020-6-28 17:36
程序本身没有问题,看了说加while(1);的处理方法,是一种答案。但原则上没有while(1),程序也是执行到main的最后一个}结束。
作者: ccdmcu    时间: 2020-6-29 15:48
这不明摆着吗,跳出for循环后又进去了啊,你又没加限制,main函数会一直循环执行。
作者: 电子back科技    时间: 2020-6-29 16:36
要习惯性的写个while(1)。有内容要循环的,就写进while(1)循环里,没有要循环的,就在最后写个while(1).
作者: 海南钓鱼王    时间: 2020-6-29 17:07
限制循环的地方,不然一直跑就一直闪
作者: 饮酒作乐    时间: 2020-6-29 17:39
程序原则上没有问题,但是最好加上while(1),然后自己设置停止点,不要让程序走出main 函数。如果是软件程序走出 main 就结束了。单片机很有可能会复位或者其他的原因再次进来。
作者: 约瑟    时间: 2020-6-30 05:41
不要让a初始化0,初始化放到for外边,
作者: aking991    时间: 2020-6-30 08:45
我认为是超出单片机看门狗定时器时间造成的,如果你用的是STC单片机,建议在循环体中加喂狗就不会每次超时而重启,这样也就看出一直跳不出来,其实它已在一定时间后就重启了
作者: wojiaoguogai    时间: 2020-6-30 09:39
程序结束后跑飞了,然后自动自复位
作者: 黄youhui    时间: 2020-6-30 10:10
你们51单片机度不用用while(1)卡程序的吗




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1