怎么用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函数里面

本回答被提问者采纳

怎么用89C51单片机实现用一个开关控制8个流水灯,要求开关按下去松开是亮...
w(1); P1_7 = 0; w(0); P1_7 = 1;} }

单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果...
for(i=254; i>0; i--){ while ( Maikuan!=20){ LED = 0x00;} while ( Maikuan!=200){ LED = 0x55;} Maikuan = 0;} \/\/最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。for(j = 0;j<=7;j++){ i = 0;while(i!=2...

怎么使89c51单片机用键盘的左右键控制8个led灯左右流水?
单片机流水灯的程序,在百度知道里是最多的,随便搜索一下,就可以搜索到无数个答案,有仿真图和程序,再根据你的仿真图,稍做修改就成了。那两个左右按键,要用按纽BUTTON。如下图所示的接法。要写程序,财富值太少了,恐怕没有人写。

8个LED循环点亮,延时程序
rlf PORTC,1 ;C口左移1位 call delay call delay CALL delay ;调用三次延时程序(保证亮度,以及流水灯闪烁速度)bcf STATUS,C ;清0进位标志位(永远只有一只LED亮)DECFSZ count,1 ;判断是否一轮循环结束 goto loop ;否,继续循环移位 GOTO main ;...

单片机问题:利用中断实现彩灯控制系统,当没有下降沿出现时8个彩灯全灭...
一、P1口是输出还是输入?P1口是输入:如果你用的是89C51单片机的话,外部中断是在P3.2和P3.3引脚,P1口是没有的。所以,如果你既想用外部中断又想用P1口做控制输入端,就需要用“与(或)”逻辑电路从P1口导出中断信号给P3.2和P3.3引脚。P1口是输出(也就是P1口的引脚连着LED灯):用P3...

跪求单片机89C51控制交通灯的课程设计
1 设计思路 AT89C52是一个低电压,高性能CMOS 8位单片机, 可以用来做单片机流水灯、跑马灯。。。等实验 电路原理图见下图1,如果我们想让接在P1.0口的LED1亮起来,那么我们只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平就可以;同...

如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED...
51单片机实现方法:按键控制标志位flag取反。然后把下面的代码放到循环里:U8 temp0 = 1。U8 temp1 = 0x80。U8 i = 0。if(flag == 1)。{。for(i=0;i<8;i++)。{。P1=temp0<<i。}。}。else。{。for(i=0;i<8;i++)。{。P1=temp1>>i。}。}。}。对控制LED口的寄存器进行位...

89C51单片机 4*4矩阵键盘加流水灯问题,求个汇编程序代码。
;其实很简单,都不用判断键值,有键按下暂停2S程序如下:ORG 0000H LJMP STA ORG 000BH LJMP T0ISR ORG 0030H STA:MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB ET0 SETB EA MOV 30,#0FEH MOV R2,#0 CLR 00H LOOP:MOV P1,#0F0H MOV A,P1 CJNE A,#0F0H,LOOP1 SJMP LOOP...

...编程实现至少3种花样循环显示的编程与电路图。单片机89c51,先...
功 能: 流水灯 参 数: MS--点亮相邻LED的时间间隔,单位是毫秒 返回值 : 无 \/***\/ void main(){ Board_init();PORTC|=BIT(BEEP);while(1){ uchar i;for(i=0;i<8;i++) \/\/循环8次,8个LED依次点亮 { All_led(FALSE); \/\/全部熄灭 One_led(i,TRUE); \/\/点亮指定的LE...

某单片机控制系统有8个发光二极管。试画出89C51与外设的连接图并编程...
网上很多的,另外给你介绍一本书:《单片机C语言程序设计实训100例——基于8051+Proteus仿真》。这本书介绍了51单片机的详细应用。如果你想学51的话是一本很不错的书。

相似回答