用简单的发光二极管,做不简单的事,8*8*8光立方详细制作过程

光立方由若干个二极管led灯以立方体形式搭建,4*4*4、8*8*8、16*16*16甚至更多,又由单片机、锁存器、译码器等电器元件驱动,形成立体动画效果。其中8*8*8光立方最为常见。

例如:8*8*8光立方是由512个发光二极管按照立方体的方式搭建焊接起来的,有层共阴束共阳和层共阳束共阴两种方案,每一层有8*8个发光二极管,共8层。用c语言编译单片机程序使自定义动画效果得以实现。


光立方工作原理

光立方简单讲就是用单片机控制很多规则排列的LED的亮和灭。

1、单个LED的控制方式

先了解单个LED的控制方式,可以是将正极接电源,负极通过一个限流电阻连接至单片机的某个IO口。IO口输出低电平时,LED就亮,反之,LED灭。

如果我们想驱动任意位置的led,我们只需要在该位置led所使用的列线接地,行线接上+V即可。

学过单片机的朋友们,都知道数码管是怎么点亮的,其中有位选和段选之分,通过扫描来实现所有数码管能正常工作以实现显示我们想要的数字。

点阵也一样,尽管是8*8的点阵,如果我们让整体能随意显示图案,那也需要用扫描的方式才能够实现,否则,无法实现对其精准的控制。

所谓扫描,就是说,我们一次只能让一行排或者一竖排的灯亮。每次只能这么点,8次为一个周期,从左至右依次点一次,那么循环起来,我们看到的就是完整的图像了。


2、每一层LED的控制方式

若按照单个LED的控制方式,每个LED需要占用单片机的一个IO口,控制100个LED就需要100个IO口。那么,有没有一种方式,可以用较少的IO口,控制较多的LED呢?答案是肯定的,这种方法,就是扫描驱动电路。


2*2扫描驱动电路

所以一般情况下,光立方的每一层虽然有64个灯,但是我们会有64跟线分别连接到这些灯上,从而实现一次性的对64个灯进行控制,通常单片机引脚较少,一般将采用74hc573,74hc595等芯片进行拓展。

3、(基于74hc573的)8*8*8光立方LED的控制方式

数据通过并行的方式,分别打入每一个74hc573中,再控制器储存这些数据,从而实现一层64个灯同时的点亮。下面描述一下一个固定画面的显示,所需要硬件执行的过程。

1)将第一层64个点的数据传入8个74hc573中,控制uln2803层控制芯片打开第一层开关,使第一层点亮,这个时候,其他层是灭的。

2)等待时间t。

3)熄灭第一层,开始向74hc573中传输第二层的数据,锁存,开启第二层总控制开关,点亮第二层。

4)等待时间t。

。。。

熄灭第一层,将第八层的的数据传进所有74hc573中,锁存,开启第八层总开关,点亮第八层。

再回到第一步,循环下去。。

这样,便实现了一个周期画面的显示,由于人眼的视觉暂留的特性,只要刷新的够快,我们看到的就是光立方整体都在亮。便实现了我们想要的效果。为了画面的稳定,上面间隔点亮t要保持一致,否则会出现亮度不均的情况。

在实际使用上述电路的时候,最好给74hc573输出的64个引脚分别加一个限流电阻,这样能起到很好的二极管保护作用和整体功耗的限制以及亮度的调节。

仔细分析上述控制过程,可以发现进一步节约IO口的数量方法。

以16TImes;16的整列为例,若限定16列中,每次只亮一列,就可以用4根IO线加一个4~16译码器替代。这样,就变为16+4只有20个IO口了。而行还是保留16根,因为这样做,可以一次控制1列中的多个LED同时亮。加快扫描进度。


基于74hc573的8*8*8光立方电路图

以上原理有了,可以开始动手了


下面我们来搭建光立方的点阵部分,

步骤:

1,先把512个LED,负级全部弯成90度

2,摆到搭建模版上,进行负极与负极间的焊接,一共是8列。

3,歪曲正极90度,进焊接,一共7列。

到这LED的点阵列就焊接完成了,像这样的阵列一共要8片。


把LED插的模具上,将LED的负极弯成90度,备用等待焊接,一共要512个。


====》


所有的LED全部变成这样。


把弯好的LED像图上摆在模具上。

摆好后,准备进行焊接。

LED的焊接,把2个LED的负极焊接在一起。注意焊接时候速度要快,要不然温度会损害LED.还有就是LED的负极不要碰到正极。

焊接好的LED负极。要焊接这样的LED,为8列

LED阵列

焊接完成,8列LED。下面准备焊接,LED的正极。

用一个高大约,5MM的尺子。用来垫在LED下面方便,弯曲LED正极的引脚。

把高5MM的尺子插到LED阵列里,用按住LED另外一只手弯曲LED的正极。

注意的是弯曲的正极,要和负极间有一定的距离。

将全部的正极弯曲成90度,至于负极的上层。注意!只要弯曲7列就可以了最后一列不用弯曲。(最后用来连接层用的)

焊接LED,正极与正极。

制作好8片,LED阵列。

最后的组装搭建。

1测试焊接好的8点阵。

2把点阵插到底板上。

3连接层。

4用导电连接层与底板。

我这里把1步和2步测试和插上底板一起完成,

直接把,焊接好的LED点阵,插到底板上,然后上电测试。

红色的向下的箭头为LED的竖也就是LED的阴极,全部插在板上。

图上示例插了1片,搭建把剩下的8片全部插好。就变成下面图的样子。

剩下的就全部都是LED阳极了。看下图

绿色的线表示把层的阳极全部焊接起来。(就是刚刚插好的8片剩下的阳极)

全部焊接后会剩下最左边的一排多余脚剪了就可以了。

层全部焊接好后,要进行层共阳的连接。

底板与层阳极之间的连接。黑色的是我们连接时用的导线,红色是我们画的给大家示意用的。

层的连接是有顺序的从电源口这边为最高层,依次向下,用导线把底板和层连接起来。每个层对应一个铜柱。

下午是我们连接好层线,和把最后一排多余剪掉图:

这样就完成了整个光立方的搭建了。

物理层面处理完毕,我们就得开始写代码了:

defineuintunsignedint

uchardisplay[8][8];

/*rank:A,1,2,3,4,I,心,U*/

ucharcodetable_cha[8][8]={0x51,0x51,0x51,0x4a,0x4a,0x4a,0x44,0x44,0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x3c,0x3c,0x66,0x66,0x30,0x18,0xc,0x6,0xf6,0x3c,0x66,0x60,0x38,0x60,0x60,0x66,0x3c,0x30,0x38,0x3c,0x3e,0x36,0x7e,0x30,0x30,0x3c,0x3c,0x18,0x18,0x18,0x18,0x3c,0x3c,0x66,0xff,0xff,0xff,0x7e,0x3c,0x18,0x18,0x66,0x66,0x66,0x66,0x66,0x66,0x7e,0x3c};

/*the"ideasoft"*/

ucharcodetable_id[40]={0x81,0xff,0x81,0x00,0xff,0x81,0x81,0x7e,0x00,0xff,0x89,0x89,0x00,0xf8,0x27,0x27,0xf8,0x00,0x8f,0x89,0x89,0xf9,0x00,0xff,0x81,0x81,0xff,0x00,0xff,0x09,0x09,0x09,0x01,0x0,0x01,0x01,0xff,0x01,0x01,0x00};

/*railway*/

ucharcodedat[128]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x6f,0x8f,0x93,0x73,0x6f,0x8f,0x93,0x73,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};

/*railway2*/

ucharcodedat2[28]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};

/*railway3*/

ucharcodedat3[24]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x16,0x26,0x36,0x46,0x56,0x66,0x65,0x64,0x63,0x62,0x61,0x60,0x50,0x40,0x30,0x20,0x10};

/*3pchar*/

ucharcodetable_3p[3][8]={0xff,0x89,0xf5,0x93,0x93,0xf5,0x89,0xff,0x0e,0x1f,0x3f,0x7e,0x7e,0x3f,0x1f,0x0e,0x18,0x3c,0x7e,0xff,0x18,0x18,0x18,0x18};

/*initializtion

Thatistoinitializetheprogram.

Itiswritetosetthetimerinc52mcu.

Sotheprogramcanrenovatetheled_3d_cubeinfixedtimeusetheinterruptfunction.*/

voidsinter()

{

IE=0x82;

TCON=0x01;

TH0=0xc0;

TL0=0;

TR0=1;

}

voiddelay5us(void)//误差-0.026765046296

{

unsignedchara,b;

for(b=7;b0;b--)

for(a=2;a0;a--);

}

voiddelay(uinti)

{

while(i--){

delay5us();}//12t的mcu注释这个延时即可

}

/*Tojudgethenumbit*/

ucharjudgebit(ucharnum,ucharb)

{

}

/*Tofigureouttheroundnumber*/

ucharabs(uchara)

{

}

/*Tofigureouttheabsolutevalue*/

ucharabss(chara)

{

}

/*Thefunctioncancomparatthecharacter.

Andremovethebigonetotheback.*/

voidmax(uchar*a,uchar*b)

{

}

/*Thefunctionistofigureoutthemaxnumberandreturnit.*/

ucharmaxt(uchara,ucharb,ucharc)

{

}

voidclear(charle)

{

}

voidtrailler(uintspeed)

{

}

voidpoint(ucharx,uchary,ucharz,ucharle)

{

}

voidtype(ucharcha,uchary)

{

}

/*Thefirstvariableisthedistancefromthemidpoint.

Thesecondisthelayer.

thethirdistheflashspeedofthetimebetweeneachtwopoint.

Theforthistheenableio,itcontrolsweatherdraworclaen.*/

voidcirp(charcpp,uchardir,ucharle)

{

}

voidline(ucharx1,uchary1,ucharz1,ucharx2,uchary2,ucharz2,ucharle)

{

}

voidbox(ucharx1,uchary1,ucharz1,ucharx2,uchary2,ucharz2,ucharfill,ucharle)

{

}

voidbox_apeak_xy(ucharx1,uchary1,ucharz1,ucharx2,uchary2,ucharz2,ucharfill,ucharle)

{

}

voidpoke(ucharn,ucharx,uchary)

{

}

voidboxtola(chari,ucharn)

{

}

voidrolldisplay(uintspeed)

{

}

voidroll_apeak_yz(ucharn,uintspeed)

{

}

voidroll_apeak_xy(ucharn,uintspeed)

{

}

voidroll_3_xy(ucharn,uintspeed)

{

}

voidtrans(ucharz,uintspeed)

{

}

voidtranoutchar(ucharc,uintspeed)

{

}

voidtransss()

{

}

/*Fromnowon,thefunctionbelowistodisplaytheflash.*/

voidflash_1()

{

}

voidmain()

{

sinter();

while(1){

//clear(0);

/*playlist*/

//flash_1();

clear(0);

flash_2();

flash_3();

flash_4();

flash_4();

flash_5();

flash_5();

flash_6();

flash_7();

flash_8();

flash_9();

flash_10();

clear(0);

flash_11();

flash_9();

flash_5();

flash_7();

flash_5();

flash_6();

flash_8();

flash_9();

flash_10();

}

}

//P0;//573in

//P1;//uln2803

//P2;//573LE

voidprint()interrupt1

{

uchari;

staticucharlayer=0;

P1=0;

for(i=0;i8;i++)

{

P2=1i;

delay(3);

P0=display[layer][i];

delay(3);

}

P1=1layer;

if(layer7)

layer++;

else

layer=0;

TH0=0xc0;

TL0=0;

}

一般不是很喜欢贴代码,这部分太占地方,我把代码简化了,能看个大概的意思吧,具体有需要的朋友,咱们单独再发。

有了代码,后面就可以开始各种测试了

当然,对于学技术的我们,更要注重DIY的作品本身的知识。(温馨提示:焊接的过程中要注意烙铁的温度以及焊接时间,LED很容易坏,要不断的测试,别等全都焊好了却发现里面有坏的LED,修起来很费事的)

节选一段高难度的动画作为收尾

(注:素材来自网络,希望整理后对朋友有所帮助。)

发布于 2025-04-21
41
目录

    推荐阅读