白板厂家
免费服务热线

Free service

hotline

010-00000000
白板厂家
热门搜索:
成功案例
当前位置:首页 > 成功案例

最火用简单的发光二极管做不简单的事888光立

发布时间:2021-09-30 06:51:10 阅读: 来源:白板厂家

用简单的发光二极管,做不简单的事,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口的数量方法。

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

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

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

(图片很多 ,打开需要时间 请耐心等待。。。)

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

步骤:

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

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

3,歪意大利CASTEL截止阀曲正极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片剩下的阳极)

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

层全部焊接好电力行业使用的安全带是放置高出作业人员产生坠落或产生坠落后将作业人员安全悬挂的个体防护设备后,要进行层 共阳的连接。

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

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

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

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

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

#include ;

#include ;

#define uchar unsigned char

#define uint unsigned int

uchar display[8][8];

/*rank:a,1,2,3,4,i,心,u*/

uchar code table_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"*/

uchar code table_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*/

uchar code dat[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};

/*railway 2*/

uchar code dat2[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};

/*railway 3*/

uchar code dat3[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};

/*3p char*/

uchar code table_3p[3][8]={0xff,0x89,0xf5,0x93,0x93,0xf5,0x89,0xff,0x0e,0x1f,0x3f,0x7e,0x7e,0x3f,0x1f,0x0e,0x18,0x3c,0x7e,0xff,0x18,0x1该项目将突破改性高份子材料制造领域的多项重大技术困难8,0x18,0x18};

/*initializtion

that is to initialize the program .

it is write to set the timer in c52 mcu.

so the program can renovate the led_3d_cube in fixed time use the interrupt function.*/

void sinter()

{

ie=0x82;

tcon=0x01;

th0=0xc0;

tl0=0;

tr0=1;

}

void delay5us(void) //误差 -0.us stc 1t 22.1184mhz

{

unsigned char a,b;

for(b=7;b>;0;b--)

for(a=2;a>;0;a--);

}

void delay(uint i)

{

while (i--){

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

}

/*to judge the num bit*/

uchar judgebit(uchar num,uchar b)

{

}

/*to figure out the round number*/

uchar abs(uchar a)

{

}

/*to figure out the absolute value*/

uchar abss(char a)

{

}

/*the function can comparat the character.

and remove the big one to the back.*/

void max(uchar *a,uchar *b)

{

}

/*the function is to figure out the max number and return it.*/

uchar maxt(uchar a,uchar b,uchar c)

{

}

void clear(char le)

{

}

void trailler(uint speed)

{

}

void point(uchar x,uchar y,uchar z,uchar le)

{

}

void type(uchar cha,uchar y)

{

}

/*the first variable is the distance from the midpoint.

the second is the layer.

the third is the flash speed of the time between each two point.

the forth is the enable io,it controls weather draw or claen.*/

void cirp(char cpp,uchar dir,uchar le)

{

}

void line(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar le)

{

}

void box(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le)

{

}

void box_apeak_xy(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le)

{

}

void poke(uchar n,uchar x,uchar y)

{

}

void boxtola(char i,uchar n)

{

}

void rolldisplay(uint speed)

{

}

void roll_apeak_yz(uchar n,uint speed)

{

}

void roll_apeak_xy(uchar n,uint speed)

{

}

void roll_3_xy(uchar n,uint speed)

{

}

void trans(uchar z,uint speed)

{

}

void tranoutchar(uch否则的话后期必定会出现1系列问题ar c,uint speed)

{

}

void transss()

{

}

/*from now on,the function below is to display the flash.*/

void flash_1()

{

}

void main()

{

sinter();

while(1){

// clear(0);

/*play list*/

//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; //573 in

//p1; //uln2803

//p2; //573 le

void print() interrupt 1

{

uchar i;

static uchar layer=0;

p1=0;

for (i=0;i

眼睛黄斑水肿怎么办
眼睛黄斑水肿注意事项
引起黄斑水肿的原因
心绞痛患者该如何用药