本来以为这个程序很简单的,没想到写了快三个小时。哎学艺不精啊。贴出来给你研究吧。我不想做过多的解释了,我是按我理解的你出的题目做的,可能和你的本意不是很一样,1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态程序中使用了P1口与8个发光二极管相连,具体电路图你百度一下吧,还有使用了一个按键,该按键与P3.7相连,低电平为按下状态。程序如下:#include #include /*变量声明:i、j、k都是记录计时器溢出次数的变量,stat是记录当前显示状态的变量,由按键key控制temp是状态2中保护P1口状态的变量*/unsigned char i=0,j=0,k=0,stat=0,temp;bit flag=1; //状态1处于灭灯还是亮灯状态的变量,1为依次亮灯,0为依次亮灯sbit key=P3^7; //按键控制void init(); //初始化函数void delay(unsigned int N); //延时函数void keyscan(); //键盘扫描函数void main(){ init(); while (1) { switch (stat) { case 0: //0方案 if(i==20&&flag) { i=0; P1=P1<<1; //依次亮灯 temp=P1; if(temp==0) { flag=0; } } if(i==20&&!flag) { i=0; if(P1==0xff) { flag=1; P1=0xfe; } if(!flag) { P1=P1<<1; //依次灭灯 temp=P1; P1=temp+1; } } break; case 1: //2方案 if(i==20) { i=0; P1=~P1; //去反后亮灯状态为灭灯,P1初值取0x55或0xaa,奇偶交替亮灯 } break; case 2: //3方案 if(j==60) { P1=temp; P1=_crol_(P1,1); temp=P1; //保护P1口亮灯状态 k=0; j=0; }//闪烁部分,应该可以优化 if(k<5) { P1=0xff; } else if(k>=5&&k<10) { P1=temp; } else if(k>=10&&k<15) { P1=0xff; } else if(k>=15&&k<20) { P1=temp; } else if(k>=20&&k<25) { P1=0xff; } else if(k>=30&&k<35) { P1=temp; } else if(k>=35&&k<40) { P1=0xff; } //----------------------------------- break; } keyscan(); }}void init(){ TH0=0x3c; //定时器赋初值定时时间50ms TL0=0xB0; TMOD=0x01; //设置定时器工作方式为方式1 EA=1; //开总中断 ET0=1; //开中断允许位 TR0=1; //定时器计数 P1=0xfe; //这里假设led灯与P1口相连并且 //低电平有效}void delay(unsigned int N){ int i,j; for (i=0;i=5&&k<10) { P1=temp; } else if(k>=10&&k<15) { P1=0xff; } else if(k>=15&&k<20) { P1=temp; } else if(k>=20&&k<25) { P1=0xff; } else if(k>=30&&k<35) { P1=temp; } else if(k>=35&&k<40) { P1=0xff; } break; } } }}void timer0() interrupt 1{ TH0=0x3c; TL0=0xB0; //溢出后重新赋初值 //定时器中断时间为50ms i++; //20次中断时间为1s j++; //40次中断时间为2s k++; //60次中断时间为3s}有什么不懂的可以百度Hi我