请高手帮忙,单片机控制一个LED灯闪烁的C语言程序,想加一个弹性按键,实现按一下弹起后,一直闪烁

实现按一下一直闪烁,再按一下就停止,一直重复。下面是我的程序,高手帮我改下,谢谢哦,呵呵。。。。

#include <reg51.h>
sbit P0_0=P0^0;
void delay1s();
unsigned char k;
void main( )
{
TMOD=0X10;
while(1)
{
P0_0=0;
delay1s();
P0_0=1;
delay1s();
}
}
void delay1s()
{
unsigned char i;
for(i=0;i<0x02;i++)
{
TH1=0X3C;
TL1=0XB0;
TR1=1;
while(!TF1);
TF1=0;
}
}

#include <reg51.h>
sbit P0_0=P0^0;
sbit key=P0^1;
void delay1s();
unsigned char k,led;
void main( )
{
TMOD=0X10;
led=1;
while(1)
{
if(key)
{
if (led=1){led=0}else{led=1;}
}
if(led==1)
{
P0_0=0;
delay1s();
P0_0=1;
delay1s();
}
else{P0_0=0;}
}
}
void delay1s()
{
unsigned char i;
for(i=0;i<0x02;i++)
{
TH1=0X3C;
TL1=0XB0;
TR1=1;
while(!TF1);
TF1=0;
}
}
以上只是一种解决方案,很不完善。最好是利用中断来改变led的值来进行状态切换。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-19
#include <reg51.h>
sbit P1_0=P1^0; //接收按键,假设按一下输入低电平
sbit P1_1=P1^1; //控制灯闪烁
void delay1s();
unsigned char k=0;
void main( )
{
while(1)
{
if(p1_0==0)
k=1;
if(k==1)
{P1_1=0;
delay1s();
P1_1=1;
delay1s();}
}
}
void delay1s()
{
unsigned char i;
for(i=0;i<0x02;i++);
}
你这个功能比较简单,上面那样差不多可以实现了,有几点需要说明:1、如果管脚比较充足,就不要P0脚,它做输入还好,要做输出就得加上拉电阻;2、这个实现和硬件接线有一定的关系;3、如果对性能要求不高,可以采用循环来延时已达到输出PWM波的目的,要求高的话可以采用中断来实现。网上单片机方面的参考很多,自学很方便。
第2个回答  2011-07-20
#include <AT89x051.H>
sbit pc0= P1^0;
sbit pd0= P1^1;

void delay(unsigned int t) //延时1ms
{
unsigned char i;
while(t--)
for(i=0;i<120;i++);
}

unsigned char smkey( ) //按键扫描程序
{
unsigned char sm,kk;
sm=pc0;
if(sm==1) //按键防抖
{delay(20);
sm=pc0;
if(sm==1)
{kk=1;

}
}
else

return(kk);
}

void main()
{
unsigned char key;
bit ll=0;
while(1)
{
if(ll==0)
//灯灭
else if(ll==1)
{
pd0=0; //闪烁
delay(500);
pd0=1;
delay(500);
}

key=smkey();
if(key==1)

}

}本回答被提问者采纳
第3个回答  2012-05-11
简单的程序 复杂化
第4个回答  2011-07-19
P0_0 是led灯管脚还是按键管脚?定时器也不是你那样用的追问

P0_0明显是LED灯管脚的,定时器在这里只是起到延时的作用,我这程序没有问题的。

相似回答