51单片机使灯闪烁,我写的程序按一下开始闪烁,在按一下为什么不能熄灭呢???
这是程序#include<reg51.h>voidDelay(unsignedinta);voidDelay10ms();sbitL1=P2^0;sbitK1=P0^0;...
这是程序#include<reg51.h>
void Delay(unsigned int a);
void Delay10ms();
sbit L1=P2^0;
sbit K1=P0^0;
void main()
{
L1=0;
if(K1==0)
{
Delay10ms();
if(K1==0)
{
L1=0;
Delay(1000);
L1=1;
Delay(1000);
}
while(1)
{
while(!K1)
Delay10ms();
while(!K1);
{L1=0;
Delay(1000);
L1=1;
Delay(1000);
}
}
}
}
void Delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Delay(unsigned int a)
{
unsigned char b;
for(;a>0;a--)
{
for(b=110;b>0;b--);
}
} 展开
void Delay(unsigned int a);
void Delay10ms();
sbit L1=P2^0;
sbit K1=P0^0;
void main()
{
L1=0;
if(K1==0)
{
Delay10ms();
if(K1==0)
{
L1=0;
Delay(1000);
L1=1;
Delay(1000);
}
while(1)
{
while(!K1)
Delay10ms();
while(!K1);
{L1=0;
Delay(1000);
L1=1;
Delay(1000);
}
}
}
}
void Delay10ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Delay(unsigned int a)
{
unsigned char b;
for(;a>0;a--)
{
for(b=110;b>0;b--);
}
} 展开
3个回答
展开全部
void main()
{
L1=0;
if(K1==0) //1 按键按下后
{
Delay10ms(); //2 延时去抖动
if(K1==0) //3 确认按下
{
L1=0; //4 以下4句闪烁一次
Delay(1000);
L1=1;
Delay(1000);
}
while(1) //5 这里死循环,不能再执行上面的语句了。
{
while(!K1) //6 判断按键是否按下,如果按下,则延时10ms,再判断是否按下,一致循环,知道你松开手。
{
Delay10ms();
}
while(!K1); //7 按键按下话,一致死等,直到你松开手
{ //8 下面闪烁一次。
L1=0;
Delay(1000);
L1=1; // 9
Delay(1000);
}
}
}
}
你的程序来看,工作流程是这样的,开机后,按下按键不放,只闪烁一次。如果你放开你的手,释放按键,则LED一致闪烁。
你说再按一下为什么不熄灭,因为 标示9句那里置1了,你的硬件应该是L1置1亮吧?
因为L1=1,是你灯闪烁的最后一个状态,而后又会从5再次执行,如果你按下了按键,程序停在了6那里死循环,
则后面7,8都不会执行了。灯则保留了上一个循环最后的状态,也就是9的状态,所以就一致亮了。
你如果又松开按键,灯又会闪烁,你再按下按键,灯又一直亮了。如此循环。
你的程序的就是一个字概括,乱,你的思路很混乱,条理不清晰,建议先在纸上写下流程,再来写代码。想清楚了再下手。
你会学的很快的。
你的main函数有个性,呵呵,没有人会这么写main函数的,去看看单片机C语言的书吧!
{
L1=0;
if(K1==0) //1 按键按下后
{
Delay10ms(); //2 延时去抖动
if(K1==0) //3 确认按下
{
L1=0; //4 以下4句闪烁一次
Delay(1000);
L1=1;
Delay(1000);
}
while(1) //5 这里死循环,不能再执行上面的语句了。
{
while(!K1) //6 判断按键是否按下,如果按下,则延时10ms,再判断是否按下,一致循环,知道你松开手。
{
Delay10ms();
}
while(!K1); //7 按键按下话,一致死等,直到你松开手
{ //8 下面闪烁一次。
L1=0;
Delay(1000);
L1=1; // 9
Delay(1000);
}
}
}
}
你的程序来看,工作流程是这样的,开机后,按下按键不放,只闪烁一次。如果你放开你的手,释放按键,则LED一致闪烁。
你说再按一下为什么不熄灭,因为 标示9句那里置1了,你的硬件应该是L1置1亮吧?
因为L1=1,是你灯闪烁的最后一个状态,而后又会从5再次执行,如果你按下了按键,程序停在了6那里死循环,
则后面7,8都不会执行了。灯则保留了上一个循环最后的状态,也就是9的状态,所以就一致亮了。
你如果又松开按键,灯又会闪烁,你再按下按键,灯又一直亮了。如此循环。
你的程序的就是一个字概括,乱,你的思路很混乱,条理不清晰,建议先在纸上写下流程,再来写代码。想清楚了再下手。
你会学的很快的。
你的main函数有个性,呵呵,没有人会这么写main函数的,去看看单片机C语言的书吧!
追问
我不会c语言,这个是我看资料瞎写的,可以帮忙写一个正确的程序吗??谢谢,拜托
昆山海旭电子
2024-10-31 广告
2024-10-31 广告
昆山海旭科技电子有限公司,本公司早年进入电声制造行业,经过多年的发展,已经形成了江苏、广东两地具备同时生产的能,产品范围涉及蜂鸣器,电容驻极咪头,蜂鸣片及喇叭。其中蜂鸣器产品囊括了:电磁式直流全套系类、电磁式交流全套系类、压电式直流系类、压...
点击进入详情页
本回答由昆山海旭电子提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询