单片机学习小组
直播中

张华仁

7年用户 162经验值
私信 关注

基于51单片机的光立方制作步骤教程及程序

这是做好后的效果  还是很炫的


制作要的点:
1.单片机必须用STC12C5A60S2  因为低速51根本带不动 它的运算速度要求非常高.
2.也就是晶振要用24M的提供高速.
3.硬件制作,很考验耐力的其中焊512个led;
//简单控制。用于检验等的好坏。

需要的可以自行下载 :    888光立方.rar  


  • #include
  • #define uchar unsigned char
  • #define uint unsigned int
  • ***it dula0=P2^0; ***it dula1=P2^1;
  • ***it dula2=P2^2; ***it dula5=P2^5;
  • ***it dula3=P2^3; ***it dula6=P2^6;
  • ***it dula4=P2^4; ***it dula7=P2^7;
  • ***it key0=P3^2;***it key1=P3^3;***it key2=P3^4;***it key3=P3^5;
  • void delayms(uint xam)
  • {
  •   uint x,y;
  •   for(x=xam;x>0;x--)
  •      for(y=110;y>0;y--);
  • }
  • void keyscan()
  • {
  •    if(key0==0)
  •    {
  •      delayms(10);
  •          if(key0==0)
  •          {
  •            P1=0x00;P1=0xff;P2=0x00;
  •            dula0=1;P0=0xff;dula0=0;dula1=1;P0=0xff;dula1=0;
  •            dula2=1;P0=0xff;dula2=0;dula3=1;P0=0xff;dula3=0;
  •        dula4=1;P0=0xff;dula4=0;dula5=1;P0=0xff;dula5=0;
  •            dula6=1;P0=0xff;dula6=0;dula7=1;P0=0xff;dula7=0;
  •            while(!key0);
  •           }
  •         }
  •         if(key1==0)
  •         {
  •           delayms(10);
  •           if(key1==0)
  •           {
  •              P1=0x00;P1=0xFF;dula0=0x00;delayms(3);
  •                  P1=0X00;P1=0XFF;dula1=0X81;delayms(3);
  •                  P1=0X00;P1=0X81;dula1=0xff;delayms(3);
  •                  P1=0X00;P1=0XFF;dula2=0X81;delayms(3);
  •                  P1=0X00;P1=0X81;dula2=0xff;delayms(3);
  •                  P1=0X00;P1=0XFF;dula3=0X81;delayms(3);
  •                  P1=0X00;P1=0X81;dula3=0xff;delayms(3);
  •                  P1=0X00;P1=0XFF;dula4=0X81;delayms(3);
  •                  P1=0X00;P1=0X81;dula4=0xff;delayms(3);
  •                  P1=0X00;P1=0XFF;dula5=0X81;delayms(3);
  •                  P1=0X00;P1=0X81;dula5=0xff;delayms(3);
  •                  P1=0X00;P1=0XFF;dula6=0X81;delayms(3);
  •                  P1=0X00;P1=0X81;dula6=0xff;delayms(3);
  •                  P1=0X00;P1=0XFF;dula7=0X81;delayms(3);
  •                  P1=0X00;P1=0X81;dula7=0xff;delayms(3);
  •                  P1=0x00;P1=0xFF;dula0=0x00;delayms(3);
  •            while(!key1);
  •           }
  •         }
  •         if(key2==0)
  •         {
  •           delayms(10);
  •           if(key2==0)
  •           {
  •             P1=0X00;P1=0x81;P2=0X00;
  •            dula0=1;P0=0xff;dula0=0;dula1=1;P0=0xff;dula1=0;
  •            dula2=1;P0=0xff;dula2=0;dula3=1;P0=0xff;dula3=0;
  •        dula4=1;P0=0xff;dula4=0;dula5=1;P0=0xff;dula5=0;
  •            dula6=1;P0=0xff;dula6=0;dula7=1;P0=0xff;dula7=0;
  •            delayms(1);
  •            P1=0x42;
  •            dula0=1;P0=0x00;dula0=0;dula1=1;P0=0x81;dula1=0;
  •            dula2=1;P0=0x00;dula2=0;dula3=1;P0=0x00;dula3=0;
  •        dula4=1;P0=0x00;dula4=0;dula5=1;P0=0x00;dula5=0;
  •            dula6=1;P0=0x81;dula6=0;dula7=1;P0=0x00;dula7=0;
  •            while(!key0);
  •           }
  •         }
  •         if(key3==0)
  •    {
  •      delayms(10);
  •          if(key3==0)
  •          {
  •            P1=0x00;P1=0xff;P2=0x00;
  •            dula0=1;P0=0xff;dula0=0;delayms(10);dula1=1;P0=0xff;dula1=0;
  •            dula2=1;P0=0xff;dula2=0;delayms(10);dula3=1;P0=0xff;dula3=0;
  •        dula4=1;P0=0xff;dula4=0;delayms(10);dula5=1;P0=0xff;dula5=0;
  •            dula6=1;P0=0xff;dula6=0;delayms(10);dula7=1;P0=0xff;dula7=0;
  •            while(!key3);
  •           }
  •         }
  • }
  • void main()
  • {
  •    while(1)
  •    {
  •    keyscan();
  •    delayms(10);
  •    }
  • }
  • 这是金典的光立方程序
  • #include
  • #include
  • #define uchar unsigned char
  • #define uint unsigned int
  • uchar display[8][8];
  • /*rank:A,1,2,3,4,I,心,U*/
  • uchar code table_cha[8][8]={0x51,0x51,0x51,0x4a,0x4a,0x4a,0x44,0x44,0x18,0x1c,0x18,0x18,0x18,0x18,0x18,0x3c,0x3c,0x66,0x66,0x30,0x18,0xc,0x6,0xf6,0x3c,0x66,0x60,0x38,0x60,0x60,0x66,0x3c,0x30,0x38,0x3c,0x3e,0x36,0x7e,0x30,0x30,0x3c,0x3c,0x18,0x18,0x18,0x18,0x3c,0x3c,0x66,0xff,0xff,0xff,0x7e,0x3c,0x18,0x18,0x66,0x66,0x66,0x66,0x66,0x66,0x7e,0x3c};
  • /*the "ideasoft"*/
  • uchar code table_id[40]={0x81,0xff,0x81,0x00,0xff,0x81,0x81,0x7e,0x00,0xff,0x89,0x89,0x00,0xf8,0x27,0x27,0xf8,0x00,0x8f,0x89,0x89,0xf9,0x00,0xff,0x81,0x81,0xff,0x00,0xff,0x09,0x09,0x09,0x01,0x0,0x01,0x01,0xff,0x01,0x01,0x00};
  • /*railway*/
  • uchar code dat[128]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x6f,0x8f,0x93,0x73,0x6f,0x8f,0x93,0x73,0x4a,0x6a,0x8a,0xaa,0xae,0xb2,0xb6,0x96,0x76,0x56,0x52,0x4e,0x25,0x45,0x65,0x85,0xa5,0xc5,0xc9,0xcd,0xd1,0xd5,0xd9,0xb9,0x99,0x79,0x59,0x39,0x35,0x31,0x2d,0x29,0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};
  • /*railway 2*/
  • uchar code dat2[28]={0x0,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0,0xe4,0xe8,0xec,0xf0,0xf4,0xf8,0xfc,0xdc,0xbc,0x9c,0x7c,0x5c,0x3c,0x1c,0x18,0x14,0x10,0xc,0x8,0x4};
  • /*railway 3*/
  • uchar code dat3[24]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x16,0x26,0x36,0x46,0x56,0x66,0x65,0x64,0x63,0x62,0x61,0x60,0x50,0x40,0x30,0x20,0x10};
  • /*3p char*/
  • uchar code table_3p[3][8]={0xff,0x89,0xf5,0x93,0x93,0xf5,0x89,0xff,0x0e,0x1f,0x3f,0x7e,0x7e,0x3f,0x1f,0x0e,0x18,0x3c,0x7e,0xff,0x18,0x18,0x18,0x18};
  • /*initializtion
  • That is to initialize the program .
  • It is write to set the timer in c52 mcu.
  • So the program can renovate the led_3d_cube in fixed time use the interrupt function.*/
  • void sinter()
  • {
  •          IE=0x82;
  •          TCON=0x01;
  •          TH0=0xc0;
  •          TL0=0;
  •          TR0=1;
  • }
  • void delay5us(void)   //误差 -0.026765046296us STC 1T 22.1184Mhz
  • {
  •     unsigned char a,b;
  •     for(b=7;b>0;b--)
  •         for(a=2;a>0;a--);
  • }
  • void delay(uint i)
  • {
  •          while (i--){
  •                  delay5us();}//12t的mcu 注释这个延时即可
  • }
  • /*To judge the num bit*/
  • uchar judgebit(uchar num,uchar b)
  • {
  •          char n;
  •          num=num&(1<
  •          if (num)
  •          n=1;
  •          else
  •          n=0;
  •          return n;
  • }
  • /*To figure out the round number*/
  • uchar abs(uchar a)
  • {
  •          uchar b;
  •          b=a/10;
  •          a=a-b*10;
  •          if (a>=5)
  •          b++;
  •          return b;
  • }
  • /*To figure out the absolute value*/
  • uchar abss(char a)
  • {
  •          if (a<0)
  •          a=-a;
  •          return a;
  • }
  • /*The function can comparat the character.
  • And remove the big one to the back.*/
  • void max(uchar *a,uchar *b)
  • {
  •    uchar t;
  •    if ((*a)>(*b))
  •    {
  •                    t=(*a);
  •                    (*a)=(*b);
  •                    (*b)=t;
  •    }
  • }
  • /*The function is to figure out the max number and return it.*/
  • uchar maxt(uchar a,uchar b,uchar c)
  • {
  •          if (a
  •          a=b;
  •          if (a
  •          a=c;
  •          return a;
  • }
  • void clear(char le)
  • {
  •          uchar i,j;
  •          for (j=0;j<8;j++)
  •          {
  •                    for (i=0;i<8;i++)
  •                    display[j]=le;
  •          }
  • }
  • void trailler(uint speed)
  • {
  •          char i,j;
  •          for (i=6;i>=-3;i--)
  •          {
  •                    if (i>=0)
  •                    {
  •                             for (j=0;j<8;j++)
  •                             display[j]=display[j][i+1];
  •                    }
  •                    if (i<4)
  •                    {
  •                             for (j=0;j<8;j++)
  •                             display[j][i+4]=0;
  •                    }
  •                    delay(speed);
  •          }
  • }
  • void point(uchar x,uchar y,uchar z,uchar le)
  • {
  •          uchar ch1,ch0;
  •          ch1=1<
  •          ch0=~ch1;
  •          if (le)
  •          display[z][y]=display[z][y]|ch1;
  •          else
  •          display[z][y]=display[z][y]&ch0;
  • }
  • void type(uchar cha,uchar y)
  • {        
  •          uchar xx;
  •          for (xx=0;xx<8;xx++)
  •          {
  •          display[xx][y]=table_cha[cha][xx];
  •          }
  • }
  • /*The first variable is the distance from the midpoint.
  • The second is the layer.
  • the third is the flash speed of the time between each two point.
  • The forth is the enable io,it controls weather draw or claen.*/
  • void cirp(char cpp,uchar dir,uchar le)
  • {
  •          uchar a,b,c,cp;
  •          if ((cpp<128)&(cpp>=0))
  •          {
  •                    if (dir)
  •                    cp=127-cpp;
  •                    else
  •                    cp=cpp;
  •                    a=(dat[cp]>>5)&0x07;
  •                    b=(dat[cp]>>2)&0x07;
  •                    c=dat[cp]&0x03;
  •                    if (cpp>63)
  •                    c=7-c;
  •                    point (a,b,c,le);
  •          }
  • }
  • void line(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar le)
  • {
  •          char t,a,b,c,a1,b1,c1,i;
  •          a1=x2-x1;
  •          b1=y2-y1;
  •          c1=z2-z1;
  •          t=maxt(abss(a1),abss(b1),abss(c1));
  •          a=x1*10;
  •          b=y1*10;
  •          c=z1*10;
  •          a1=a1*10/t;
  •          b1=b1*10/t;
  •          c1=c1*10/t;
  •          for (i=0;i
  •          {
  •                    point(abs(a),abs(b),abs(c),le);
  •                    a+=a1;
  •                    b+=b1;
  •                    c+=c1;
  •          }
  •          point(x2,y2,z2,le);
  • }
  • void box(uchar x1,uchar y1,uchar z1,uchar x2,uchar y2,uchar z2,uchar fill,uchar le)
  • {
  •          uchar i,j,t=0;
  •          max(&x1,&x2);
  •          max(&y1,&y2);
  •          max(&z1,&z2);
  •          for (i=x1;i<=x2;i++)
  •                    t|=1<
  •          if (!le)
  •                    t=~t;
  •          if (fill)
  •          {
  •                    if (le)
  •                    {
  •                             for (i=z1;i<=z2;i++)
  •                             {
  •                                      for (j=y1;j<=y2;j++)
  •                                                display[j]|=t;
  •                             }
  •                    }
  •                    else
  •                    {
  •                             for (i=z1;i<=z2;i++)
  •                             {
  •                                      for (j=y1;j<=y2;j++)
  •                                                display[j]&=t;
  •                             }
  •                    }
  •          }
  •          else
  •          {
  •                    if (le)
  •                    {
  •                             display[y1][z1]|=t;
  •                             display[y2][z1]|=t;
  •                             display[y1][z2]|=t;
  •                             display[y2][z2]|=t;
  •                    }
  •                    else
  •                    {
  •                            display[y1][z1]&=t;
  •                             display[y2][z1]&=t;
  •                             display[y1][z2]&=t;
  •                             display[y2][z2]&=t;
  •                    }
  •                    t=(0x01<
  •                    if (!le)
  •                             t=~t;
  •                    if (le)
  •                    {
  •                             for (j=z1;j<=z2;j+=(z2-z1))
  •                             {
  •                                      for (i=y1;i<=y2;i++)
  •                                                display[j]|=t;
  •                             }
  •                             for (j=y1;j<=y2;j+=(y2-y1))
  •                             {
  •                                      for (i=z1;i<=z2;i++)
  •                                                display[j]|=t;
  •                             }
  •                    }
  •                    else
  •                    {
  •                             for (j=z1;j<=z2;j+=(z2-z1))
  •                             {
  •                                      for (i=y1;i<=y2;i++)
  •                                      {
  •                                      display[j]&=t;
  •                                      }
  •                             }
  •                             for (j=y1;j<=y2;j+=(y2-y1))
  •                             {
  •                                      for (i=z1;i<=z2;i++)
  •                                      {
  •                                      display[j]&=t;
  •                                      }
  •                             }
  •                    }
  •          }
  • }

更多回帖

发帖
×
20
完善资料,
赚取积分