小弟初学单片机,正学习一个用程序使单片机的一个二极管闪烁
用了以下程序:
#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
如需电路图才能做出判断请提出
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里循环下去。
void delay(unsigned int z)
{
while(--z);
}
这个延时程序较常用,我也是看郭天祥的视频《十天学会单片机》,很快就可以入手,相信难不倒你!
SHOW一下头像.....比LS的大
for(i=0;i>50000;i++);//改动
LZ改动得这个循环一次都不执行,你觉得改动有意义吗?
改成for(i=0;i<50000;i++);试试
同意2楼的,另外,for(i=0;i>50000;i++);//改动 ,是不是有点问题
for(i=0;i>50000;i++);这名改下就可以了for(i=0;i<50000;i++);
for(i=0;i>50000;i++);//改动
(0<50000)
可以加个死循环,还有第二个for函数的变量设置错误,应改成i<50000
最好做个定时器,在定时器里处理,如果是1s闪烁,就500ms反一下LED输出IO电平。时间不能太短,否则肉眼无法察觉明灭,就变成常亮了,数码管的动态扫描就是基于这个原理。
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);
}
我觉得还是要习惯会用delay函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
延时时直接用delay(500);之类。。。
for(i=0;i>50000;i++);//改动
}
这个有问题,一次都不执行啊
最好是用个延时函数
void delay(unsigned int j )
(
while(j--);
)
楼主那个p0.0口只是先给了低电平,延时后再给高电平,然后状态就不变了怎么会闪烁呢?可以加个while死循环,就能不停闪烁了
void main()
{
while(1)
{ D1=0;
for(i=50000;i>0;i--);
D1=1;
for(i=50000;i>0;i--);
}
}
楼主的程序不应该是闪烁的啊,根本就没有循环啊,先亮了后灭了就一直灭了应该,根本就亮不了了啊,你再看看是不是程序发错了??
引用: 引用楼主 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一起操作的
引用: 引用 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里的条件写错了