摘要 之前在網(wǎng)上看了一些光立方的演示視頻,被它那些立體感吸引了。想到自己學(xué)單片機(jī)也這么久了,于是乎就想做一個(gè)玩玩,同時(shí)可以復(fù)習(xí)一學(xué)期以來(lái)自己的編程能力和動(dòng)手的能力,一舉兩得是一件很不錯(cuò)的事情。向朋友要了一些資料,就開(kāi)工了。 光立方顧名思義就是一個(gè)立方體,采用的是8*8*8的模式,整個(gè)立方大概是16cm*16cm*18cm(長(zhǎng).寬.高)的樣子,主要分為三個(gè)模塊:主控模塊、驅(qū)動(dòng)模塊、顯示模塊;我所做的光立方,主控電路采用的主控芯片是STC12C5A60S2芯片,驅(qū)動(dòng)電路是采用我們常用的74HC573數(shù)字芯片,以及ULN2803達(dá)林頓管。
電路原理圖:
圖1.電路原理圖 元件的選擇: (1)由于光立方的程序量比較大,而且要求相對(duì)比較高,因此經(jīng)過(guò)考慮之后我們決定用51系列的增強(qiáng)型芯片STC12C5A60S2,選擇的理由: 1.無(wú)法解密,采用第六代加密技術(shù); 2.超強(qiáng)抗干擾; 3.內(nèi)部集成高可靠復(fù)位電路,外部復(fù)位可用可不用; 4.速度快,比8051快8-12倍; (2)由于燈的個(gè)數(shù)比較多,因此所需要的電流相對(duì)也比較大,所以選擇ULN2803,ULN2803是八重達(dá)林頓,1 至 8腳為8路輸入,18 到 11腳為8路輸出。驅(qū)動(dòng)能力 500MA \50V。應(yīng)用時(shí)9腳接地,要是驅(qū)動(dòng)感性負(fù)載,10腳接負(fù)載電源V+。輸入的電平信號(hào)為0,或5V。輸入0是,輸出達(dá)林頓管截止。輸入為5V電平時(shí),輸出達(dá)林頓飽和。輸出負(fù)載加在電源V+和輸出口上,當(dāng)輸入為高電平時(shí),輸出負(fù)載工作; (3)由于在剛剛接觸鎖存器的時(shí)候,就接觸了74HC573,對(duì)它的使用也比較成熟,因此在驅(qū)動(dòng)部分使用了熟悉的74HC573,其優(yōu)點(diǎn)有: 1.高阻態(tài);就是輸出既不是高電平,也不是低電平,而是高阻抗的狀態(tài);在這種狀態(tài)下,可以多個(gè)芯片并聯(lián)輸出; 2.數(shù)據(jù)鎖存;當(dāng)輸入的數(shù)據(jù)消失時(shí),在芯片的輸出端,數(shù)據(jù)仍然保持; 3.數(shù)據(jù)緩沖; 加強(qiáng)驅(qū)動(dòng)能力; (4)LED燈的選擇,出于外觀和整體的形狀美觀,個(gè)人推薦霧面藍(lán)光方型LED。但是由于當(dāng)時(shí)去電子市場(chǎng)沒(méi)有找到,最后用了霧面藍(lán)光草帽型的LED燈(結(jié)果問(wèn)題也是出了一大堆)。
電路的組裝與焊接: 圖2.電路PCB圖 這是布線完成的PCB板子,由于之前選錯(cuò)燈的原因,我后面又在每個(gè)573的輸出口加了1N4148二極管。原因是因?yàn)檫@種小燈的反向漏電流比較大,導(dǎo)致整個(gè)立方在不接負(fù)極的時(shí)候也會(huì)發(fā)光。加二極管之后,它們每個(gè)角輸出就都互不影響了。同時(shí),每片573的數(shù)據(jù)口是分別并聯(lián)到P1口的,板子上沒(méi)有布線,在這里我是用單股導(dǎo)線一條一條連上去的。 下面是板子的制作過(guò)程: 圖3. 腐蝕好的PCB板子 這塊板子跟上面的PCB圖有點(diǎn)出入,圖2是我調(diào)試完成之后在修改的,而圖3是之前的版本做好的。 另外,沒(méi)有制作PCB板條件的朋友也可以自己用萬(wàn)能板焊,就是麻煩一點(diǎn)。 圖4.準(zhǔn)備焊接材料 圖5.已焊好的PCB板底層 接下來(lái)我們要焊燈了。大工程啊! 首先,我們把燈準(zhǔn)備好,烙鐵熱上 圖6.準(zhǔn)備好的LED燈 圖7.準(zhǔn)備好的LED燈 在焊接之前,我覺(jué)得最好是檢測(cè)一下每一個(gè)燈是否會(huì)亮,不過(guò)也可以一排一排的測(cè)試,總之,一定要保證每個(gè)燈都會(huì)正常發(fā)光。 接下來(lái),我們要對(duì)燈做一些工作: 圖8 我們把所有的LED燈的負(fù)極,也就是短的一角統(tǒng)一朝一個(gè)方向彎曲并與正極垂直如上圖所示。 圖9 我們可以借助一塊大一點(diǎn)的萬(wàn)能板,用記號(hào)筆在每一個(gè)點(diǎn)做好標(biāo)記,然后把弄好的燈正極朝下穿過(guò)萬(wàn)能板,再把這一排的燈的負(fù)極擺直了點(diǎn)上焊錫。如上圖所示。 圖10.焊接好的一排燈 圖11焊接好的一排燈 照這種方法把所有的燈焊成一排一排的。 接下來(lái)要仔細(xì)看了 圖12.焊接每一層 把焊接好的每一排凸出來(lái)的那個(gè)負(fù)極呢又統(tǒng)一朝著一個(gè)方向彎曲至90°,然后把每一排都按上圖的方式擺好,焊接。結(jié)果如下圖: 圖13 這時(shí)候有朋友會(huì)問(wèn)了,這樣是不是不穩(wěn)啊,那你就把另外一端也用同樣的方法用粗一點(diǎn)的導(dǎo)線或者廢棄的元器件管腳連起來(lái)就好了。如下圖: 圖14 如此,把每一層都焊好。如下圖: 圖15.焊接好的每一層 接下來(lái)呢又要對(duì)每一層的正極做一下動(dòng)作了。如下圖: 圖16 將每一層的正極的末端2mm左右向內(nèi)彎曲45°左右如上圖。留下最后一層不要?jiǎng)樱鳛樽畹讓印H缓笥帽M你所有的招式把每一層對(duì)應(yīng)的正極連起來(lái)。呵呵,也沒(méi)有什么好的方法推薦。下面是焊好的光立方: 圖17.18.焊接好的光立方 圖19 圖20
電路的調(diào)試和調(diào)試出現(xiàn)的問(wèn)題: 完工以后抱著很激動(dòng)的心情,編寫(xiě)了調(diào)試的程序,主要是檢查全部的燈是否會(huì)亮,但是單把程序燒寫(xiě)進(jìn)去之后,發(fā)現(xiàn)有兩列沒(méi)有點(diǎn)亮,還好兩列的都在邊上,進(jìn)而如果換燈也相對(duì)容易,我們用排除法來(lái)檢查電路,首先是檢查燈的線路是否虛焊,斷路,果真有一列的是斷路了,把它接上后這一列也亮了,還剩下另外一列,我們用同樣的方法來(lái)做,從驅(qū)動(dòng)電路到顯示的都沒(méi)有問(wèn)題,而且在輸入那一列的電壓也正常,我們就想不通了,是什么原因呢?我們懷疑是不是有燈壞了,我們又一個(gè)一個(gè)的檢查了這一列燈,但是全部都會(huì)亮,經(jīng)過(guò)很細(xì)心的檢查,發(fā)現(xiàn)有一個(gè)燈的亮度和其他的燈亮度完全不同,相對(duì)比較暗,于是我們把它換了下來(lái),接上另外一個(gè),果然是哪個(gè)燈的問(wèn)題,原來(lái)是由于燈的阻抗很大,把那一列的電平都拉低了,使燈無(wú)法亮起來(lái) ,在電路的調(diào)試中就出現(xiàn)了這些的問(wèn)題,相對(duì)來(lái)說(shuō)還是不錯(cuò)的。另外由于之前沒(méi)有選好燈,經(jīng)過(guò)不斷分析問(wèn)題,最后在74HC573的每一個(gè)輸出端都接一個(gè)二極管,問(wèn)題才得以解決。 程序: 到這里我們的硬件就已經(jīng)大功告成了,接下來(lái)呢就是軟件了。由于源程序代碼有2000多行,這里我就不將源程序代碼做到文檔里,而是打包在同一文件夾下,大家可以用keil查看整個(gè)工程。本項(xiàng)目完成速度比較快,在整體的電路上可以完成一下基本的演示,由于電路的限制,花樣不是很多,還有待提高。 本文檔足夠讓你獨(dú)立完成一個(gè)光立方的制作,一點(diǎn)也不難,只是需要毅力和耐心而已。 最后你可以發(fā)揮想象,編輯你想要的花樣把程序?qū)戇M(jìn)drive.c,并且在drive.h里面聲明一下,最后就可以直接在主函數(shù)里面調(diào)用了。如果對(duì)C語(yǔ)言不是很了解的朋友可以請(qǐng)教一下別人,不懂就問(wèn),沒(méi)什么不好意思的。這也是我的學(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ù)類(lèi)型定義
- #include "Drive.h" //LED驅(qū)動(dòng)頭文件
- #include "Delay.h" //延時(shí)函數(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é)會(huì) 4x8=32
- }
- if(i==0)
- shalou();
- if(i==1)
- LOG12();
- LOG10();
- CUBE_LOG8();//螺旋上升
- LOG3(); //前后面
- CUBE_LOG9();//雨過(guò)天晴
- CUBE_LOG10();//音樂(lè)律動(dòng)
- CUBE_LOG11();//豎直表面順時(shí)針環(huán)繞
- CUBE_LOG12();//橫向表面逆時(shí)針環(huán)繞
-
- if(i==0)
- {
- LOG4();
- LIST_LOG(); //
- LOG13();
- lightbug();
- }
-
- if(i==1)
- {
- CUBE_LOG7(CHAR_SNTU,136);//通信與電子學(xué)院 電子協(xié)會(huì)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定時(shí)器0x00~0x03;
- CL=0xef;
- CH=0xef;
- CCAPM0=0x42; //PWM0設(shè)置PCA工作方式為PWM方式(0100 0010)
- CCAP0L=0xef; //設(shè)置PWM0初始值與CCAP0H相同
- CCAP0H=0xff; // PWM0初始時(shí)為0
-
- CR=1; //啟動(dòng)PCA定時(shí)器
- }
- void PWM0_set (uint8 set) //PWM0占空比設(shè)置函數(shù) (0x00~0xFF)
- {
- CCAP0L= set; //設(shè)置值寫(xiě)入CCAP0L
- CCAP0H= set; //設(shè)置值寫(xiě)入CCAP0H
- }
- void Timer_INT()
- {
- TMOD = 0x11; //高4位控制T/C1
- EA = 1; //開(kāi)總中斷
- TH1 = 0x00; //16位計(jì)數(shù)寄存器T1高8位
- TL1 = 0x00; //16位計(jì)數(shù)寄存器T1低8位
- ET1 = 1; //T/C1中斷開(kāi)
- //TR1 = 1; //T/C1啟動(dòng)
- TR1 = 0; //T/C1關(guān)閉
- }
- void LED_PWM() interrupt 3
- {
- // static uint16 x=0;
- // static uint8 flag1=1;
- TL1 = 0x55; //重裝定時(shí)計(jì)數(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è)計(jì)與制作.zip
(10.07 MB, 下載次數(shù): 319)
2018-11-10 20:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|