8051 MCU的嵌入式C编程问题

时间:2018-04-29 11:35:04

标签: c embedded 8051

我正在研究8051 MCU编程,我正在做一个LED闪烁的迷你项目。我想要做的是,当我按下按钮时,LED将闪烁得更慢。相反,当我松开按钮时,LED会闪烁得更快。我使用嵌入式C,这是我的代码:

#include <reg51.h>

sbit LED = P0^0;
sbit SW = P1^0;


void T0delay(int num);

void main()
{
    while (1)
    {
        LED = ~LED;
        if (SW == 0)
        {
            T0delay(4);
        }
        else
        {
            T0delay(2);
        }
    }
}

void T0delay(int num)
{
        **unsigned char i;
        unsigned char a;**
        for (a=0;a<num;a++)
        {
            for (i=0;i<num;i++)
            {
                TMOD = 0x01;
                TL0 = 0xFE;
                TH0 = 0xA5;
                TR0 = 1;
                while (TF0 == 0);
                TR0 = 0;
                TF0 = 0;
            }
        }               
}

但我发现当我在for循环外宣布变量a和i为0时,LED会闪烁得更快。

#include <reg51.h>

sbit LED = P0^0;
sbit SW = P1^0;


void T0delay(int num);

void main()
{
    while (1)
    {
        LED = ~LED;
        if (SW == 0)
        {
            T0delay(4);
        }
        else
        {
            T0delay(2);
        }
    }
}

void T0delay(int num)
{
        **unsigned char i = 0;
        unsigned char a = 0;**
        for (a;a<num;a++)
        {
            for (i;i<num;i++)
            {
                TMOD = 0x01;
                TL0 = 0xFE;
                TH0 = 0xA5;
                TR0 = 1;
                while (TF0 == 0);
                TR0 = 0;
                TF0 = 0;
            }
        }               
}

任何人都能解释为什么它会像这样表现吗?我的申报方式导致这个结果有什么不对吗?专业工程师申报变量的良好做法是什么?抱歉我的英语不好。如果我的问题中有任何不清楚的地方,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:2)

仅通过初始化i一次,它不会在a循环的下一次迭代中重置。

for (i; i < num; i++)

在第二个及后续循环中,i将从num开始。这就是你需要的原因

for (i = 0; i < num; i++)

因此i每次都会从0循环。

但是a的初始循环值只设置了一次,因此无论是在定义a时还是在第一个循环条件下都无关紧要。