单片机c语言程序问题,LED闪烁灯的,初学单片机,希望高手能回答的通俗易懂些

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1^0;
void DelayMS(uint x)
{
uchar i;
while(x--) //输入的数字是150,那么当x=0后,while为假,为什么灯还会闪烁
{
for(i=120;i>0;i--); //for 语句后边可以接分号么,不过单片机上测试时闪烁
}
}
void main()
{
while(1)
{
LED = ~LED;
DelayMS(150);
}
}

void DelayMS(uint x)//这是个延时函数
{
uchar i;
while(x--)
{
for(i=120;i>0;i--); //for 语句后边可以接分号,意思是从120自减到1
}
}
void main()
{
while(1)//死循环,延时函数中的x变为0仍然可以闪烁的原因是一直在执行,灯亮灯灭的操作
{
LED = ~LED;//亮灭灯的操作
DelayMS(150);//延时150毫秒
}
}
//while(1)死循环,一直循环执行
LED = ~LED;//亮灭灯的操作
DelayMS(150);//延时150毫秒
这两句代码
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-31
void DelayMS(uint x)
{
uchar i;
while(x--) //输入的数字是150,那么当x=0后,while为假,为什么灯还会闪烁
{
for(i=120;i>0;i--); //for 语句后边可以接分号么,不过单片机上测试时闪烁
}
}
这个函数不是决定灯会不会闪烁!它是一个定时函数,时间长短由形参X决定。那么当x=0后,while为假,是定时时间到,函数返回,此时如果是在亮的时候,是亮的时间到了,如果是在灭的时候,是灭的时间到了。

灯会不会闪烁是由这个决定的:
while(1)
{
LED = ~LED;//如果灯原来是亮的,将它变灭。如果灯原来是灭的,它将变亮。
DelayMS(150);//调用定时函数,让它亮(或灭)多长的时间。

DelayMS(150);//在此可再次或多少次调用DelayMS(150),来加长灯亮(或灭)的时间,即闪烁的速度
}
第2个回答  2012-10-31
while(x--) //输入的数字是150,那么当x=0后,while为假,为什么灯还会闪烁
{
for(i=120;i>0;i--); //for 语句后边可以接分号么,不过单片机上测试时闪烁
}
这段是一个子函数,当DelayMS(150);执行这句时子函数是吧括号里的150的值传给了上面一段的中的形参X,开始后X是150,当X为0后延时结束,当再次调用这个函数时它依然以X为150开始,这样就做到了定时函数的作用,
while(1)
{
LED = ~LED;
DelayMS(150);
}
这个WHILE种的值始终为1是真,那这个就是一个无限循环的函数,所以LED的取反工作是不停止的,DelayMS(150);定时子函数是起到亮灭的时间间隔的作用
希望你能理解本回答被网友采纳
第3个回答  2012-10-31
主循环中的
while(1){ }循环的条件为1,恒为真,while(1)的循环体会一直循环执行下去,若想让灯闪烁几次可以把while(1)改成for()循环,设定循环次数即可。
相似回答