用简单的发光二极管做不简单的事888光立
光立方由若干个二极管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个灯进行控制,通常单片机引脚较少,一般将采取74hc57 ,74hc595等芯片进行拓展。
、(基于74hc57 的)8*8*8光立方led的控制方式
数据通过并行的方式,分别打入每一个74hc57 中,再控制器贮存这些数据,从而实现一层64个灯同时的点亮。下面描述一下一个固定画面的显示,所需要硬件履行的进程。
1)将第一层64个点的数据传入8个74hc57 中,控制uln280 层控制芯片打开第一层开关,使第一层点亮,这个时候,其他层是灭的。
2)等待时间t。
)熄灭第一层,开始向74hc57 中传输第二层的数据,锁存,开启第二层总控制开关,点亮第二层。
4)等待时间t。
。。。
熄灭第一层,将第八层的的数据传进所有74hc57 中,锁存,开启第八层总开关,点亮第八层。
再回到第一步,循环下去。。
这样,便实现了一个周期画面的显示,由于人眼的视觉暂留的特性,只要刷新的够快,我们看到的就是光立方整体都在亮。便实现了我们想要的效果。为了画面的稳定,上面间隔点亮t要保持一致,否则会出现亮度不均的情况。
在实际使用上述电路的时候,最好给74hc57 输出的64个引脚分别加一个限流电阻,这样能起到很好的二极管保护作用和整体功耗的限制和亮度的调节。
仔细分析上述控制过程,可以发现进一步勤俭io口的数量方法。
以16 16的整列为例,若限定16列中,每次只亮一列,就可以用4根io线加一个4~16译码器替换。这样,就变为16+4只有20个io口了。而行还是保存16根,因为这样做,可以一次控制1列中的多个led同时亮。加快扫描进度。
基于74hc57 的8*8*8光立方电路图
以上原理有了,可以开始动手了
(图片很多 ,打开需要时间 请耐心等待。。。)
下面我们来搭建 光立方的点阵部份,
步骤:
1,先把512个led,负级全部弯成90度
2,摆到搭建模版上,进行负极 与 负极间的焊接,一共是8列。
,曲解正极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把点阵插到底板上。
连接层。
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, ,4,i,心,u*/
uchar code table_cha[8][8]={0x51,0x51,0x51,0x4a,0x4a,0x4a,0x44,0x44,0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x c,0x c,0x66,0x66,0x 0,0x18,0xc,0x6,0xf6,0x c,0x66,0x60,0x 8,0x60,0x60,0x66,0x c,0x 0,0x 8,0x c,0x e,0x 6,0x7e,0x 0,0x 0,0x c,0x c,0x18,0x18,0x18,0x18,0x c,0x c,0x66,0xff,0xff,0xff,0x7e,0x c,0x18,0x18,0x66,0x66,0x66,0x66,0x66,0x66,0x7e,0x c};
/*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,0x c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x 9,0x 5,0x 1,0x2d,0x29,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x6f,0x8f,0x9 ,0x7 ,0x6f,0x8f,0x9 ,0x7 ,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,0x 9,0x 5,0x 1,0x2d,0x29,0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x c,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,0x c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};
/*railway */
uchar code dat [24]={0x00,0x01,0x02,0x0 ,0x04,0x05,0x06,0x16,0x26,0x 6,0x46,0x56,0x66,0x65,0x64,0x6 ,0x62,0x61,0x60,0x50,0x40,0x 0,0x20,0x10};
/* p char*/
uchar code table_ p[ ][8]={0xff,0x89,0xf5,0x9 ,0x9 ,0xf5,0x89,0xff,0x0e,0x1f,0x f,0x7e,0x7e,0x f,0x1f,0x0e,0x18,0x c,0x7e,0xff,0x18,0x18,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_ d_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_ _xy(uchar n,uint speed)
{
}
void trans(uchar z,uint speed)
{
}
void tranoutchar(uchar 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_ ();
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; //57 in
//p1; //uln280
//p2; //57 le
void print() interrupt 1
{
uchar i;
static uchar layer=0;
p1=0;
for (i=0;i
小孩流鼻血怎么办小儿便秘饮食注意什么
小儿脾胃虚弱饮食方
- 上一页:2019年二手车市场将向流通常态化智慧赋
- 下一页:柳工保持快速增长态势发展前景看好
-
江苏发布关键性提醒!
浙江热尔省成人教育监察院发布新闻了 浙江热尔省2022年普通高考考后警告 一...
2023-11-17
-
微软大受欢迎《壮志凌云 2:独行侠》联名款 Xbox Series S 主机
IT之家 5 月底 22 日传言,Google公司 Xbox 官推近日公布了一款《一部 2:麦奎尔...
2023-11-02
-
富国基金股权转让新进展:山东金融资产豪掷50.39亿元收购富国16.675%股权,回报率高达352.
安邦基金会16.675%持股受让方终于出炉! 之前青岛市国际性信托股份控股(简...
2023-10-30
-
李时珍的化铁丸,上调颈椎、中调腰椎、持续上升膝盖与脚后跟
今天这篇文章给大家聊聊西医是如何冷内藏;也水泡的?有这样一个方子,都...
2023-10-27
-
2022二级建造师《建设工程法律法规及相关知识》真题答案及解析
2022二级建造师《工程工程项目法规及之外经验》真题诗究竟及解 一、每项选...
2023-10-26
-
你养出的孩子是否甜蜜你,取决于你对这4件事的态度
铭 | 芒来佳丽 碰到一则让人啼笑皆非的取而代之闻网: 家住鄱阳的13岁陌生...
2023-10-23