проблема программирования на C для 8051 MCU - PullRequest
0 голосов
/ 29 апреля 2018

Я изучаю программирование 8051 MCU, и сейчас я делаю мини-проект по миганию светодиодов. Что я хочу сделать, так это то, что когда я нажимаю кнопку, светодиод будет мигать медленнее. И наоборот, когда я отпускаю кнопку, светодиод будет мигать быстрее. Я использовал встроенный 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;
            }
        }               
}

Но я обнаружил, что когда я объявил переменную a и i как 0 вне цикла for, светодиод будет мигать быстрее.

#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 голосов
/ 29 апреля 2018

Инициализируя i только один раз, он не сбрасывается для следующей итерации цикла a.

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

Во втором и последующем циклах i начнется с num. Вот почему вам нужно

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

Так что i повторяется от 0 в каждом случае.

Но начальное значение цикла a устанавливается только один раз, поэтому не имеет значения, определено ли это a или в состоянии первого цикла.

...