光立方取模軟件怎么生成程序
1、3D8光立方取模軟件的視圖分為:正視圖,側視圖和俯視圖,取模時只需要在你想要的視圖上操作即可,不必管其他視圖的變化
代表光立方的三視圖分別是:正視圖,側視圖和俯視圖
2、用鼠標點擊8*8的小方格,白色代表點亮,灰色代表熄滅,數據會顯示在下面的hex顯示區內
這光立方的程序。0x0000這是什么東西?還有為什么還有數字相加?求解!謝謝。
0x0000是十六進制的零,數值上和0是一樣的,這樣寫只是為了以后程序維護方便而已。數字相加也是也是為維護方便,比如編程者的本意可以是:加數都是16(或24)告訴看程序的人基地址可能是16或24,被加數是偏移地址,一看就明白。
你好,作為一個單片機初學者,對光立方真心看不懂,可不可以詳細點介紹一下光立方怎么工作的,求程序參考
光立方簡單講就是用單片機控制很多規則排列的LED的亮和滅。
1、先了解單個LED的控制方式,可以是將正極接電源,負極通過一個限流電阻連接至單片機的某個IO口。IO口輸出低電平時,LED就亮,反之,LED滅。
2、若按照單個LED的控制方式,每個LED需要占用單片機的一個IO口,控制100個LED就需要100個IO口。那么,有沒有一種方式,可以用較少的IO口,控制較多的LED呢?答案是肯定的,這種方法,就是掃描驅動電路。
3、掃描驅動電路基本原理是利用人眼的視覺停留效應。以2×2掃描驅動電路為例對其工作原理進行簡述,有4LED,分為2行2列,電路如下(圖中省略了限流電阻):
當:
C1=x,C2=x,L1=1,L2=1時,全滅
C1=1,C2=0,L1=0,L2=1時,D11亮
C1=1,C2=0,L1=1,L2=0時,D12亮
C1=0,C2=1,L1=1,L2=1時,全滅
C1=0,C2=1,L1=0,L2=1時,D21亮
C1=0,C2=1,L1=1,L2=0時,D22亮
可見,通過控制C1、C2、L1、L2,可以使D11、D12、D21、D22的任意一個LED的亮滅,也可以使四個LED全滅。
用上述方式輪流點亮D11和D12,一次只亮一個,但是,若將輪換速度加快,每秒之內輪換50次以上,由于人眼的視覺停留效應,視覺效果上就是兩個LED同時亮。
這樣,通過控制C1、C2、L1、L2,可以控制全部LED的亮滅。
上述電路用4個IO口控制4個LED,與直接控制相比,并未節約IO口,但是,若將行和列的數量加大,變為16×16時,共256個LED,控制僅需32個IO口,也就是說,行列數越多,相比越節省IO口。
仔細分析上述控制過程,可以發現,還可以進一步節約IO口的數量。
以16×16的整列為例,若限定16列中,每次只亮一列,就可以用4根IO線加一個4~16譯碼器替代。這樣,就變為16+4只有20個IO口了。而行還是保留16根,因為這樣做,可以一次控制1列中的多個LED同時亮。加快掃描進度。
以上就是光立方的基本原理。熟悉其控制過程后,編寫程序并不難。
51單片機控制的共陽4*4*4光立方的程序
1、P0和P1連接16個LED陰極,一共64個燈。假設每豎著4個接一個管腳。
2、假設P0.3控制一豎排4個燈。先讓除第三層陽極其余都輸出低電平,除P0.3之外所有陰極輸出高電平。這時除要控制的燈,其他都熄滅了。
3、讓第三層輸出高電平,P0.3輸出低電平。你要控制的燈就量了。
52單片機 4*4*4光立方程序豎共陽層共陰 uln2803 573鎖存,跪求程序
/*******4*4*4的光立方,層共陰(P0^0~P0^3),列共陽(P1和P2口)*******/
#include<stdio.h>
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*****************************延時函數******************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<4000; j++);
}
void Delay1(unsigned int t)
{
while(--t);
}
/***************群體閃爍********************/
void flash_1() //全部
{
uchar i;
for(i=0;i<3;i++)
{
P0=0X00;
P1=0Xff;
P2=0Xff;
Delay(20);
P1=0X00;
P2=0X00;
Delay(20);
}
}
void flash_2() //粒閃
{
uchar i,m,n;
for(i=0;i<12;i++)
{
for(m=0;m<3;m++)
{
P0=0x05;
P1=0xaa;
P2=0xaa;
Delay(1);
P0=0x0a;
P1=0x55;
P2=0x55;
Delay(1);
}
for(n=0;n<3;n++)
{
P0=0x05;
P1=0x55;
P2=0x55;
Delay(1);
P0=0x0a;
P1=0xaa;
P2=0xaa;
Delay(1);
}
}
}
void flash_3() //框+立體米
{
uchar i,m,n;
for(i=0;i<7;i++)
{
for(m=0;m<3;m++)
{
P0=0x00;
P1=0x09;
P2=0x90;
Delay(1);
P0=0x06;
P1=0x9f;
P2=0xf9;
Delay(1);
}
for(n=0;n<3;n++)
{
P0=0x06;
P1=0x60;
P2=0x06;
Delay(1);
P0=0x09;
P1=0xf6;
P2=0x6f;
Delay(1);
}
}
}
void flash_4(uchar i,uchar j,uchar k) //柱體‘回’閃
{
P0=0x00;
P1=0x60;
P2=0x06;
Delay(i);
P1=0x9f;
P2=0xf9;
Delay(i);
P1=0x60;
P2=0x06;
Delay(j);
P1=0x9f;
P2=0xf9;
Delay(j);
P1=0x60;
P2=0x06;
Delay(k);
P1=0x9f;
P2=0xf9;
Delay(k);
}
void flash_5() //十字閃
{
uchar m,n;
P0=0x00;
for(m=0;m<3;m++)
{
P1=0x60;
P2=0x06;
Delay(10);
P1=0x00;
P2=0x00;
Delay(10);
}
for(n=0;n<3;n++)
{
P1=0x66;
P2=0x66;
Delay(10);
P1=0x00;
P2=0x00;
Delay(10);
P1=0xf0;
P2=0x0f;
Delay(10);
P1=0x00;
P2=0x00;
Delay(10);
}
}
/*********************************列斷續掃描**************************/
void line_1(uchar i,uchar j,uchar k) //單列亮
{
P0=0X00;
P1=0X1;
P2=0X00;
Delay(i);/*1*/
P1=0X2;
P2=0X00;
Delay(i);/*2*/
P1=0X4;
P2=0X00;
Delay(i);/*3*/
P1=0X8;
P2=0X00;
Delay(i);/*4*/
P1=0X10;
P2=0X00;
Delay(j);/*5*/
P1=0X00;
P2=0X8;
Delay(j);/*12*/
P1=0X00;
P2=0X10;
Delay(j);/*13*/
P1=0X00;
P2=0X20;
Delay(j);/*14*/
P1=0X00;
P2=0X40;
Delay(k);/*15*/
P1=0X00;
P2=0X80;
Delay(k);/*16*/
P1=0X00;
P2=0X1;
Delay(k);/*9*/
P1=0X80;
P2=0X00;
Delay(k);/*8*/
}
void line_2(uchar i,uchar j,uchar k) //逐漸列全亮
{
// P0=0X00;
P1=0X1;
P2=0X00;
Delay(i);/*1*/
P1=0X3;
P2=0X00;
Delay(i);/*2*/
P1=0X7;
P2=0X00;
Delay(i);/*3*/
P1=0X0f;
P2=0X00;
Delay(i);/*4*/
P1=0X1f;
P2=0X00;
Delay(j);/*5*/
P1=0X1f;
P2=0X8;
Delay(j);/*12*/
P1=0X1f;
P2=0X18;
Delay(j);/*13*/
P1=0X1f;
P2=0X38;
Delay(j);/*14*/
P1=0X1f;
P2=0X78;
Delay(k);/*15*/
P1=0X1f;
P2=0Xf8;
Delay(k);/*16*/
P1=0X1f;
P2=0Xf9;
Delay(k);/*9*/
P1=0X9f;
P2=0Xf9;
Delay(k);/*8*/
}
void line_3(uchar n,uchar j,uchar k) //雙列繞心轉
{
uchar i;
for(i=0;i<3;i++)
{
P0=0x00;
P1=0x41;
P2=0x14;
Delay(n);
P1=0x42;
P2=0x24;
Delay(n);
P1=0x24;
P2=0x42;
Delay(j);
P1=0x28;
P2=0x82;
Delay(j);
P1=0x30;
P2=0x03;
Delay(k);
P1=0xc0;
P2=0x0c;
Delay(k);
}
}
/****************************************平面掃描*************************************/
void plan_1(uchar i) //列面掃描
{
P0=0x00;
P1=0XF;
P2=0X00;
Delay(i);/*1*/
P1=0XF0;
P2=0X00;
Delay(i);/*2*/
P1=0X00;
P2=0XF;
Delay(i);/*3*/
P1=0X00;
P2=0XF0;
Delay(i);/*4*/
P1=0X00;
P2=0XF;
Delay(i);/*3*/
P1=0XF0;
P2=0X00;
Delay(i);/*2*/
P1=0XF;
P2=0X00;
Delay(i);/*1*/
}
void plan_2(uchar i) // 層面掃描
{
P0=0XFE;
P1=0XFF;
P2=0XFF;
Delay(i);/*第1層(從下到上)*/
P0=0XFD;
P1=0XFF;
P2=0XFF;
Delay(i);/*第2層(從下到上)*/
P0=0XFB;
P1=0XFF;
P2=0XFF;
Delay(i);/*第3層(從下到上)*/
P0=0XF7;
P1=0XFF;
P2=0XFF;
Delay(i);/*第4層(從下到上)*/
P0=0XFB;
P1=0XFF;
P2=0XFF;
Delay(i);/*第3層(從下到上)*/
P0=0XFD;
P1=0XFF;
P2=0XFF;
Delay(i);/*第2層(從下到上)*/
P0=0XFE;
P1=0XFF;
P2=0XFF;
Delay(i);/*第1層(從下到上)*/
}
/*****************逐點走*****************/
void point()
{
P0=0x0e;
line_2(8,8,8);
P0=0x0c;
line_2(7,7,7);
P0=0x08;
line_2(6,6,6);
P0=0x00;
line_2(5,5,5);
P0=0x08;
line_2(4,4,4);
P0=0x0c;
line_2(2,2,2);
P0=0x0e;
line_2(1,1,1);
}
/*****************正方形放大縮小*********************/
void cube_1() //中心到全部
{
uchar i;
for(i=0;i<3;i++)
{
P0=0x09;
P1=0x60;
P2=0x06;
Delay(20);
P0=0x0f;
Delay(3);
P0=0x00;
P1=0xff;
P2=0xff;
Delay(10);
}
}
void cube_2(uchar i) //單旋
{
P0=0x00;
P1=0xc3;
P2=0x00;
Delay(i);
P1=0x66;
P2=0x00;
Delay(i);
P1=0x3c;
P2=0x00;
Delay(i);
P1=0x30;
P2=0x0c;
Delay(i);
P1=0x00;
P2=0x3c;
Delay(i);
P1=0x00;
P2=0x66;
Delay(i);
P1=0x00;
P2=0xc3;
Delay(i);
P1=0xc0;
P2=0x03;
Delay(i);
}
void cube_3(uchar i) //四旋
{
P0=0x00;
P1=0x60;
P2=0x06;
Delay(i);
P1=0xe7;
P2=0x07;
Delay(i);
P1=0x60;
P2=0x06;
Delay(i);
P1=0xe0;
P2=0xe7;
Delay(i);
P1=0x60;
P2=0x06;
Delay(i);
P1=0x70;
P2=0x7e;
Delay(i);
P1=0x60;
P2=0x06;
Delay(i);
P1=0x7e;
P2=0x0e;
Delay(i);
}
/****************面變成體******************/
void plan_cube()
{
P0=0x00;
P1=0x41;
P2=0x14;
Delay(20);
P1=0x28;
P2=0x82;
Delay(20);
P1=0x0f;
P2=0x00;
Delay(20);
P1=0x18;
P2=0x18;
Delay(20);
P1=0x00;
P2=0xf0;
Delay(20);
P1=0x81;
P2=0x81;
Delay(20);
P1=0x00;
P2=0x00;
Delay(20);
P1=0x41;
P2=0x14;
Delay(20);
P1=0x69;
P2=0x96;
Delay(20);
P1=0x6f;
P2=0x96;
Delay(20);
P1=0x7f;
P2=0x9e;
Delay(20);
P1=0x7f;
P2=0xfe;
Delay(20);
P1=0xff;
P2=0xff;
Delay(20);
}
/*******************************主函數*****************************/
main()
{
uint CYCLE=600,PWM_LOW=0;//定義周期并賦值
flash_1();
flash_2();
line_1(10,9,8);
line_1(6,5,4);
line_1(3,2,1);
line_1(1,1,1);
line_2(8,6,4);
line_1(1,1,1);
line_2(8,6,4);
flash_2();
line_3(10,8,6);
line_3(5,4,3);
line_3(3,2,1);
cube_1();
plan_1(10);
plan_2(10);
plan_1(8);
plan_2(8);
flash_4(8,8,8);
line_3(5,5,5);
line_3(4,4,4);
flash_2();
flash_3();
flash_3();
cube_2(8);
cube_2(7);
cube_2(6);
cube_2(5);
cube_2(4);
cube_2(4);
cube_2(3);
cube_2(3);
cube_2(2);
cube_2(2);
cube_2(2);
cube_2(1);
cube_2(1);
cube_2(1);
cube_1();
flash_5();
plan_2(7);
plan_1(7);
line_3(10,8,6);
line_3(5,4,3);
line_3(3,2,1);
flash_4(15,14,13);
flash_4(12,11,10);
flash_4(9,8,7);
flash_4(6,5,4);
cube_1();
cube_2(15);
cube_2(12);
cube_2(10);
cube_2(8);
cube_2(8);
cube_2(8);
flash_4(8,8,8);
line_2(8,8,8);
line_1(5,5,5);
line_2(2,2,2);
point();
plan_cube();
cube_3(15);
cube_3(12);
cube_3(10);
cube_3(8);
cube_3(8);
cube_3(8);
flash_3();
flash_3();
point();
flash_4(10,10,10);
point();
flash_2();
plan_cube();
P0=0x00;
while (1) //主循環
{
P1=0x00;
P2=0x00;
Delay1(10000); //特意加延時,可以看到熄滅的過程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){//PWM_LOW表示低
//電平時間,這個循環中低電平時長從1累加到CYCLE(周期)的值,即600次
P1=0xff;
P2=0xff; //點亮LED
Delay1(PWM_LOW);//延時長度,600次循環中從1加至599
P1=0x00;
P2=0x00; //熄滅LED
Delay1(CYCLE-PWM_LOW);//延時長度,600次循環中從599減至1
}
P1=0xff;
P2=0xff;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){//與逐漸變亮相反的過程
P1=0xff;
P2=0xff;
Delay1(PWM_LOW);
P1=0x00;
P2=0x00;
Delay1(CYCLE-PWM_LOW);
}
}
}
光立方單片機外部晶振改成22.1184了,對應程序怎么改?
晶振頻率改變了,在程序中與晶振頻率有關的部分就要做修改的,一是串口波特率變了,要保持原波特率就得重新計算時間常數,即TH1,TL1的值。二是定時器T0的時間變了,時間常數也要改變,重新計算,那個TH0,TL0的值,不過,如果不變的話,對顯示沒有什么影響就不用變了。