一、前言
光立方顾名思义就是会发光的立方体,光立方的基本原理是利用人眼的暂留效应,利用单片机控制LED灯快速的闪烁,显示出一个完整的图案。光立方原理相对简单只是制作过程较为耗时。
二、LED介绍
1、介绍
本设计的光立方采用的是循环点亮的方法,通过循环将LED灯层层点亮,从而达到想要的效果。这个和数码管的动态扫描一个道理,当点亮第一层时对应一个图形,第二层对应一个图形,当扫描速度加快时,看上去就成为一个图形了。
2、驱动
本设计由于光立方小所以使用9013 NPN三极管进行驱动,目的是为LED灯提供足够大的电压电流,NPN三极管作为驱动电路使用时,在基级需串联电阻以保护三极管不被烧坏。三极管集电极与发射极一端接LED灯的负极一端接GND。
三、硬件连接
实物图
正面
侧面
背面
原理图
单片机最小系统,可自己添加按键控制程序。本设计未添加。
驱动电路
LED灯电路
P0、P1控制每一层点亮的LED灯,连接控制LED灯三极管的基级。
P24、P25、P26、P27控制点亮的层数,同样使用三极管进行控制。
四、软件代码
main主函数
调用想要的灯光,可以根据根据自己的想法进行不同的创意。我是直接调用方便大家学习使用。
void main()
{
while(1)
{
and1();
and2();
and3();
and4();
and5();
and6();
and7();
}
}
BMP.c
存储不同的灯光效果,程序中我设计了九个供大家学习。全亮、全灭、平面从最左面到最右面、平面从最下面到最上面、旋转点亮、旋转全亮、平面旋转、波浪、斜面。每个效果的程序结构基本相同。
void end() //全灭
void begin() //全亮
void and1()//平面最左边到最右边
void and2()//平面最下面到最上面
void and3()//旋转点亮
void and4()//旋转亮
void and5()//平面旋转
void and6()//波浪
void and7()//斜面1
大致讲解:由于使用P0、P1两个端口,所以使用A、B分别控制,AB的第一行为光立方每一层的第一个状态,第二行为第二个状态。循环中j为状态的个数,根据实际情况进行改写,k为每个状态的时长,时长过短时影响效果,i为层数的选择,不需要更改。
void and6()//波浪
{
unsigned char code A[2][4]=
{
{0x5a,0xa5,0x5a,0xa5}, //状态1
{0xa5,0x5a,0xa5,0x5a}, //状态2
};
unsigned char code B[2][4]=
{
{0x5a,0xa5,0x5a,0xa5},//状态1
{0xa5,0x5a,0xa5,0x5a},//状态2
};
int i,j,k;
for(j=0;j<2;j++)
{
for(k=0;k<60;k++)
{
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
b1=1;b2=0;b3=0;b4=0; break;//显示第0层
case(1):
b1=0;b2=1;b3=0;b4=0; break;//显示第1层
case(2):
b1=0;b2=0;b3=1;b4=0; break;//显示第2层
case(3):
b1=0;b2=0;b3=0;b4=1; break;//显示第3层
default:break;
}
a=A[j][i];
b=B[j][i];
DelayMs(1);
}
}
}
}
delay.c
根据不同的效果进行添加。
#include "delay.h"
/*------------------------------------------------
uS延时函数
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
五、效果展示
![](https://i-blog.csdnimg.cn/blog_migrate/453599244ceacd19bcaafcedc137d63a.png)
4*4*4光立方
六、代码链接
关注公众号“小小创客者”回复“4*4光立方”获得代码,如有错误欢迎指正。