51单片机,让第一个灯亮,第二个亮,第一个灭,一直到第8个灯长亮!第二次循环,第7个灯亮!

51单片机,让第一个灯亮,第二个亮,第一个灭,一直到第8个灯长亮!第二次循环,第7个灯亮!一直循环,最后8个全亮!

你这个很简单,流水灯的间隔时间有什么要求吗? 8个灯接在单片机的哪个IO口上? 如果右要求可以说出来,没有的话,我给你仿真一个发给你

完善一下

留下联系方式,打包发给你

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-01-04
我把C代码贴上了,自己看吧,仿真也可以给你
#include "AT89X51.H"

unsigned char DELAYOVER=0;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
void timer0_int(void) interrupt 1
{
TR0=0; //停止T0
TH0=0x3c;
TL0=0xaa; //给定时器赋初始值
TR0=1; //启动T0
DELAYOVER=1; //定时节拍字节,代表定时器定时到50MS了
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
unsigned char temp1=0,temp2=0;
unsigned char a=0,b=0;
P0=0XFF; //刚开机,使所有的灯全不亮 I/O口所接的LED为灌流形式,0为亮,1为灭

//开始设置定时器,吧定时器T0和T1都设置为16为定时器
EA=0; //禁止总中断
TMOD=0x01; //定时器T0设置为16为定时器
TR0=0; //关闭定时器0
TH0=0x3c;
TL0=0xb0; //给定时器赋初始值(让定时器计数50000,用12M晶振,那就是定时50MS)0x3cb0
PT0=1; //设置中断优先级
ET0=1; //允许T0中断
EA=1; //禁止总中断
TR0=1; //启动定时器T0

while(1)
{

if(DELAYOVER==1) //50MS进入一次,如果想改变LED亮的速度请改变定时器定时时间,也可以定时两次或N次后再给DELAYOVER赋1。
{
DELAYOVER=0;
temp1=(1<<a);
P0=~(temp1|temp2);
a++;
if(a>(7-b))
{
a=0;
b++;
if(b>7)
{
b=0;
// temp1=0;
// temp2=0; //把temp1和temp2清零就可以循环点亮了,如果注释掉这两行就8个灯全亮后就不动了一直全亮
}
temp2=(temp1|temp2);
}
}
}
}