怎么用89C51单片机实现用一个开关控制8个流水灯,要求开关按下去松开是亮的,再按下去松开是灭的??

本函数实现连接在P1.0到P1.7阴极控制的LED点亮与熄灭控制,
点亮时间由第二个FOR结构实现。
*/
#include <AT89X51.h> //预处理命令
void main(void) //主函数名
{
unsigned int a; //定义变量a 为int 类型
do{ //do while 组成
P1_0 =0; //设P1.0 口为低电平,点亮LED
for (a=0; a<60000; a++); //这是一个循环
P1_0 =1; //设P1.0 口为高电平,熄灭LED
P1_1 =0; //设P1.1 口为低电平,点亮LED
for(a=0;a<60000;a++); //这是一个循环
P1_1 =1; //设P1.1 口为高电平,熄灭LED
P1_2 =0; //设P1.2 口为低电平,点亮LED
for(a=0;a<60000;a++); //这是一个循环
P1_2 =1; //设P1.2 口为高循环,熄灭LED
P1_3 =0; //设P1.3 口为低电平,点亮LED
for(a=0;a<60000;a++); //这是一个循环
P1_3 =1; //设P1.3 口为高电平,熄灭LED
P1_4 =0; //设P1.4 口为低电平,点亮LED
for(a=0;a<60000;a++); //这是一个循环
P1_4 =1; //设P1.4 口为高电平,熄灭LED
P1_5 =0; //设P1.5 口为低电平,点亮LED
for(a=0;a<60000;a++); //这是一个循环
P1_5 =1; //设P1.5 口为高电平,熄灭LED
P1_6 =0; //设P1_6 口为低电平,点亮LED
for(a=0;a<60000;a++); //这是一个循环
P1_6 =1; //设P1_6 口为高电平,熄灭LED
P1_7 =0; //设P1.7 口为低电平,点亮LED
for(a=0;a<60000;a++); //这是一个循环
P1_7 =1; //设P1.7 口为高电平,熄灭LED
}
while(1);
}
能不能在我的程序上继续添加代码来实现,刚接触单片机不太懂,所以麻烦大神们把程序写出来,拜托了~

开关,接在 P2.7 与地之间。

#include <AT89X51.H> //预处理命令

void w(unsigned char k)
{
unsigned int a; //定义变量a 为int 类型
if (k) {
while(P2_7); //没有按就循环,等待按下
for (a = 0; a < 600; a++); //延时消抖
while(P2_7); //没有按就循环
}
else while(!P2_7); //按下就循环,等待松开
}

void main(void) //主函数名
{
while(1) {
w(1); P1_0 = 0; w(0); P1_0 = 1;
w(1); P1_1 = 0; w(0); P1_1 = 1;
w(1); P1_2 = 0; w(0); P1_2 = 1;
w(1); P1_3 = 0; w(0); P1_3 = 1;
w(1); P1_4 = 0; w(0); P1_4 = 1;
w(1); P1_5 = 0; w(0); P1_5 = 1;
w(1); P1_6 = 0; w(0); P1_6 = 1;
w(1); P1_7 = 0; w(0); P1_7 = 1;
}
}追问

请问一下if循环中第二个while是什么意思,延时消抖是什么意思?

追答

按键,按下的过程中,会有多次接触、断开。
如果没有延时消抖过程,按下一次键,单片机就会进行多次的操作。

看看我的百度空间吧,有许多的例程。

追问

好的,谢谢啦。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-01
你想实现什么样的效果?
你意思8个流水灯一直在那里循环流动显示?
然后按键控制亮灭?追问

对,就是一个开关按下去在松开是8盏流水灯亮,再按下去松开就灭了!

追答

你知道怎么使用定时器没,可以用定时器实现,在定时器中断里面进行流水灯的操作。
然后,如果按键按下的话,改变标志位的值为1,就停止定时器不让定时器计时,同时熄灭所有的灯。
如果按键再按下,改变标志位的值为0,继续计时,从刚才保存的数里读出流水灯的值,继续流水灯的操作

追问

我还没接触定时器啊,怎么办?在我这个程序上不能实现吗?

追答

#include <reg51.h>

#include <intrins.h>


#define uchar unsigned char

#define uint  unsigned int


#define LED_PORT P1


sbit Key = P3 ^ 7;


void Delayms( uint ms )

{

uint x,y;


for( x=0; x<ms; x++ )

for( y=0; y<124; y++ );

}

void InitTimer0( void )

{

TMOD = 0x01;

TH0  = ( 65536 - 50000 ) / 256;

TL0  = ( 65536 - 50000 ) % 256;

EA   = 1;

ET0  = 1;

TR0  = 1;

}


void main( void )

{

bit LEDFlag = 0;


LED_PORT = 0xff;

InitTimer0();


while(1)

{

if( !Key )

{

Delayms( 30 );

if( !Key )

{

LEDFlag =!LEDFlag;

if( LEDFlag )

{

TR0 = 0;

LED_PORT = 0xff;

}

else

{

TR0 = 1;

}

while( !Key );

}

}

}


void Timer0_ISR( void ) interrupt 1

{

static uchar cnt = 0;

static uchar LEDData = 0xfe;

TH0  = ( 65536 - 50000 ) / 256;

TL0  = ( 65536 - 50000 ) % 256;


cnt++;

if( cnt >= 10 )

{

cnt = 0;


LED_PORT = LEDData;


LEDData = _crol_( LED_PORT, 1 );

}

}


追问

请问这个程序哪地方有流水的语句?还请详细讲解一下,麻烦了!

追答

Timer0_ISR函数里面

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