单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7430|回复: 11
收起左侧

4*4*4光立方制作 带单片机源码 原理图

  [复制链接]
51hei官方发布 发表于 2016-10-18 17:17 | 显示全部楼层 |阅读模式
给51黑电子论坛的朋友们分享我的444光立方制作全过程


110623gr0o2444xh4qgsny.png.thumb.jpg
110637ayxrbbt4uztbppty.png.thumb.jpg
110654oi0m4umtp403b3kh.png.thumb.jpg 110713px88dxh8tissbsw8.png.thumb.jpg 110738qpbq7p7767ub2ztj.png.thumb.jpg
程序不完美之处是执行灯光效果或音乐效果的时候,不能响应按键,请高手指教。  还有是灯光和音乐不能同时执行。
附件已更新!
还有其他不足之处请指出,虚心接纳。

有好多网友要电路图,当初制作的时候还不会画电路图,所以也没有,只有用铅笔在本子上画的简单的原理图,给大家分享吧,献丑了
后面的三极管是因为亮度不够,后来又添加的,型号 :s9013
232808zefffssmf9hifomi.jpg.thumb.jpg 232815ek2zz21dcxat7fnf.jpg.thumb.jpg 232820w816iml8h1mh61sh.jpg.thumb.jpg 232826pe0krl9wkx0h90rf.jpg.thumb.jpg 232831cyveksfcpk9pd6ex.jpg.thumb.jpg 232838xmyeqwb78yeqaeze.jpg.thumb.jpg

110742esdudesuu995bums.png.thumb.jpg
单片机源码:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #ifndef __SOUNDPLAY_H_REVISION_FIRST__
  5. #define __SOUNDPLAY_H_REVISION_FIRST__
  6. #define SYSTEM_OSC                 12000000        //定义晶振频率12000000HZ
  7. #define SOUND_SPACE         4/5                 //定义普通音符演奏的长度分率,//每4分音符间隔
  8. uint  code FreTab[12]  = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表
  9. uchar code SignTab[7]  = { 0,2,4,5,7,9,11 };                                                                   //1~7在频率表中的位置
  10. uchar code LengthTab[7]= { 1,2,4,8,16,32,64 };                                                
  11. uchar Sound_Temp_TH0,Sound_Temp_TL0;        //音符定时器初值暂存
  12. uchar Sound_Temp_TH1,Sound_Temp_TL1;        //音长定时器初值暂存
  13. uchar shang,slie,slie1,aa,a,kk,n,m;  
  14. uint x,y,z;
  15. void key();                        //    按键检测
  16. void delay(uint z);           //*****************************延时
  17. void init();                   //******************************初始化
  18. void hangl();//**************************************************行外围逐列个亮
  19. void ceng();//***************************************1234层循环亮
  20. void houqian();//******************************************从后向前
  21. void zuoyou();//****************************************从左向右亮
  22. void shanshuo();  //*****************************全部以200ms的速度闪烁50次,关闭
  23. void rao(); //*************************************环绕
  24. void InitialSound(void);//*************音乐初始化
  25. void Play(uchar *Sound,uchar Signature,unsigned Octachord,uint Speed);
  26. void Delay1ms(uint count)
  27. {
  28.         unsigned int i,j;
  29.         for(i=0;i<count;i++)
  30.         for(j=0;j<120;j++);
  31. }
  32. uchar code Music_Same[]={ 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03,
  33.                                   0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02,
  34.                                   0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02,
  35.                                   0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66,
  36.                                   0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00,
  37.                                   0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,
  38.                                   0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,
  39.                                   0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,
  40.                                   0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x03,
  41.                                   0x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,
  42.                                   0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,
  43.                                   0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,
  44.                                   0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,
  45.                                   0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,
  46.                                   0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,
  47.                                   0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,
  48.                                   0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,
  49.                                   0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,
  50.                                   0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,
  51.                                   0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,
  52.                                   0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,
  53.                                   0x00,0x00 };

  54. sbit cai=P3^3;                //高电平点亮
  55. sbit yy=P3^4;                //蜂鸣器
  56. sbit k1=P3^5;                // 按键        左
  57. sbit k2=P3^6;                //按键        中
  58. sbit k3=P3^7;                //按键        右

  59. //*******************************************行选
  60. uchar code hang[]={
  61.         0x00, //全开
  62.         0xff,//全关
  63.         0x7f,//开底层
  64.         0xbf,//开底二
  65.         0xdf,//开底三层
  66.         0xef,//开最高层
  67. };

  68. //***************************************列选P0
  69. uchar code lie[]={
  70.         0xff,//全开
  71.         0x00,//全关
  72. };

  73. //****************************************列选P1
  74. uchar code lie1[]={
  75.         0xff,//全开
  76.         0x00,//全关
  77. };        
  78. //--------------------------------------------------------------主程序
  79. void main()
  80. {        
  81.         init();                         //初始化设置         
  82.         while(1)
  83.         {
  84.                           P0=0xff;        P1=0xff;         P2=0x00;        //全亮
  85.                 key();         
  86.                
  87.         }                        
  88. }

  89. //====================================各种模块=================================================                        

  90. void delay(uint z)        //***************************延时                                                  
  91. {                                                
  92.         for(x=z;x>0;x--)
  93.                 for(y=110;y>0;y--);
  94. }
  95. //============================================================================================
  96. void init()                         //******************************初始化
  97. {
  98.         kk=0;
  99.         P2=0xff;          //关闭行选
  100.         P0=0x00;          //关闭列选
  101.         P1=0x00;          //关闭列选
  102.         cai=0;                 //关闭彩灯
  103. }
  104. //=====================================================音乐初始化
  105. void InitialSound(void)
  106. {
  107.         yy = 0;
  108.         Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;        // 计算TL1应装入的初值         (10ms的初装值)
  109.         Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;        // 计算TH1应装入的初值
  110.         TH1 = Sound_Temp_TH1;
  111.         TL1 = Sound_Temp_TL1;
  112.         TMOD  |= 0x11;
  113.         ET0    = 1;
  114.         ET1           = 0;
  115.         TR0           = 0;
  116.         TR1    = 0;
  117.         EA     = 1;
  118. }
  119. //============================================================================================
  120. void shanshuo()  //*****************************各种闪烁
  121. {               
  122.                  for(a=0;a<10;a++)
  123.                   {
  124.                          P2=hang[0];                          //开所有行选
  125.                         for(slie=0;slie<2;slie++)
  126.                         {
  127.                          P0=lie[slie];
  128.                          P1=lie1[slie];
  129.                          delay(60);
  130.                         }
  131.                   }
  132.                         P2=0xff;        P0=P1=0x00;          //全部关闭

  133.                         for(a=0;a<10;a++)
  134.                         {
  135.                                 P2=0x00;
  136.                                 P1=0x99;        P0=0x99;  delay(50);
  137.                                         P2=0xff;        P0=0X00;P1=0x00;          //全部关闭
  138.                                         delay(50);
  139.                         }
  140.                         for(a=0;a<10;a++)
  141.                         {
  142.                                 P2=0x00;
  143.                                 P1=0x66;        P0=0x66;  delay(50);
  144.                                         P2=0xff;        P0=0X00;P1=0x00;          //全部关闭
  145.                                         delay(50);
  146.                         }
  147.                         for(a=0;a<10;a++)
  148.                         {
  149.                                 P2=0x00;
  150.                                 P1=0x55;        P0=0x55;  delay(50);
  151.                                         P2=0xff;        P0=0x00;        P1=0x00;          //全部关闭
  152.                                         delay(50);
  153.                         }
  154.                         for(a=0;a<10;a++)
  155.                         {
  156.                                 P2=0x00;
  157.                                 P1=0xaa;        P0=0xaa;   delay(50);
  158.                                         P2=0xff;        P0=0x00;        P1=0x00;          //全部关闭
  159.                                         delay(50);
  160.                         }
  161.                            
  162.                         delay(1000);
  163.                         P2=0x3f;
  164.                         P0=0x60;        P1=0x06;        delay(1000);
  165.                         P2=0x00;        P0=0xff;        P1=0xff;        delay(1000);
  166. }
  167. //============================================================================================
  168. void zuoyou()//****************************************从左向右亮
  169. {
  170.         for(a=0;a<8;a++)
  171.                  {
  172.                          P2=0x00;
  173.                          P1=0x11;        P0=0x11;         delay(50);
  174.                         P1=0x22;        P0=0x22;         delay(50);
  175.                         P1=0x44;        P0=0x44;         delay(50);
  176.                         P1=0x88;        P0=0x88;         delay(50);        
  177.                         P2=0xff;        P0=0x00;            P1=0x00;          //全部关闭
  178.                                 delay(50);
  179. }
  180. }
  181. //============================================================================================
  182. void houqian()//******************************************从后向前
  183. {
  184. for(a=0;a<8;a++)
  185. {
  186.                 P2=0x00;
  187.                         P0=0x0f;        delay(50);                        
  188.                         P0=0xf0;        delay(50);         P0=0x00;
  189.                         P1=0x0f;        delay(50);
  190.                         P1=0xf0;        delay(50);        
  191.                         P2=0xff;        P0=0x00;        P1=0x00;          //全部关闭
  192.                  delay(400);
  193. }
  194. }
  195. //============================================================================================
  196. void ceng()//***************************************1234层循环亮
  197. {
  198. for(a=0;a<15;a++)
  199. {
  200.         P0=0xff;P1=0xff;
  201.            P2=0x7f;                delay(50);
  202.            P2=0xbf;                delay(50);
  203.            P2=0xdf;                delay(50);
  204.            P2=0xef;                delay(150);
  205.            P2=0xdf;                delay(50);
  206.            P2=0xbf;                delay(50);
  207.            P2=0xff;        P0=P1=0x00;          //全部关闭
  208. }
  209. }
  210. void hangl()//**************************************************行外围逐个亮
  211. {
  212. for(a=0;a<8;a++)
  213. {
  214.                  P0=0x88;        P1=0x88;        
  215.          P2=0xef;                                           delay(50);
  216.          P2=0xdf;                                        delay(50);
  217.          P2=0xbf;                                        delay(50);
  218.             P2=0x7f;                                        delay(50);
  219.                  P0=0x44;        P1=0x44;        delay(50);
  220.                  P0=0x22;        P1=0x22;        delay(50);
  221.                  P0=0x11;        P1=0x11;        delay(50);
  222.         P2=0xbf;                                        delay(50);
  223.     P2=0xdf;                                        delay(50);
  224.         P2=0xef;                                       
  225.                  P0=0x11;        P1=0x11;        delay(50);
  226.                  P0=0x22;        P1=0x22;        delay(50);
  227.                  P0=0x44;        P1=0x44;        delay(50);
  228. }           P2=0xff;        P0=P1=0x00;          //全部关闭
  229. }

  230. void rao()
  231. {          P2=0xff;        P0=P1=0x00;          //全部关闭
  232. //-----------------------------------------------------------------------------------------

  233.                                  P2=0x7f;                P1=0xf0;  delay(200);
  234.                                  P2=0x3f;                                           delay(200);
  235.                                  P2=0x1f;                                           delay(200);
  236.                                  P2=0x0f;                                           delay(800);
  237.                                                                     
  238.                                                                         P1=0x70;  delay(200);
  239.                                                                         P1=0xb0;  delay(200);
  240.                                                                         P1=0xd0;  delay(200);
  241.                                                                         P1=0xe0;  delay(200);          P1=0X00;
  242.                                  for(a=0;a<4;a++)
  243.                                 {
  244.                                 P1=0x71;                                           delay(100);
  245.                                 P1=0x31;                P0=0x10;  delay(100);
  246.                                 P1=0x11;                P0=0x11;        delay(100);
  247.                                 P1=0x01;                P0=0x13;  delay(100);
  248.                                 P1=0X00;                    P0=0x17;  delay(100);
  249.                                                                         P0=0x0f;        delay(100);
  250.                                                                         P0=0x8e;  delay(100);
  251.                             P1=0x08;                P0=0x46;  delay(100);
  252.                                 P1=0x88;                P0=0x88; delay(100);
  253.                                 P1=0xc8;                P0=0x80; delay(100);
  254.                                 P1=0xe8;                P0=0X00;          delay(100);
  255.                                 P1=0xf0;                                          delay(100);
  256.                                 }
  257.                                 P1=0x70;                delay(200);
  258.                                 P1=0x30;                delay(200);
  259.                                 for(a=0;a<4;a++)
  260.                                 {
  261.                                  P1=0x10;         delay(200);        P1=0X00;  delay(200);
  262.                                 } P1=0x10;
  263.                                 P2=0x1f;                delay(200);
  264.                                 P2=0x3f;                delay(200);
  265.                                 P2=0x7f;                delay(500);
  266.                                 P2=0Xff;P0=0X00;P1=0X00;
  267. }                 
  268. //============================================================================================
  269. void key()        //***********************************按键检测
  270. {
  271.                   if(k1==0)                //********************左键
  272.                   {         if(kk==6)
  273.                                   {kk=0;}                  
  274.                   delay(10);
  275.                           if(k1==0)
  276.                         {
  277.                                 while(!k1);
  278.                                 if(kk==1)
  279.                                         {shanshuo();}        //全部以200ms的速度闪烁
  280.                                 if(kk==2)
  281.                                         {hangl();}                   //行外围逐列个亮
  282.                                 if(kk==5)
  283.                                         {houqian();}         //          从后向前
  284.                                 if(kk==3)
  285.                                         {zuoyou();}                //          从左向右亮
  286.                                 if(kk==4)
  287.                                         {ceng();}                //         1234层循环亮
  288.                                 if(kk==0)
  289.                                         {rao();}                                
  290.                         }
  291.                           kk++;
  292.                   }

  293.                   if(k3==0)        //***************************右键
  294.                   {
  295.                           delay(10);
  296.                         if(k3==0)
  297.                         {        while(!k3);
  298.                                 cai=~cai;
  299.                         }
  300.                   }

  301.                   if(k2==0)           //***************************中键
  302.                   {
  303.                           delay(10);
  304.                         if(k2==0)
  305.                         {         
  306.                                 while(!k2);
  307.                                    InitialSound();
  308.                                 Play(Music_Same,0,3,360);
  309.                 Delay1ms(500);
  310. //        P0=0x00;

  311.                         }
  312.                   }
  313. }
  314. void BeepTimer0(void) interrupt 1        //音符发生中断
  315. {
  316.         yy = !yy;
  317.         TH0    = Sound_Temp_TH0;
  318.          TL0    = Sound_Temp_TL0;
  319. }
  320. void Play(uchar *Sound,uchar Signature,unsigned Octachord,uint Speed)
  321. {
  322.         uint NewFreTab[12];                //新的频率表
  323.         uchar i,j;
  324.         uint Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
  325.         uchar Tone,Length,SL,SH,SM,SLen,XG,FD;
  326.         for(i=0;i<12;i++)                                 // 根据调号及升降八度来生成新的频率表
  327.         {
  328.                 j = i + Signature;
  329.                 if(j > 11)
  330.                 {
  331.                         j = j-12;
  332.                         NewFreTab[i] = FreTab[j]*2;
  333.                 }
  334.                 else
  335.                         NewFreTab[i] = FreTab[j];

  336.                 if(Octachord == 1)
  337.                         NewFreTab[i]>>=2;
  338.                 else if(Octachord == 3)
  339.                         NewFreTab[i]<<=2;
  340.         }                                                                        
  341.         
  342.         SoundLength = 0;
  343.         while(Sound[SoundLength] != 0x00)        //计算歌曲长度
  344.         {
  345.                 SoundLength+=2;
  346.         }

  347.         Point = 0;
  348.         Tone   = Sound[Point];        
  349.         Length = Sound[Point+1];                         // 读出第一个音符和它时时值
  350.         
  351.         LDiv0 = 12000/Speed;                                // 算出1分音符的长度(几个10ms)         
  352.         LDiv4 = LDiv0/4;                                         // 算出4分音符的长度
  353.         LDiv4 = LDiv4-LDiv4*SOUND_SPACE;         // 普通音最长间隔标准
  354.         TR0          = 0;
  355.         TR1   = 1;
  356.         while(Point < SoundLength)
  357.         {
  358.                 SL=Tone%10;                                                                 //计算出音符
  359.                 SM=Tone/10%10;                                                                 //计算出高低音
  360.                 SH=Tone/100;                                                                 //计算出是否升半
  361.                 CurrentFre = NewFreTab[SignTab[SL-1]+SH];         //查出对应音符的频率         
  362.                 if(SL!=0)
  363.                 {
  364.                         if (SM==1) CurrentFre >>= 2;                 //低音
  365.                         if (SM==3) CurrentFre <<= 2;                 //高音
  366.                         Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值
  367.                         Sound_Temp_TH0 = Temp_T/256;
  368.                         Sound_Temp_TL0 = Temp_T%256;
  369.                         TH0 = Sound_Temp_TH0;  
  370.                         TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿
  371.                 }
  372.                 SLen=LengthTab[Length%10];         //算出是几分音符
  373.                 XG=Length/10%10;                         //算出音符类型(0普通1连音2顿音)
  374.                 FD=Length/100;
  375.                 LDiv=LDiv0/SLen;                         //算出连音音符演奏的长度(多少个10ms)
  376.                 if (FD==1)
  377.                         LDiv=LDiv+LDiv/2;
  378.                 if(XG!=1)        
  379.                         if(XG==0)                                 //算出普通音符的演奏长度
  380.                                 if (SLen<=4)        
  381.                                         LDiv1=LDiv-LDiv4;
  382.                                 else
  383.                                         LDiv1=LDiv*SOUND_SPACE;
  384.                         else
  385.                                 LDiv1=LDiv/2;                 //算出顿音的演奏长度
  386.                 else
  387.                         LDiv1=LDiv;
  388.                 if(SL==0) LDiv1=0;
  389.                         LDiv2=LDiv-LDiv1;                 //算出不发音的长度
  390.                   if (SL!=0)
  391.                 {
  392.                         TR0=1;
  393.                         for(i=LDiv1;i>0;i--)         //发规定长度的音
  394.                         {
  395.                                 while(TF1==0);
  396.                                 TH1 = Sound_Temp_TH1;
  397.                                 TL1 = Sound_Temp_TL1;
  398.                                 TF1=0;
  399.                         }
  400.                 }
  401.                 if(LDiv2!=0)
  402.                 {
  403.                         TR0=0; yy=0;
  404.                         for(i=LDiv2;i>0;i--)         //音符间的间隔
  405.                         {
  406.                                 while(TF1==0);
  407.                                 TH1 = Sound_Temp_TH1;
  408.                                 TL1 = Sound_Temp_TL1;
  409.                                 TF1=0;
  410.                         }
  411.                 }
  412.                 Point+=2;
  413.                 Tone=Sound[Point];
  414.                 Length=Sound[Point+1];
  415.         }                                         
  416.         yy = 0;
  417. }
复制代码
0.png
所有资料下载:
4-4-4光立方.rar (33.53 KB, 下载次数: 91)
回复

使用道具 举报

维丶 发表于 2016-10-19 16:49 | 显示全部楼层
很有帮助呢..
回复

使用道具 举报

s682551 发表于 2016-12-19 12:05 | 显示全部楼层
好东西。。。。。
回复

使用道具 举报

zx3303 发表于 2017-2-13 15:15 | 显示全部楼层
好东西最近一直在看这玩意儿呢
回复

使用道具 举报

no1xijin 发表于 2017-4-24 01:15 来自手机 | 显示全部楼层
444光立方学习了
回复

使用道具 举报

206004430 发表于 2017-12-27 16:11 来自手机 | 显示全部楼层
很好的资料
回复

使用道具 举报

a8238712 发表于 2018-1-18 09:35 | 显示全部楼层
感谢楼主分享!!
回复

使用道具 举报

8#
无效楼层,该帖已经被删除
lsb123456789 发表于 2018-3-22 09:43 | 显示全部楼层

感谢楼主分享!
回复

使用道具 举报

FANOFAN 发表于 2018-3-23 13:12 | 显示全部楼层
准备试试,谢谢楼主分享!!
回复

使用道具 举报

kaixinyk 发表于 2018-4-9 10:32 来自手机 | 显示全部楼层
大师顶
回复

使用道具 举报

12#
无效楼层,该帖已经被删除
709469957 发表于 2018-4-9 20:39 | 显示全部楼层
准备试试,谢谢楼主分享!!
回复

使用道具 举报

14#
无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

快速回复 返回顶部 返回列表