51单片机学习板二极管闪烁程序问题

lecat   2009-7-23 23:34 楼主
小弟初学单片机,正学习一个用程序使单片机的一个二极管闪烁
用了以下程序:
#include
sbit D1=P0^0;
unsigned int i;
void main()
{
      
       D1=0;
         for(i=50000;i>0;i--);
          
           D1=1;
        for(i=50000;i>0;i--);
}
实验成功
但我稍稍做了点改动
#include
sbit D1=P0^0;
unsigned int i;
void main()
{
      
       D1=0;
         for(i=50000;i>0;i--);
          
           D1=1;
        for(i=0;i>50000;i++);//改动
}
就变成一排8个二极管都在闪烁
然后尝试改成
#include

unsigned int i;
void main()
{
      
            P0=0xfe;
         for(i=50000;i>0;i--);
          
           P0=0xff;
        for(i=0;i>50000;i++);//改动
}
结果还是一排闪烁
请问各位大侠这是怎么回事呢?
单片机型号为STC89C52RC
如需电路图才能做出判断请提出

回复评论 (19)

1.该种延时程序不正确(for(i=0;i>50000;i++);//改动),
2.程序不严密,加上大循环,(虽然可以运行,)及灯的亮灭一直在while里面经行,
while(1)
{

}
以上现象不是很正常,建议看郭天祥的视频,迅雷里狗狗里可以搜到  
参考如下
#include
unsigned int i;
void delay(unsigned int z)      
{
while(--z);
}
void main()
{
      
while(1)
{
  P1=0xfe; //////亮P1^0口,11111110
  delay(60000);/////延时60000个周期
  P1=0xff; /////全灭
delay(60000);////延时60000个周期
}
}
一直在while里循环下去。                     
点赞  2009-7-24 00:58
void delay(unsigned int z)      
{
while(--z);
}
这个延时程序较常用,我也是看郭天祥的视频《十天学会单片机》,很快就可以入手,相信难不倒你!
点赞  2009-7-24 01:02
SHOW一下头像.....比LS的大
点赞  2009-7-24 17:20
for(i=0;i>50000;i++);//改动
LZ改动得这个循环一次都不执行,你觉得改动有意义吗?
点赞  2009-7-25 09:26
改成for(i=0;i<50000;i++);试试
点赞  2009-7-25 09:28
同意2楼的,另外,for(i=0;i>50000;i++);//改动 ,是不是有点问题
点赞  2009-7-25 14:24
for(i=0;i>50000;i++);这名改下就可以了for(i=0;i<50000;i++);
点赞  2009-7-26 23:58
for(i=0;i>50000;i++);//改动

(0<50000)
点赞  2009-7-30 16:17
可以加个死循环,还有第二个for函数的变量设置错误,应改成i<50000
点赞  2009-8-15 21:08
最好做个定时器,在定时器里处理,如果是1s闪烁,就500ms反一下LED输出IO电平。时间不能太短,否则肉眼无法察觉明灭,就变成常亮了,数码管的动态扫描就是基于这个原理。
点赞  2009-8-16 08:17
for(i=0;i>50000;i++);改成for(i=0;i <50000;i++);应该就可以
不过这个程序不是很严谨,建议让程序在main里头一个程序循环,这样你以后加功能,初始化程序就不会重复执行:
#include
sbit D1=P0^0;
unsigned int i;
void main()
{
  do{      
      D1=0;
      for(i=50000;i>0;i--);
  
      D1=1;
      for(i=0;i>50000;i++);//改动
     }while(1);
}
点赞  2009-8-16 08:33
不好意思,改动那边忘了改过来了
点赞  2009-8-16 08:35
我觉得还是要习惯会用delay函数
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}
  延时时直接用delay(500);之类。。。
点赞  2009-8-17 13:36
for(i=0;i>50000;i++);//改动
}
这个有问题,一次都不执行啊
最好是用个延时函数
void delay(unsigned int j )
(
  while(j--);
)
点赞  2009-8-19 13:26
楼主那个p0.0口只是先给了低电平,延时后再给高电平,然后状态就不变了怎么会闪烁呢?可以加个while死循环,就能不停闪烁了
void main()
{
   while(1)   
     { D1=0;
for(i=50000;i>0;i--);
  
  D1=1;
for(i=50000;i>0;i--);
}
   }
点赞  2009-8-23 12:23
楼主的程序不应该是闪烁的啊,根本就没有循环啊,先亮了后灭了就一直灭了应该,根本就亮不了了啊,你再看看是不是程序发错了??
点赞  2009-8-24 18:21
引用: 引用楼主 flynn_gao 的回复:
小弟初学单片机,正学习一个用程序使单片机的一个二极管闪烁
用了以下程序:
#include
sbit D1=P0^0;
unsigned int i;
void main()
{
? ? ?
? ? ? D1=0;
for(i=50000;i>0;i--);
?
? D1=1;
for(i=50000;i>0;i--);
}
实验成功
但我稍稍做了点改动
#include
sbit D1=P0^0;
unsigned int i;
void main()
{
? ? ?
? ? ? D1=0;
for(i=50000;i>0;i--);
?
? D1=1;
for(i=0;i>50000;i++);//改动
}
就变成一排8个二极管都在闪烁
然后尝试改成
#include

unsigned int i;
void main()
{
? ? ?
? ? ? ? ? ? P0=0xfe;
for(i=50000;i>0;i--);
?
? P0=0xff;
for(i=0;i>50000;i++);//改动
}
结果还是一排闪烁
请问各位大侠这是怎么回事呢?
单片机型号为STC89C52RC
如需电路图才能做出判断请提出

当然是8个一起闪烁
P0口一个有8位你第一个程序D1是第0位
所以第一个程序是对P0口上第0位操作
第二个程序你是8位一起操作的,自然是对8个led一起操作的
点赞  2009-8-25 09:40
引用: 引用 17 楼 t1397018 的回复:
引用楼主 flynn_gao 的回复:
小弟初学单片机,正学习一个用程序使单片机的一个二极管闪烁
用了以下程序:
#include
sbit D1=P0^0;
unsigned int i;
void main()
{
? ? ?
? ? ? D1=0;
for(i=50000;i>0;i--);
?
? D1=1;
for(i=50000;i>0;i--);
}
实验成功
但我稍稍做了点改动
#include
sbit D1=P0^0;
unsigned int i;
void main()
{
? ? ?
? ? ? D1=0;
for(i=50000;i>0;i--);
?
? D1=1;
for(i=0;i>50000;i++);//改动
}
就变成一排8个二极管都在闪烁
然后尝试改成
#include

unsigned int i;
void main()
{
? ? ?
? ? ? ? ? ? P0=0xfe;
for(i=50000;i>0;i--);
?
? P0=0xff;
for(i=0;i>50000;i++);//改动
}
结果还是一排闪烁
请问各位大侠这是怎么回事呢?
单片机型号为STC89C52RC
如需电路图才能做出判断请提出

当然是8个一起闪烁
P0口一个有8位你第一个程序D1是第0位
所以第一个程序是对P0口上第0位操作
第二个程序你是8位一起操作的,自然是对8个led一起操作的

看错了
你for里的条件写错了
点赞  2009-8-25 09:42
第二段程序全闪的状态不对啊
点赞  2009-8-25 17:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复