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