关于一个51单片机闪烁灯的程序问题

switch(ID){case 0:P1=0x0E;delay02s();P1=0x0F;break;case 1: P1=0x0D;delay02s();P1=0x0F;break;case 2:P1=0x0B;delay02s();P1=0x0F;break;case 3:P1=0x07;delay02s();P1=0x0F;break;}以上这段程序不断检测仿真时 led只会一直亮着P1=0x07;delay02s();P1=0x0F;比如把case3这段语句换成P1_3=~P1_3;delay02s();又能够闪烁,实在想不出为什么。#include <at89x51.h>unsigned char ID,n;void delay10ms(void){unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}void delay02s(void){unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(){ID=0;while(1){ if(P3_7==0) { delay10ms(); if(P3_7==0) { ID++; if(ID==4) { ID=0; } while(P3_7==0); } } switch(ID){case 0:P1=0x0E;delay02s();P1=0x0F;break;case 1: P1=0x0D;delay02s();P1=0x0F;break;case 2:P1=0x0B;delay02s();P1=0x0F;break;case 3:P1=0x07;delay02s();P1=0x0F;break;}}}贴上源程序一楼的case 3:⼀⼀P1=0x0F;P1=0x07;delay02s();break; 这样不会快的看不出吗
2026年09月23日 18:04
有2个网友回答
网友(1):

改成这样就可以了
-------------------------
switch(ID)
{
case 0:
P1=0x0E;
delay02s();
P1=0x0F;
delay02s();
break;

case 1:
P1=0x0D;
delay02s();
P1=0x0F;
delay02s();
break;

case 2:
P1=0x0B;
delay02s();
P1=0x0F;
delay02s();
break;

case 3:
P1=0x07;
delay02s();
P1=0x0F;
delay02s();
break;
}
-------------------------
最好改成这样~更省空间
-------------------------
前面加一个table:
unsigned char code table[4]={0x0E,0x0D,0x0B,0x07};

上面的程式改成:
P1=table[ID];
delay02s();
P1=0x0F;
delay02s();
-------------------------

网友(2):

这段代码没什么问题,可能是主函数调用问题。P1=0x0F;其实可以不用,如果用的话最好放在IO口赋值之前。

case 3:
//P1=0x0F;
P1=0x07;
delay02s();

break;

delay02s();你这个函数不是2秒延时吗?一般延时几十毫秒就有效果了。