光立方由若干個二極管led燈以立方體形式搭建,4*4*4、8*8*8、16*16*16甚至更多,又由單片機、鎖存器、譯碼器等電器元件驅(qū)動,形成立體動畫效果。其中8*8*8光立方最為常見。
例如:8*8*8光立方是由512個發(fā)光二極管按照立方體的方式搭建焊接起來的,有層共陰束共陽和層共陽束共陰兩種方案,每一層有8*8個發(fā)光二極管,共8層。用c語言編譯單片機程序使自定義動畫效果得以實現(xiàn)。
光立方工作原理
光立方簡單講就是用單片機控制很多規(guī)則排列的led的亮和滅。
1、單個led的控制方式
先了解單個led的控制方式,可以是將正極接電源,負極通過一個限流電阻連接至單片機的某個io口。io口輸出低電平時,led就亮,反之,led滅。
如果我們想驅(qū)動任意位置的led,我們只需要在該位置led所使用的列線接地,行線接上+v即可。
學過單片機的朋友們,都知道數(shù)碼管是怎么點亮的,其中有位選和段選之分,通過掃描來實現(xiàn)所有數(shù)碼管能正常工作以實現(xiàn)顯示我們想要的數(shù)字。
點陣也一樣,盡管是8*8的點陣,如果我們讓整體能隨意顯示圖案,那也需要用掃描的方式才能夠?qū)崿F(xiàn),否則,無法實現(xiàn)對其精準的控制。
所謂掃描,就是說,我們一次只能讓一行排或者一豎排的燈亮。每次只能這么點,8次為一個周期,從左至右依次點一次,那么循環(huán)起來,我們看到的就是完整的圖像了。
2、每一層led的控制方式
若按照單個led的控制方式,每個led需要占用單片機的一個io口,控制100個led就需要100個io口。那么,有沒有一種方式,可以用較少的io口,控制較多的led呢?答案是肯定的,這種方法,就是掃描驅(qū)動電路。
2*2掃描驅(qū)動電路
所以一般情況下,光立方的每一層雖然有64個燈,但是我們會有64跟線分別連接到這些燈上,從而實現(xiàn)一次性的對64個燈進行控制,通常單片機引腳較少,一般將采用74hc573,74hc595等芯片進行拓展。
3、(基于74hc573的)8*8*8光立方led的控制方式
數(shù)據(jù)通過并行的方式,分別打入每一個74hc573中,再控制器儲存這些數(shù)據(jù),從而實現(xiàn)一層64個燈同時的點亮。下面描述一下一個固定畫面的顯示,所需要硬件執(zhí)行的過程。
1)將第一層64個點的數(shù)據(jù)傳入8個74hc573中,控制uln2803層控制芯片打開第一層開關(guān),使第一層點亮,這個時候,其他層是滅的。
2)等待時間t。
3)熄滅第一層,開始向74hc573中傳輸?shù)诙拥臄?shù)據(jù),鎖存,開啟第二層總控制開關(guān),點亮第二層。
4)等待時間t。
。。。
熄滅第一層,將第八層的的數(shù)據(jù)傳進所有74hc573中,鎖存,開啟第八層總開關(guān),點亮第八層。
再回到第一步,循環(huán)下去。。
這樣,便實現(xiàn)了一個周期畫面的顯示,由于人眼的視覺暫留的特性,只要刷新的夠快,我們看到的就是光立方整體都在亮。便實現(xiàn)了我們想要的效果。為了畫面的穩(wěn)定,上面間隔點亮t要保持一致,否則會出現(xiàn)亮度不均的情況。
在實際使用上述電路的時候,最好給74hc573輸出的64個引腳分別加一個限流電阻,這樣能起到很好的二極管保護作用和整體功耗的限制以及亮度的調(diào)節(jié)。
仔細分析上述控制過程,可以發(fā)現(xiàn)進一步節(jié)約io口的數(shù)量方法。
以16×16的整列為例,若限定16列中,每次只亮一列,就可以用4根io線加一個4~16譯碼器替代。這樣,就變?yōu)?6+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列l(wèi)ed。下面準備焊接,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];
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};
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};
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};
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};
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};
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,0x18,0x18,0x18};
void sinter()
{
ie=0x82;
tcon=0x01;
th0=0xc0;
tl0=0;
tr0=1;
}
void delay5us(void) //誤差 -0.026765046296us 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 注釋這個延時即可
}
uchar judgebit(uchar num,uchar b)
{
}
uchar abs(uchar a)
{
}
uchar abss(char a)
{
}
void max(uchar *a,uchar *b)
{
}
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)
{
}
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(uchar c,uint speed)
{
}
void transss()
{
}
void flash_1()
{
}
void main()
{
sinter();
while(1){
// clear(0);
//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<8;i++)
{
p2=1<
delay(3);
p0=display[layer][i];
delay(3);
}
p1=1<
if (layer<7)
layer++;
else
layer=0;
th0=0xc0;
tl0=0;
}
一般不是很喜歡貼代碼,這部分太占地方,我把代碼簡化了,能看個大概的意思吧,具體有需要的朋友,咱們單獨再發(fā)。
有了代碼,后面就可以開始各種測試了
當然,對于學技術(shù)的我們,更要注重diy的作品本身的知識。(溫馨提示:焊接的過程中要注意烙鐵的溫度以及焊接時間,led很容易壞,要不斷的測試,別等全都焊好了卻發(fā)現(xiàn)里面有壞的led,修起來很費事的)
節(jié)選一段高難度的動畫作為收尾
來源:今日頭條
以上是網(wǎng)絡信息轉(zhuǎn)載,信息真實性自行斟酌。