c51单片机独立按键控制,流水灯程序

c51单片机独立按键控制,流水灯程序,第1张

while(1)

{ P1=aa;

delayms(1000);

aa=_crol_(aa,1);

}

这前面的while(1)根本不会退出,也就是不会执行下面的if(key1 == 0)的语句了,所以按键按下去当然没有反应了

if(key1==0)

{

P1=0x7e;

while(1)

{

a = 0xfe;

for(j=0;j<8;j++) //外循环8次

{

//--------------------------------------------

for(i=0;i<8-j;i++) //内循环8、7、60次

{

P1=a; //第一次,只有右边1个发光

delay(200);

a=_crol_(a,1); //左移一位

}

//以上单个LED发光,移位8、7、6次

//----------------------------------------

a = _crol_(a, j); //左移,第一次,移动0位,以后渐多

//前面的内循环,移位次数逐减,这里逐增,合到一起,仍然是移动8位

P1 = 0xff; //关闭显示

a = a << 1; //左移一位,右边添0,这样,就会有两个发光

} //到前边去循环,显示两个发光;

//再循环,有三个发光;

//……

}

你有几个错误:

1 你的定时器没有重装,导致第一次中断和后面的中断时间不一样,第一次时间短,后面的时间一直是以65536个周期中断的

2 你在中断函数里用了 for 循环,for循环是一下子就执行完了的,而不是你想象的每中断一次才执行一次

for(a=0;a<8;a++)

{

P1=(P1<<1)+1; //----这一句,使得你的第二个灯亮,其实第三,四,五个都亮了,但是因为你的

//----For循环太快了,你看不出来

};

if(a==8) //---执行完for之后,a肯定等于8,所以执行下面的,结果就是第一个灯亮

P1=0xfe;

3 我给你改正的,程序:功能是先是第一个灯亮,再是第一个灯灭,亮2,然后2灭,亮3

void time1() interrupt 3

{

tt++;

if(tt==10)

{

tt = 0; //---这句表示中断10次换一个灯,不可少

//----如果没有这句tt = 0,则成了中断256次才换一个灯

P1 =~(1<<aa); //---下面这三句,你好好想想是为什么,如果不明白再问我

//---最好要自己思考,想明白

aa++;

aa &= 0x07;

}

//----别忘记装入初值,你这个应该是10ms中断,然后是100ms换一次灯

//-----如果你不装初值,就成了 65536ms中断一次,再加上你前面不加上 tt = 0;

//------就成了16秒才换一次灯

TH1=0xd8;

TL1=0xf0;

}

//C51点亮8位LED流水灯:1234,2345,3456,7012;

//P1口接LED灯。假设高电平为点亮。

#include<reg51h>

#define LED P1char code light[]={0x1e,0x3c,0x78,0x87};

void delay(unsigned int i)

{

unsigned char j;

while(--i){j=100;while(--j);}

}

void main()

{

unsigned char i;

while(1)

{

for(i=0;i<4;i++)LED=light[i];

delay(1000);

}

}

//已编译通过。

//我在的:

以上就是关于c51单片机独立按键控制,流水灯程序全部的内容,包括:c51单片机独立按键控制,流水灯程序、51单片机流水灯 单片机 流水灯的问题 C51程序、我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了,最后停在第一个灯处不动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9268958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存