教程:如何用8051单片机打造炫彩流水灯

621 阅读3分钟

前言

想象一下,我们手里有一块8051系列的微控制器,我们想要做的是让它控制一组LED灯,让这些灯能够像流水一样,一盏接一盏地亮起来,然后再一盏接一盏地熄灭。这就像是我们在夜晚看到的霓虹灯效果,只不过我们现在是在一块小小的电路板上实现它。

而下面我将实现它的仿真。

正文

首先,我们需要明确功能,下面是具体将要实现的功能:

现在,让我们打开仿真软件和编程软件。再次明确我们的目标,然后就可以画出如下仿真图:

接下来就可以准备编程了。

首先,我们得告诉这块微控制器我们要用哪个引脚来控制LED灯。我们可以使用了一行代码:sbit LED0 = P1^0;。这里,sbit是一个特殊的关键字,它允许我们直接访问微控制器的一个引脚。P1^0表示我们使用的是P1端口的第0个引脚,也就是P1.0。这样,当我们想控制LED灯的时候,我们只需要操作LED0这个变量就可以了,就像是在跟微控制器说:“嘿,我要控制那个LED灯了。”

#include<reg51.h>
sbit LED0=P1^0;

但是,光有LED灯还不行,我们还需要控制它们亮灭的节奏,这就需要用到延时。延时在编程中很常见,因为它可以帮助我们控制事件发生的顺序和时间间隔。所以,我们写了一个delay函数,它接收一个参数n。这个函数里有两个for循环,外层循环执行n次,内层循环执行120次,基本上什么也不干,只是让微控制器在那里“等待”。这种“等待”其实就是在消耗时间,因为微控制器执行任何指令都需要时间,所以我们通过让微控制器执行很多次空指令来实现延时。

void delay(unsigned int n)
{
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<120;j++);
	}
} 

有了延时,我们就可以控制LED灯的亮灭节奏了。于是,我们又写了一个led函数,这个函数里也有一个for循环。在这个循环里,我们对P1端口的每一位进行了操作,用0x01<<i来选择每一位,然后用~操作符来进行按位取反。这一步的意思是,每一次循环,我们都会让P1端口的一位变成高电平,而其他的位保持不变,这样就相当于点亮了连接在那个引脚上的LED灯。然后,我们调用delay函数,让微控制器“等”一会儿,再进入下一次循环,点亮下一个LED灯。这样,一个接一个,LED灯就像流水一样亮起来了。

void led()
{
	int i=0;
	for(i=0;i<8;i++)
	{
		P1=~(0x01<<i);
		delay(100);
	}
}

最后,为了让这个效果一直持续下去,我们在main函数中使用了一个无限循环while(1)。这个循环会一直执行下去,除非有人手动断电或者重置微控制器。在循环体里,我们只有一行代码led();,这意味着我们会不停地调用led函数,让LED灯持续地、循环地亮起来和熄灭,形成流水灯的效果。

void main()
{
    while(1)
		{
			led();
		}
}

结语

这样,我们就完成了整个流水灯的程序,从初始化LED灯的控制,到实现延时,再到控制LED灯的亮灭,最后让这个效果一直持续下去。这就是这段代码的全部工作原理。希望这个讲解能帮到你,如果你有任何疑问,欢迎留言!