教程:用8051单片机实现花样彩灯

468 阅读4分钟

前言

想象一下,我们面前有一块8051系列的微控制器开发板,上面有几个LED灯和按键。我们的目标是让这些LED灯根据按键的不同组合呈现出不同的亮灭模式,比如流水灯效果或者特定的图案。为了实现这一目标,我们将通过编程来控制这一切。

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

正文

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

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

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

首先,我们需要告诉微控制器哪些引脚将用于控制LED灯,以及哪些引脚将用于检测按键是否被按下。于是,我们定义了一系列sbit类型的变量,比如LED0与P1.0引脚关联,而KEY0KEY7则分别与P0口的0至7号引脚关联。这样做,让我们能够直接通过这些变量来控制LED灯的开关状态和读取按键的状态。

#include<reg51.h>
sbit LED0=P1^0;
sbit KEY0=P0^0;
sbit KEY1=P0^1;
sbit KEY2=P0^2;
sbit KEY3=P0^3;
sbit KEY4=P0^4;
sbit KEY5=P0^5;
sbit KEY6=P0^6;
sbit KEY7=P0^7;

接下来,考虑到在微控制器编程中,我们经常需要延时来控制事件的顺序和间隔,我们编写了一个delay函数。这个函数通过执行空循环来消耗处理器的时钟周期,从而实现延时。它接收一个参数n,代表循环次数,内部再嵌套一层循环,通过调整循环次数,我们可以控制延时的长短。

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函数,它首先检查所有按键的状态,计算出被按下的按键数量。根据这个数量,函数会选择不同的LED显示模式:如果只有一个按键被按下,那么LED灯将从左到右依次亮起再熄灭,形成流水灯效果;如果有两个按键被按下,则LED灯将从右到左亮起;如果有三个按键被按下,LED灯将呈现交错的亮灭模式;如果有四个按键被按下,则是另一种交错模式;如果没有按键被按下或超过四个按键被按下,所有LED灯将被关闭。为了实现这些模式,我们使用for循环和位操作来改变P1口的值,控制LED灯的状态,并在每次状态改变后调用delay函数,以产生视觉上的延时效果。

void led()
{
	unsigned int count=0;
	if(KEY0 == 0) count++; // 如果KEY0被按下,则count加1
  if(KEY1 == 0) count++;
  if(KEY2 == 0) count++;
  if(KEY3 == 0) count++;
  if(KEY4 == 0) count++;
  if(KEY5 == 0) count++;
  if(KEY6 == 0) count++;
  if(KEY7 == 0) count++;
	if(count==1)
	{
		unsigned int i=0;
		for(i=0;i<8;i++)
		{
			P1=~(0x80>>i);
			delay(100);
		}
	}
	else if(count==2)
	{
		unsigned int i=0;
		for(i=0;i<8;i++)
		{
			P1=~(0x01<<i);
			delay(100);
		}
	}
	else if(count==3)
	{
		unsigned int i=0;
		for(i=0;i<4;i++)
		{
			P1=~((0x08>>i)+(0x10<<i));
			delay(100);
		}
	}
	else if(count==4)
	{
		unsigned int i=0;
		for(i=0;i<4;i++)
		{
			P1=~((0x80>>i)+(0x01<<i));
			delay(100);
		}
	}
	else
	{
		P1=0xFF;
	}
}

最后,我们来到程序的起点——main函数。这里,我们使用一个无限循环while(1)来不断调用led函数,这意味着LED灯的显示模式将根据按键的实时状态持续更新,直到我们手动停止程序或开发板断电。

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

结语

这就是我们如何通过编程控制LED灯和按键,创造出有趣和动态的灯光效果的全过程。希望这个讲解能帮到你,如果你有任何疑问,欢迎留言!