51单片机流水灯问题

#include<reg51.h>
void main()
{
int i,j;
P0=0x00;
for(i=0;i>=0;i++)
{
switch(j=i%8)
{
case 0:P0=0x01;break;
case 1:P0=0x02;break;
case 2:P0=0x04;break;
case 3:P0=0x08;break;
case 4:P0=0x10;break;
case 5:P0=0x20;break;
case 6:P0=0x30;break;
case 7:P0=0x80;break;
}
}
}
这是我用C编写出来的程序,不知道错在哪里,下载到单片机后单片机的流水灯总是先亮a管,接着除了g管之外全亮了,请高手帮忙解答一下,谢谢

第1个回答  2013-08-02
加延时程序
#include<reg51.h>
//...................................
void delay_ms(uint ms)
{
uint x, y;

for(x=ms; x>0; x--)

for(y=110; y>0; y--);
}
//......................
void main()
{
int i,j;
P0=0x00;
for(i=0;i>=0;i++)
{
switch(j=i%8)
{
case 0:P0=0x01; delay_ms(500);break;
case 1:P0=0x02;delay_ms(500);break;
case 2:P0=0x04;delay_ms(500);break;
case 3:P0=0x08;delay_ms(500);break;
case 4:P0=0x10;delay_ms(500);break;
case 5:P0=0x20;delay_ms(500);break;
case 6:P0=0x30;delay_ms(500);break;
case 7:P0=0x80;delay_ms(500);break;
}
}
}追问

for(i=0;i>=0;i++)
{switch(j=i%8)
{
case 0:P0=0x01;break;
。。。。。。
case 7:P0=0x80;break;}
for(k=50000;k>0;k--)
{}
}
你好,我加了延时之后,发现流水灯工作次序是:先亮a管,接着亮b、c、d、e、f管,接着同时亮ef管,最后亮小数点。请问这是为什么呢?

追答

case 6:P0=0x30;delay_ms(500);break;

改成 0x40就好了!!!!.你写成二进制 就知道什么原因了

第2个回答  2013-08-02
LED状态切换时间太短,每种状态切换之间要加延时程序。
第3个回答  2013-08-02
我分析后认为原因是这样的:
也许这这样的程序能达到你想的目的,但是,由于程序执行太快了,人眼的视觉暂留,所以你观察是很多都亮了,其实它们是分别亮的,只是我们观察不出来.
那么,我建议你在switch之后加一个delay函数,延时约1S吧,这样就能清楚的观察其变化了.
不懂的地方可随时回复我.
希望我的回答能帮助到你.追问

for(i=0;i>=0;i++)
{switch(j=i%8)
{
case 0:P0=0x01;break;
。。。。。。

case 7:P0=0x80;break;}
for(k=50000;k>0;k--)

{}
}
你好,我加了延时之后,发现流水灯工作次序是:先亮a管,接着亮b、c、d、e、f管,接着同时亮ef管,最后亮小数点。请问这是为什么呢?

追答

你延时怎么加的,给我你程序

追问

下面那个for程序可以吗?
for(k=50000;k>0;k--)
{}
这个。谢谢你,我知道哪里错了。

追答

for这样延时可以,但时间不长,建议使用嵌套for循环.最后你找出来是哪儿错了?

本回答被提问者采纳
相似回答