8051 MCU 的嵌入式 C 编程问题
embedded C programming issue for 8051 MCU
我正在学习8051单片机编程,现在正在做一个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;
}
}
}
谁能解释一下为什么会这样?我的申报方式有什么问题导致这个结果吗?专业工程师声明变量的最佳做法是什么?对不起我糟糕的英语。如果我的问题有任何不清楚的地方,请告诉我。谢谢!
通过仅初始化 i
一次,a
循环的下一次迭代不会重置它。
for (i; i < num; i++)
在第二个和后续循环中,i
将从 num
开始。这就是为什么你需要
for (i = 0; i < num; i++)
因此 i
每次都从 0
开始循环。
但是a
的初始循环值只设置一次,所以无论是在定义a
时,还是在第一个循环条件中都没有关系。
我正在学习8051单片机编程,现在正在做一个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;
}
}
}
谁能解释一下为什么会这样?我的申报方式有什么问题导致这个结果吗?专业工程师声明变量的最佳做法是什么?对不起我糟糕的英语。如果我的问题有任何不清楚的地方,请告诉我。谢谢!
通过仅初始化 i
一次,a
循环的下一次迭代不会重置它。
for (i; i < num; i++)
在第二个和后续循环中,i
将从 num
开始。这就是为什么你需要
for (i = 0; i < num; i++)
因此 i
每次都从 0
开始循环。
但是a
的初始循环值只设置一次,所以无论是在定义a
时,还是在第一个循环条件中都没有关系。