我换了一种写法,可还是有问题,就是在LED闪烁那一部分,就是如果我把0xff写在前面了,它能正常闪烁,但LED还是很暗;如果我把0x00写在前面了,它就不闪烁了,LED也很亮,完成循环才熄灭,相当于我写的闪烁部分根本没有执行。 以下是代码: #include <REGX51.H> typedef char u8; typedef int u16; #define LED_PORT P2//宏定义整个LED端口 void delay(u16 x)//延时函数,当ten_us传入1,大约延时10us { u16 y,z; for(y=0;y<x;y++) for(z=0;z<115;z++); } main() { u8 i=0,b=0;//定义变量i和b while(1) { for(i=0;i<8;i++) { LED_PORT=~(0x01<<i);//从LED1亮起,i每增加一次,移位一次 delay(200); // 延时大约0.2秒 } for(i=0;i<8;i++) { LED_PORT=~(0x80>>i);//从LED8亮起,i每增加一次,移位一次 delay(200);// 延时大约0.2秒 } b++;//b自加1 if(b%2==0)//上下循环两次后进入此循环 { for(i=0;i<5;i++) { LED_PORT=0xff;//LED全灭 delay(300); LED_PORT=0x00;//LED全亮 } } } } |
这个真的是 硬件的问题,跟51单片机的特性相关,因为单片机的io口驱动能力弱,即输出电流1mA都不到,你如果要使LED的亮度高,必须接一个pnp三极管, 能极大的增强电流,在提供led 1.8~2.5v的电压下,串一个220Ω的电阻,亮度就足够量。 |
要看电路图,能亮不代表电路没问题 |
亮的时间不够![]() |
LED正极串联一个1K电阻到电源正极,LED负极接单片机引脚 |