基于51的光立方制作
生活随笔
收集整理的這篇文章主要介紹了
基于51的光立方制作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 單片機入門者必然會從點亮一盞LED燈開始,如果LED數量比較多,就不能使用單個引腳去控制,例如光立方,利用鎖存器和人體的視覺暫留效果就可以占用少量引腳實現光立方。
? 所需材料:STC89C52一個、12MHz晶振一個、30pF瓷片電容兩個、按鍵開關一個、10K色環電阻一個、10uF電解電容一個、10K九腳排阻一個、74HC573鎖存器九個、LED燈512個、洞洞板、焊錫絲、導線。
? 電路結構:每一個燈板有64個LED燈,橫向共陰,縱向共陽,各燈板同一行的共陰端連接在一起。單片機P0端與9個573的輸入端連接在一起,一個573的輸出端與8個燈板的同行共陰端對應連接,另外8個573各與每個燈板的共陽端對應連接,一個573的使能端與P1.0連接,另外8個573的使能端與P2對應連接。
? 電路分析:先從P0口給控制共陰端的573送入相應數據,再給控制共陽端的573送入相應數據,各個LED的高低電平對應就點亮相應的燈了,用動態掃描的方式就可以出現動態效果。
附上代碼:
#include<reg51.h> #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換 sbit line_LATCH=P1^0;//定義鎖存使能端口 行掃描的鎖存端口 sbit LATCH1=P2^0;//定義鎖存使能端口 第一燈板的字節鎖存 sbit LATCH2=P2^1; sbit LATCH3=P2^2; sbit LATCH4=P2^3; sbit LATCH5=P2^4; sbit LATCH6=P2^5; sbit LATCH7=P2^6; sbit LATCH8=P2^7;void Delay(unsigned int t) {while(--t); } unsigned char line[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 顯示行值01234567 //顯示程序 void display(unsigned char *Data) {unsigned char i;for(i=0;i<8;i++){DataPort=line[i]; //先給行(燈板的公共端)輸入數據line_LATCH=1; //打開鎖存,把數據line[i]放進去line_LATCH=0; //關閉鎖存,阻止外部數據進來DataPort=Data[i]; //把數組Data[0~7]里的值依次傳給第一燈板的573鎖存器中LATCH1=1;LATCH1=0;DataPort=Data[8+i];LATCH2=1;LATCH2=0; DataPort=Data[16+i];LATCH3=1;LATCH3=0; DataPort=Data[24+i];LATCH4=1;LATCH4=0;DataPort=Data[32+i];LATCH5=1;LATCH5=0; DataPort=Data[40+i];LATCH6=1;LATCH6=0; DataPort=Data[48+i];LATCH7=1;LATCH7=0; DataPort=Data[56+i];LATCH8=1;LATCH8=0;Delay(200); //掃描間隙延時,時間太長會閃爍,太短會造成重影 DataPort=0xff; // 清空行鎖存器里數據,防止出現亂碼line_LATCH=1;line_LATCH=0;} } //點亮所有燈 void light() {unsigned int i;for(i=0;i<5000;i++){DataPort=0x00;line_LATCH=1;line_LATCH=0; DataPort=0xff; //把0xff送進鎖存器1~8中,使它們的輸出引腳都輸出高電平,與行鎖存器的0x00相對,點亮所有的燈LATCH1=1;LATCH1=0;LATCH2=1;LATCH2=0; LATCH3=1;LATCH3=0; LATCH4=1;LATCH4=0;LATCH5=1;LATCH5=0;LATCH6=1;LATCH6=0;LATCH7=1;LATCH7=0;LATCH8=1;LATCH8=0;} } //熄滅所有燈 void dark() {unsigned int i;for(i=0;i<5000;i++){DataPort=0x00; line_LATCH=1;line_LATCH=0; DataPort=0x00; LATCH1=1;LATCH1=0;LATCH2=1;LATCH2=0; LATCH3=1;LATCH3=0; LATCH4=1;LATCH4=0;LATCH5=1;LATCH5=0;LATCH6=1;LATCH6=0;LATCH7=1;LATCH7=0;LATCH8=1;LATCH8=0;} } void fb() {unsigned char i;unsigned char code fb0[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//定義空間為64的數組并賦值,用以傳遞給顯示子程序0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};unsigned char code fb1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char code fb2[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};unsigned char code fb3[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char code fb4[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char code fb5[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char code fb6[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned char code fb7[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};for(i=0;i<10;i++) display(fb0);//調用顯示子程序display,并把數組fb0的數組名作為實參傳給指針式形參for(i=0;i<10;i++) display(fb1);for(i=0;i<10;i++) display(fb2);for(i=0;i<10;i++) display(fb3);for(i=0;i<10;i++) display(fb4);for(i=0;i<10;i++) display(fb5);for(i=0;i<10;i++) display(fb6);for(i=0;i<10;i++) display(fb7);for(i=0;i<10;i++) display(fb7);for(i=0;i<10;i++) display(fb6);for(i=0;i<10;i++) display(fb5);for(i=0;i<10;i++) display(fb4);for(i=0;i<10;i++) display(fb3);for(i=0;i<10;i++) display(fb2);for(i=0;i<10;i++) display(fb1);for(i=0;i<10;i++) display(fb0); } void main() {unsigned char i;while(1){ for(i=0;i<2;i++) fb();for(i=0;i<20;i++) light();for(i=0;i<20;i++) dark();} }
總結
以上是生活随笔為你收集整理的基于51的光立方制作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(2769):发送网络请求
- 下一篇: 服务器bios界面usb无线网卡,修改B