光立方完全解析
?????? 轉載請注明出處:http://blog.csdn.net/ruoyunliufeng/article/details/37903899
?????? 這個4*4*4的三色光立方是我在初學單片機的時候做的一個小項目。很適合給初學單片機和C語言的同學練手,而且效果很炫。今天再看此代碼有很多不規范之處,但由于硬件已經送人,沒法繼續調試,希望小伙伴們引以為戒。寫此文主要是想讓大家知道其中的原理,知道怎么做固然重要,更重要的是知道為什么要這樣做。
??????? 效果展示:http://v.youku.com/v_show/id_XNjAyMTkwODE2.html
一.總述
??????? 光立方是什么?光立方其實就是將點陣折疊起來然后再立起來。初學單片機完全可以按照這個思路:點亮一個小燈->點亮流水燈->點陣顯示->點亮光立方。這其中是存在著聯系的,下面我來說說這其中的原理。
???????? 點亮一個小燈:沒什么好說的,控制一個IO為高低電平。
??????????? 點亮流水燈:這個也簡單,就是控制幾個IO的的高低電平唄。
?????????????? 點陣顯示 :這個看似有難度,其實也不難,核心就是一個字“掃”,首先知道字模的數據,然后先顯示一列,再以極短的時間顯示下一列,知道整個點陣顯示完。由于人眼的暫留效應,會看起來是靜態的。其實LCD和它也類似,這個暫且先不說。
???????????? 點亮光立方:為什么我說光立方是折疊起來然后再立起來的點陣呢?這個先賣個關子,等講完硬件之后你自然會明白。其實原理和點陣差不多的。
二.硬件
????????? 說先說下,當時因為這個電路設計實在簡單,并沒有畫原理圖,直接上來就拿洞洞板子焊的。你可以先畫個圖,但其實真不用畫圖。
??? 1.單片機
?????????? 建議選用51系列的STC12C5A60S2-35I-PDIP40單片機,因為用89C51輸出電流不足要加三級管擴流(PNP三極管做開關管),我當初就是這么做的,給我帶來很多麻煩,而且也不美觀。希望小伙伴們吸取教訓。最小系統怎么搭建我就不說了,應該都會把。
???? 2.雙色LED
?????????? 雙色LED就是有三個引腳。其中一個引腳是地其余兩個是LED的引腳。能顯示三種顏色。其實完全可以換證七彩的LED就是有四個引腳的那種,那樣效果更炫,單片機的引腳是夠用的。只是現在沒有時間玩了,呵呵,有興趣的小伙伴們可以自行嘗試。
???? 3.點陣變身光地方
?????????? 好了到現在是該說說,怎要把點陣折疊然后再立起來了。這里我貼幾張圖片,讓我們來看看制作過程,我想大家能有深刻的了解。
???????????? 看了上面的圖片,你應該明白我為什么這么說了。好了,下面我說說怎樣具體怎么做
?這個是最基礎的元素,需要做出16個這個東東,這個東東陽極都是相連的,陰極引出來,和下一個單元相連。
一個豎著的面就這樣出來了
四個這個面,按照第一個圖連,就OK了。
三.軟件
??? 1.軟件框架
????????? 說實話當年做的時候什么東東,只知道,每個單片機程序里面都有個while(1)。哈哈,我寫的這個光立方程序主要就是在while(1)里面循環各種現實效果。
void main() {while(1){hongbegin(); //紅由亮到暗hongend(); //紅由暗道亮P2=0XFF; //將P2關閉以免影響下面黃色燈效果huangbegin(); //黃呼吸燈huangend();chengsedeng(); //橙色燈 huangsebianhongse(); //黃色變紅色miansheng() ; //面上升mianjiang() ; //面下降mianzuodaoyou();//面左到右;mianyoudaozuo(); //面從右到左shuidi() ; //模仿水滴效果(從嘴上一排下落)luoxuansheng() ; //螺旋上升luoxuanjiang() ; //螺旋下降pingheng() ; //平衡木yinxiangshang() ; //音響效果上下yinxiangzuo() ; //音響效果左右sxingsaomian() ; //S形掃面litixuanzhuan(); //立體旋轉zuoshangliang() ; //左上角一點到全體亮sijiaoneishou() ; //四角向內收shuidijiandong() ; //仿水滴濺動shuibo() ; //仿水波浪feiji() ; //仿飛機飛行chaojimali() ; //超級瑪麗chengsedeng(); //橙色燈huangbegin(); //黃呼吸燈huangend(); hongend(); //紅由暗道亮 hongbegin(); //紅由亮到暗 jiesu(); //結束函數} }???? 2.呼吸燈
??????????? 說是呼吸燈,漸亮、漸滅的,說的那么高大上,其實就是PWM,再說的土一點就是控制一個周期內的導通時間,周期內的導通時間逐漸增加,自然就越來越亮。逐漸減小,自然就越來越暗,直到完全熄滅。這個東西如果你用STC12來說的話,其實可以非常簡單,就是一個D/A轉換。將數字信號,轉換成模擬信號。當然我那個時候還不太懂這些,直接用的89C52,52是沒有D/A轉換芯片的,我用的軟件模擬PWM,其實就是延時的原理。下面是實現的部分代碼。
/*P1為黃色,P2為紅色。?? ? P0為陰極*/uchar code table[]={?? ??? ??? ??? ??? ??? ??? ??? ??? ??? //呼吸燈專用 0,0,1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,27, 28,29,30,31,32,33,34,35,36, 37,38,39,40,41,42,43,44,45, 46,47,48,49,50,51,52,53,54, 55,56,57,58,59,60,61,62,63, 64,65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80,81,82, 83,84,85,86,87,88,89,90,91, 92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109, 110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141, 142,143,144,145,146,147,148,149,150,}; void delay(uint z) {uint x,y;for(x=5;x>0;x--)?? ??? ??? ??? ??? ?for(y=z;y>0;y--); } void hongbegin()? //全亮 呼吸滅 {int i;for(i=0;i<140;i++){honglight2(i);} P0=0x00;?? ??? ??? ?? //保持亮的狀態P2=0xff; P1=0xff; ?} void honglight2(uchar num2)?? ??? ??? ??? ??? ??? ?//由亮到滅?? ? (可以理解為亮的時間由長到短。滅的時間由短到長) {uchar j;P0=0xff;?? ??? ??? ??? ??? ? //首先關閉P0P2=0x00;?? ??? ??? ??? ??? ?? //打開P2j = table[num2];delay(j);?? ??? ??? ??? ??? ?? //延時?? (由短到長的)P0=0x00;?? ??? ??? ??? ??? ?? //打開P0叫它亮P2=0x00;delay(150-j);?? ??? ??? ??? ?? //延時由長到短 }????? 3.代碼講解
??????????? 首先我們知道,動畫是由圖片來快速播放形成的,光立方依靠的也是這個原理。
unsigned char code tabP0[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};? //低電平掃描?? ?,每次只讓亮一排(一個P0口) void mianjiang() ? {?? ?unsigned char code tabP2[3][8]={?? ??? ??? ??? ??? ?//定義數組 。儲存數據{0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF},{0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF},{0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF},};int j,k,i;?? ??? ??? ??? ??? ??? ??? ??? ??? ? //定義三個變量for(j=0;j<3;j++)?? ??? ??? ??? ??? ??? ??? ? //j圖像個數{?? ?for(k=0;k<20;k++)?? ??? ??? ??? ??? ??? ? //k為每個圖像存在時間、k越大單個圖像存在時間越長{?? ?for(i=0;i<8;i++)?? ??? ??? ??? ??? ?? //?? 每個圖像由八幀、構成{?? ?P2=0XFF;?? ??? ??? ??? ??? ??? ?? //? 此函數和消除殘留的陰影//P0=1;P0=tabP0[i];?? ?? ??? ??? ??? ??? ?? //將陰極P0取出P2=tabP2[j][i];?? ??? ??? ??? ??? ?? //將數組陽極取出P1=0XFF;?? ??? ??? ??? ??? ??? ?? //將P1關閉以免影響紅色效果ys(2);?? ??? ??? ??? ??? ??? ??? ??? //根據人眼暫留效應。。加大可看見整個亮燈過程、、減小即可顯示穩定圖像}}}?? ??? ? }全部代碼和取摸軟已經打包并且上傳。
下載地址: ?點擊打開鏈接
參考:取模軟件出處:http://user.qzone.qq.com/1323811540/blog/1376456811
總結
- 上一篇: 前端学习(2772):uni图片预览
- 下一篇: 工作99:任务加1逻辑