標(biāo)題: 8*8*8光立方設(shè)計與制作教程 附單片機(jī)源碼 [打印本頁]
作者: wrx410968164 時間: 2018-11-10 20:43
標(biāo)題: 8*8*8光立方設(shè)計與制作教程 附單片機(jī)源碼
摘要
之前在網(wǎng)上看了一些光立方的演示視頻,被它那些立體感吸引了。想到自己學(xué)單片機(jī)也這么久了,于是乎就想做一個玩玩,同時可以復(fù)習(xí)一學(xué)期以來自己的編程能力和動手的能力,一舉兩得是一件很不錯的事情。向朋友要了一些資料,就開工了。
光立方顧名思義就是一個立方體,采用的是8*8*8的模式,整個立方大概是16cm*16cm*18cm(長.寬.高)的樣子,主要分為三個模塊:主控模塊、驅(qū)動模塊、顯示模塊;我所做的光立方,主控電路采用的主控芯片是STC12C5A60S2芯片,驅(qū)動電路是采用我們常用的74HC573數(shù)字芯片,以及ULN2803達(dá)林頓管。
電路原理圖:
圖1.電路原理圖
元件的選擇:
(1)由于光立方的程序量比較大,而且要求相對比較高,因此經(jīng)過考慮之后我們決定用51系列的增強(qiáng)型芯片STC12C5A60S2,選擇的理由:
1.無法解密,采用第六代加密技術(shù);
2.超強(qiáng)抗干擾;
3.內(nèi)部集成高可靠復(fù)位電路,外部復(fù)位可用可不用;
4.速度快,比8051快8-12倍;
(2)由于燈的個數(shù)比較多,因此所需要的電流相對也比較大,所以選擇ULN2803,ULN2803是八重達(dá)林頓,1 至 8腳為8路輸入,18 到 11腳為8路輸出。驅(qū)動能力 500MA \50V。應(yīng)用時9腳接地,要是驅(qū)動感性負(fù)載,10腳接負(fù)載電源V+。輸入的電平信號為0,或5V。輸入0是,輸出達(dá)林頓管截止。輸入為5V電平時,輸出達(dá)林頓飽和。輸出負(fù)載加在電源V+和輸出口上,當(dāng)輸入為高電平時,輸出負(fù)載工作;
(3)由于在剛剛接觸鎖存器的時候,就接觸了74HC573,對它的使用也比較成熟,因此在驅(qū)動部分使用了熟悉的74HC573,其優(yōu)點(diǎn)有:
1.高阻態(tài);就是輸出既不是高電平,也不是低電平,而是高阻抗的狀態(tài);在這種狀態(tài)下,可以多個芯片并聯(lián)輸出;
2.數(shù)據(jù)鎖存;當(dāng)輸入的數(shù)據(jù)消失時,在芯片的輸出端,數(shù)據(jù)仍然保持;
3.數(shù)據(jù)緩沖; 加強(qiáng)驅(qū)動能力;
(4)LED燈的選擇,出于外觀和整體的形狀美觀,個人推薦霧面藍(lán)光方型LED。但是由于當(dāng)時去電子市場沒有找到,最后用了霧面藍(lán)光草帽型的LED燈(結(jié)果問題也是出了一大堆)。
電路的組裝與焊接:
圖2.電路PCB圖
這是布線完成的PCB板子,由于之前選錯燈的原因,我后面又在每個573的輸出口加了1N4148二極管。原因是因?yàn)檫@種小燈的反向漏電流比較大,導(dǎo)致整個立方在不接負(fù)極的時候也會發(fā)光。加二極管之后,它們每個角輸出就都互不影響了。同時,每片573的數(shù)據(jù)口是分別并聯(lián)到P1口的,板子上沒有布線,在這里我是用單股導(dǎo)線一條一條連上去的。
下面是板子的制作過程:
圖3. 腐蝕好的PCB板子
這塊板子跟上面的PCB圖有點(diǎn)出入,圖2是我調(diào)試完成之后在修改的,而圖3是之前的版本做好的。
另外,沒有制作PCB板條件的朋友也可以自己用萬能板焊,就是麻煩一點(diǎn)。
圖4.準(zhǔn)備焊接材料
圖5.已焊好的PCB板底層
接下來我們要焊燈了。大工程。
首先,我們把燈準(zhǔn)備好,烙鐵熱上
圖6.準(zhǔn)備好的LED燈
圖7.準(zhǔn)備好的LED燈
在焊接之前,我覺得最好是檢測一下每一個燈是否會亮,不過也可以一排一排的測試,總之,一定要保證每個燈都會正常發(fā)光。
接下來,我們要對燈做一些工作:
圖8
我們把所有的LED燈的負(fù)極,也就是短的一角統(tǒng)一朝一個方向彎曲并與正極垂直如上圖所示。
圖9
我們可以借助一塊大一點(diǎn)的萬能板,用記號筆在每一個點(diǎn)做好標(biāo)記,然后把弄好的燈正極朝下穿過萬能板,再把這一排的燈的負(fù)極擺直了點(diǎn)上焊錫。如上圖所示。
圖10.焊接好的一排燈
圖11焊接好的一排燈
照這種方法把所有的燈焊成一排一排的。
接下來要仔細(xì)看了
圖12.焊接每一層
把焊接好的每一排凸出來的那個負(fù)極呢又統(tǒng)一朝著一個方向彎曲至90°,然后把每一排都按上圖的方式擺好,焊接。結(jié)果如下圖:
圖13
這時候有朋友會問了,這樣是不是不穩(wěn)啊,那你就把另外一端也用同樣的方法用粗一點(diǎn)的導(dǎo)線或者廢棄的元器件管腳連起來就好了。如下圖:
圖14
如此,把每一層都焊好。如下圖:
圖15.焊接好的每一層
接下來呢又要對每一層的正極做一下動作了。如下圖:
圖16
將每一層的正極的末端2mm左右向內(nèi)彎曲45°左右如上圖。留下最后一層不要動,作為最底層。然后用盡你所有的招式把每一層對應(yīng)的正極連起來。呵呵,也沒有什么好的方法推薦。下面是焊好的光立方:
圖17.18.焊接好的光立方
圖19
圖20
電路的調(diào)試和調(diào)試出現(xiàn)的問題:
完工以后抱著很激動的心情,編寫了調(diào)試的程序,主要是檢查全部的燈是否會亮,但是單把程序燒寫進(jìn)去之后,發(fā)現(xiàn)有兩列沒有點(diǎn)亮,還好兩列的都在邊上,進(jìn)而如果換燈也相對容易,我們用排除法來檢查電路,首先是檢查燈的線路是否虛焊,斷路,果真有一列的是斷路了,把它接上后這一列也亮了,還剩下另外一列,我們用同樣的方法來做,從驅(qū)動電路到顯示的都沒有問題,而且在輸入那一列的電壓也正常,我們就想不通了,是什么原因呢?我們懷疑是不是有燈壞了,我們又一個一個的檢查了這一列燈,但是全部都會亮,經(jīng)過很細(xì)心的檢查,發(fā)現(xiàn)有一個燈的亮度和其他的燈亮度完全不同,相對比較暗,于是我們把它換了下來,接上另外一個,果然是哪個燈的問題,原來是由于燈的阻抗很大,把那一列的電平都拉低了,使燈無法亮起來 ,在電路的調(diào)試中就出現(xiàn)了這些的問題,相對來說還是不錯的。另外由于之前沒有選好燈,經(jīng)過不斷分析問題,最后在74HC573的每一個輸出端都接一個二極管,問題才得以解決。
程序:
到這里我們的硬件就已經(jīng)大功告成了,接下來呢就是軟件了。由于源程序代碼有2000多行,這里我就不將源程序代碼做到文檔里,而是打包在同一文件夾下,大家可以用keil查看整個工程。本項目完成速度比較快,在整體的電路上可以完成一下基本的演示,由于電路的限制,花樣不是很多,還有待提高。
本文檔足夠讓你獨(dú)立完成一個光立方的制作,一點(diǎn)也不難,只是需要毅力和耐心而已。
最后你可以發(fā)揮想象,編輯你想要的花樣把程序?qū)戇M(jìn)drive.c,并且在drive.h里面聲明一下,最后就可以直接在主函數(shù)里面調(diào)用了。如果對C語言不是很了解的朋友可以請教一下別人,不懂就問,沒什么不好意思的。這也是我的學(xué)習(xí)風(fēng)格。最后希望我們一起學(xué)習(xí)、一起進(jìn)步。
鄭重聲明:此文檔僅供學(xué)習(xí)參考,如有雷同,純屬巧合。
視頻連接:http://v.youku.com/v_show/id_XNTg2NDcxMTQ0.html
單片機(jī)源程序如下:
- #include "STC.h" //STC12C5A60S2頭文件
- #include "MyType.h" //常用數(shù)據(jù)類型定義
- #include "Drive.h" //LED驅(qū)動頭文件
- #include "Delay.h" //延時函數(shù)頭文件
- #include "picture.h" //字模數(shù)據(jù)
- //int flag=0,flag1=0,a=0;
- void LEDIO_Init();
- //void PWM_init ();
- //void PWM0_set (uint8 set);
- //void Timer_INT();
- void main()
- {
- uint8 i;
- LEDIO_Init();
- //PWM_init();
- //Timer_INT();
-
- /* while(flag == 0)
- {
- WAIT_LOG();
- } */
-
- while(1)
- {
- for(i=0;i<3;i++)
- DOT_PWM(0,7,0,120);
- for(i=0;i<2;i++)
- {
- CUBE_LOG1();
- CUBE_LOG2();
- CUBE_LOG3();
-
- if(i==0)
- {
- LOG11();
- LOG5();
- }
- if(i==1)//scanf face
- {
- LOG6();
- LOG7();
- CUBE_LOG4();
- LOG8();
- LOG9();
- CUBE_LOG5();
- shalou1();
- catercorner();//邊角的三角形
- LOG5();
- }
- LOG1(); //small cube
-
-
- if(i==0)
- {
- CUBE_LOG6(NUM2,3);// 3 2 1
- CUBE_LOG13();//一二三四五六九一一
- CUBE_LOG7(CHAR_CUBE8,88);//cube8 TeanFoo
- CUBE_LOG7(CHAR_GLF,24);//光立方 3x8=24
- }
- if(i==1)
- {
- CUBE_LOG6(NUM1,3);//i love u
- CUBE_LOG7(CHAR_DZXH,32);//電子協(xié)會 4x8=32
- }
- if(i==0)
- shalou();
- if(i==1)
- LOG12();
- LOG10();
- CUBE_LOG8();//螺旋上升
- LOG3(); //前后面
- CUBE_LOG9();//雨過天晴
- CUBE_LOG10();//音樂律動
- CUBE_LOG11();//豎直表面順時針環(huán)繞
- CUBE_LOG12();//橫向表面逆時針環(huán)繞
-
- if(i==0)
- {
- LOG4();
- LIST_LOG(); //
- LOG13();
- lightbug();
- }
-
- if(i==1)
- {
- CUBE_LOG7(CHAR_SNTU,136);//通信與電子學(xué)院 電子協(xié)會20周年 330
- LOG2(4,4);
- FIRE(1,2);
- FIRE(3,3);
- LOG2(3,4);
- FIRE(6,3);
- FIRE(2,5);
- LOG2(4,3);
- FIRE(3,5);
-
- CUBE_LOG7(CHAR_OFF,18);//OFF
- LAST_LOG();
- }
- }
- }
- }
- void LEDIO_Init()
- {
- P0M0 = 0xff;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x01;
- P2M0 = 0xff;
- P2M1 = 0x00;
- P3M0 = 0xff;
- P3M1 = 0x00;
-
- X = 0xff;//鎖存
- Y = 0x00;//數(shù)據(jù)
- X = 0x00;
- Z = 0x00;//平面
- }
- /*
- void PWM_init () //PWM初始化函數(shù),PWM模式,接P1.3接口(PWM0),強(qiáng)上拉.
- {
- CMOD=0x00; //設(shè)置PCA定時器0x00~0x03;
- CL=0xef;
- CH=0xef;
- CCAPM0=0x42; //PWM0設(shè)置PCA工作方式為PWM方式(0100 0010)
- CCAP0L=0xef; //設(shè)置PWM0初始值與CCAP0H相同
- CCAP0H=0xff; // PWM0初始時為0
-
- CR=1; //啟動PCA定時器
- }
- void PWM0_set (uint8 set) //PWM0占空比設(shè)置函數(shù) (0x00~0xFF)
- {
- CCAP0L= set; //設(shè)置值寫入CCAP0L
- CCAP0H= set; //設(shè)置值寫入CCAP0H
- }
- void Timer_INT()
- {
- TMOD = 0x11; //高4位控制T/C1
- EA = 1; //開總中斷
- TH1 = 0x00; //16位計數(shù)寄存器T1高8位
- TL1 = 0x00; //16位計數(shù)寄存器T1低8位
- ET1 = 1; //T/C1中斷開
- //TR1 = 1; //T/C1啟動
- TR1 = 0; //T/C1關(guān)閉
- }
- void LED_PWM() interrupt 3
- {
- // static uint16 x=0;
- // static uint8 flag1=1;
- TL1 = 0x55; //重裝定時計數(shù)器
- TH1 = 0xe0;
- if((P1&0x02) == 0)
- {
- Delayms(10);
- if((P1&0x02) == 0)
- {
- flag1 = 1; //按下標(biāo)志
- }
- }
- if(((P1&0x04) == 0) && flag1) //觸摸按鍵被觸摸
- {
- a++; //觸摸按鍵消抖
- if((a==20) && ((P1&0x04) == 0) && flag1) //觸摸按鍵的確被觸摸
- {
- flag++; //菜單切換
- if(flag == 4) flag = 0;
- flag1 = 0;
- a=0;
- }
- }
- else if((P1&0x04) !=0)
- a=0;
- if(flag1)
- {
- if(++x==0xff)
- flag1=0;
- }
- else
- {
- if(--x==0x00)
- flag1=1;
- }
- PWM0_set(x);
- }
- */
復(fù)制代碼
所有資料51hei提供下載:
光立方設(shè)計與制作.zip
(10.07 MB, 下載次數(shù): 319)
2018-11-10 20:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者: ifree8 時間: 2019-1-22 15:18
好漂亮。!
作者: 陳英俊 時間: 2019-9-28 11:25
支持支持 我也想做一個
作者: zyz1752217085 時間: 2019-10-8 21:29
獨(dú)特的特點(diǎn)
作者: 1421217367 時間: 2019-10-10 22:30
帥到爆炸,感覺可以加一個小喇叭來個藍(lán)牙模塊放個音樂啥的
作者: jvsoft 時間: 2019-10-11 11:09
我也想做一個,下來學(xué),謝謝
作者: saher 時間: 2019-10-25 07:52
支持支持!
作者: wang411576401 時間: 2019-11-7 23:36
我也想做一個,挺好看的
作者: 盧本偉沒有開掛 時間: 2019-12-29 09:54
沒有PCB啊
作者: ybr 時間: 2020-12-2 18:03
需要幾個單片機(jī)幾個鎖存器幾個達(dá)林頓管啊
還有是買貼片的還是直插的
作者: nlming 時間: 2020-12-5 21:24
學(xué)習(xí)一下,有空時做一個
作者: 斬蔥 時間: 2021-1-20 14:55
我也想做
作者: zxopenljx 時間: 2021-1-24 16:37
8*8*8光立方設(shè)計與制作教程 附單片機(jī)源碼
作者: dugunanahai 時間: 2021-2-3 21:49
正在尋找光立方資料,謝謝啦
作者: 960430328 時間: 2021-2-7 23:02
剛好符合我的心意 謝謝
作者: tang_yy 時間: 2021-4-18 18:56
感謝樓主,不知道現(xiàn)在學(xué)還有沒有用
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |