【问题标题】:embedded C programming issue for 8051 MCU8051 MCU 的嵌入式 C 编程问题
【发布时间】:2018-04-29 11:35:03
【问题描述】:

我正在学习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;
            }
        }               
}

谁能解释它为什么会这样?我的声明方式有什么问题导致这个结果吗?专业工程师声明变量的良好做法是什么?对不起我的英语不好。如果我的问题有任何不清楚的地方,请告诉我。谢谢!

【问题讨论】:

  • 这两个语句:for (a;a&lt;num;a++) { for (i;i&lt;num;i++) 将导致编译器输出关于第一个参数是“什么都不做”的两个警告消息。编译时,始终启用警告,然后修复这些警告
  • 为什么会有两个嵌套循环,而不是一个递增到num * num,尽管在任何情况下,其输入平方的延迟都是一种奇怪的设计。不要发布无法编译的代码;如果要突出显示代码区域,请使用有效的 cmets。
  • numint,但 iachar。通过传递 num 说 256,此代码很容易破解。

标签: c embedded 8051


【解决方案1】:

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

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

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

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

这样i 每次都会从0 循环。

但是a的初始循环值只设置了一次,所以不管是在定义a时,还是在第一个循环条件中。

【讨论】:

  • @Honlo :这不是“评论”,而是您在评论中不必要地转述的答案。只需投票和/或接受 - 不要添加“谢谢”cmets - 这不是这样的方式。
猜你喜欢
  • 1970-01-01
  • 2021-06-14
  • 2012-03-16
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多