LED灯亮起来了!
一个LED亮
首先可以通过阅读开发板的原理图,找到需要控制的LED模块,如下:
可以发现,8个小的LED灯分别与高电平Vcc和端口P20-27相连,而P20-27又由单片机核心上的寄存器P2控制,所以我们可以通过对P2的8位端口编程来控制LED灯的亮灭,LED灯已与高电平连接,所以当另一端口为0时LED灯亮,1时灭,以D1单独亮举例,D1为0,其余为1,为1111 1110,转换编程规定的十六进制则为FE(0x为十六进制标志)
#include <REGX52.H> void main() { while(1) { P2=0xFE; } }
一个LED闪
想要实现LED灯闪,可以借鉴我们已经实现的LED灯亮来实现,灯闪即为灯不断的亮与灭,端口置0则灯亮。端口置1则灯灭,我们可以通过while循环,使其不断的亮(0xFE)与灭(0xFF)但是亮与灭如果发生的过快,我们无法观察到现象,所以我们需要使灯的亮与灭多保持一会儿,这里我们可以通过烧录程序来生成一段时间延迟函数:
void Delay100us(void) //@12.0000MHz { unsigned char data i, j; i = 12; j = 169; do { while (--j); } while (--i); }
但是当我们需要灵活的调整延迟时间时,我们就会发现,每变一次时间,就要生成一个新函数,这样使用这个函数有些过于繁琐,所以我们可以将函数改进为:
void Delay(int n) //@12.00MHz { while(n-->0) { unsigned char data i, j; i = 12; j = 169; do { while (--j); } while (--i); } }
只需要通过传递不同的值给Delay函数,就可以使其中的1ms延迟的循环体循环n次,实现n毫秒的延迟。
总体实现的代码为:
#include <REGX52.H> void Delay(int n) //@12.00MHz { while(n-->0) { unsigned char data i, j; i = 12; j = 169; do { while (--j); } while (--i); } } void main() { while(1) { P2=0xFE; Delay(100); P2=0xFF; Delay(100); } }
流水灯
流水灯就是使一排灯能够循环的亮,就像流水一样。本质上就是每个灯轮流亮,可以看作一个比单个LED闪烁稍微复杂些的程序,只需要延长循环题即可,实现代码如下:
#include <REGX52.H> void Delay(int n) //@12.000MHz { while(n--) { unsigned char data i, j; i = 2; j = 239; do { while (--j); } while (--i); } } void main() { while(1) { P2=0xFE; //1111 1110 D1亮 Delay(300); P2=0xFD; //1111 1101 D2亮 Delay(300); P2=0xFB; //1111 1011 D3亮 Delay(300); P2=0xF7; //1111 0111 D4亮 Delay(300); P2=0xEF; //1110 1111 D5亮 Delay(300); P2=0xDF; //1101 1111 D6亮 Delay(300); P2=0xBF; //1011 1111 D7亮 Delay(300); P2=0x7F; //0111 1111 D8亮 Delay(300); } }
通过修改每盏灯后的Delay函数的时间即可实现变速流水。