找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1988|回复: 13
收起左侧

这个帖有趣"关于单片机LED灯循环点亮程序调试问题"

[复制链接]
ID:917199 发表于 2021-5-21 21:32 | 显示全部楼层 |阅读模式
ttp://www.51hei.com/bbs/dpj-207328-1.html
注意楼主的问题是为什么没有停下来,吓面是原程序:
#include <REGX52.H>
void delay(int t);
void main()
{
        char i;
        while(i<=5)
        {
                for(i=0;i<5;i++)
                {
                P2=0x00;
                delay(60000);
                P2=0xff;
                delay(60000);
                i=i+1;
                }
        }               
}
void delay(int t)
{
        while(--t);
}
我将它修改如下再仿真仍然没停,事情是不是变得有趣了?
char i=0;
        while(i<5)
        {
                for(i;i<5;i++)
                {
无论实物还是仿真,很期待大家的测试结果
回复

使用道具 举报

ID:342822 发表于 2021-5-21 22:10 | 显示全部楼层
#include <REGX52.H>
void delay(int t);
void main()
{
        char i;
        while(i<5)
        {
                for(i=0;i<5;i++)
                {
                P2=0x00;
                delay(60000);
                P2=0xff;
                delay(60000);
               // i=i+1;
                }
        }
   while(1);            
}

void delay(int t)
{
        while(--t);
}
回复

使用道具 举报

ID:342822 发表于 2021-5-21 22:16 | 显示全部楼层
对比上面的“i”有什么不同
#include <REGX52.H>
void delay(int t);
void main()
{
        char i;
        while(i<=5)
        {
                for(i=0;i<5;i++)
                {
                P2=0x00;
                delay(60000);
                P2=0xff;
                delay(60000);
               // i=i+1;
                }
i=i+1;
        }
   while(1);            
}

void delay(int t)
{
        while(--t);
}
回复

使用道具 举报

ID:917199 发表于 2021-5-22 08:32 | 显示全部楼层
taotie 发表于 2021-5-21 22:10
#include
void delay(int t);
void main()

请注意问题是FOR循环中I>5以后为什么没有跳出,而不是点个破灯!             !!!!!!!!!!!!!!!
回复

使用道具 举报

ID:342822 发表于 2021-5-22 09:07 | 显示全部楼层
你没有搞懂循环嵌套--内外循环体
下面程序正常运行

#include <REGX52.H>
void delay(int t);
void main()
{
        char i;
        while(i<5)
        {
                for(i=0;i<5;i++)
                {
               
                }
        }
   while(1)
       {
                P2=0x00;
                delay(60000);
                P2=0xff;
                delay(60000);

       }


            
}

void delay(int t)
{
        while(--t);
}
回复

使用道具 举报

ID:917199 发表于 2021-5-22 09:30 | 显示全部楼层
taotie 发表于 2021-5-21 22:16
对比上面的“i”有什么不同
#include
void delay(int t);

谢谢您的回复,能具体解释下或者给个关键词我去搜索?   用 您的代码完美的闪烁5次,但结束循环的关键是WHILE,I=i+1的位置只改变了闪烁次数

                                                         
回复

使用道具 举报

ID:917199 发表于 2021-5-22 09:38 | 显示全部楼层
taotie 发表于 2021-5-22 09:07
你没有搞懂循环嵌套--内外循环体
下面程序正常运行

您这个是一直在闪?
回复

使用道具 举报

ID:917199 发表于 2021-5-22 10:01 | 显示全部楼层
我不理解之处在于将原代码改成下面这样
#include <REGX52.H>
void delay(int t);
void main()
{
        char i;
        while(i<5)
        {
                for(i=0;i<5;i++)
                {
                P2=0x00;
                delay(60000);
                P2=0xff;
                delay(60000);
                i=i+1;
                }
        }               
}
void delay(int t)
{
        while(--t);
}
若干次FOR循环后i=5跳出,while循环似乎也跳出了,这时候P2不是应该保持最后的状态么,为什么还在闪?  
顺便说下之前认为还闪说明没跳出while所以迷惑
回复

使用道具 举报

ID:824490 发表于 2021-5-22 10:14 | 显示全部楼层
简单地说,就是原代码是双重嵌套,while()嵌入for(),for()能跳出,而while()跳不出,所以就一直在while()内运行。更改的方法也简单,单独用while()或单独用for()就可以了。
i=5
while(i)
{
P2=0x00;
  delay(60000);
  P2=0xff;
   delay(60000);
i--;
}


for(i=0;i<5;i++)
{
P2=0x00;
  delay(60000);
  P2=0xff;
   delay(60000);
}
回复

使用道具 举报

ID:342822 发表于 2021-5-22 10:28 | 显示全部楼层
timerzero 发表于 2021-5-22 09:38
您这个是一直在闪?

跳出嵌套循环进入最后的死循环当然是
回复

使用道具 举报

ID:342822 发表于 2021-5-22 10:34 | 显示全部楼层
用Proteus 8 调试模式,观察变量“i”的变化你就明白了~~
回复

使用道具 举报

ID:342822 发表于 2021-5-22 12:00 | 显示全部楼层
用Proteus 8 调试模式,观察变量“i”的变化。源程序还是跳出FOR循环,只是程序末尾没有 while(1);语句他又重新返回执行 while(i<5)。



#include <REGX52.H>
void delay(int t);
void main()
{
        char i;
        while(i<5)
        {
                for(i=0;i<5;i++)
                {
                P2=0x00;
                delay(60000);
                P2=0xff;
                delay(60000);
                i=i+1;
                }
        }
while(1);            
}
void delay(int t)
{
        while(--t);
}
回复

使用道具 举报

ID:917199 发表于 2021-5-22 16:36 | 显示全部楼层
taotie 发表于 2021-5-22 12:00
用Proteus 8 调试模式,观察变量“i”的变化。源程序还是跳出FOR循环,只是程序末尾没有 while(1);语句他 ...

那个还不会,用的土办法   代码里加P1={i];不仅跳出了for循环还跳出了while循环,
以前一直以为这种情况下cpu是处在空载状态,什么都不干挂在那里,真没想到语句他又重新返回执行 while(i<5)
谢谢您的指点
回复

使用道具 举报

ID:917199 发表于 2021-5-22 16:41 | 显示全部楼层
名字不是重点 发表于 2021-5-22 10:14
简单地说,就是原代码是双重嵌套,while()嵌入for(),for()能跳出,而while()跳不出,所以就一直在while()内 ...

感谢回复,原铁确实跳不出while,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表