小码农

趣味编程-面向每个人的创意编程
1.简介
本设计是以STC89C52单片机的8x8x8的LED光立方。本设计将LED光立方分成8层,分别由单片机的P1,8个IO口来控制每一层,由于采用的是共阴极所以当层电位为高电平有效,由P0口和P2的总共16个IO口来控制每层的64盏灯,低电平有效,P2口通过8个74HC573缓冲器芯片来驱动LED。这样就可以通过控制IO口的输出电平来控制每盏灯的亮灭。
2.硬件设计
本系统的硬件电路主要单片机最小系统、LED光立方驱动电路、LED光立方电路组成,其硬件框图如图:
(1)光立方驱动电路原理
以8X8X8光立方为例:
一个光立方我们可以拆成8个面,如图
而每个面又有8X8共64个LED灯,如图:
这样,我们只要控制这 64 个灯使其能够自由变换,然后再通过控制每个层依次点亮即可,由于我们眼睛的视觉暂留,使我们感觉看到的东西是一起再亮的。这样我们就看到了一个完整的个体。
驱动的步骤是:
Z轴选中一个要点亮的面(一个面共有8段Y轴)
Y轴选中一个需要点亮的Y轴(一段Y轴共有8个LED灯)
X轴上的8个控制引脚通过设定的编码来点亮8个LED中某几个,并延时相应的时间
重复扫描8个Y轴边完成一个面的点亮,然后再重复扫描其他7个面,便完成了一次光立方的点亮了
(2)光立方驱动电路设计
此光立方采用一个ULN2308驱动芯片(作为Z轴的选择),和8个8路的74HC573锁存器(一个74HC573作为一个Y轴)来驱动8X8X8共512个LED灯。整体电路如图:
总的原理是每一时刻选中573的LE使能脚,使其为低电平,再由573输送次引脚对应的8个LED的亮灭状态,一个阴极点需要8位,即一个字节数据,完成一次完整的显示需要64个字节,此为一帧,要产生动画效果则需要产生中断进入下一帧。
(3)总体硬件电路
3.软件设计
(1)软件说明
光立方的软件设计相对简单,主要根据相应的动画效果的编码对光立方进行动态扫描,软件流程如图:
程序开始运行,获取到要显示的LED所在的层和列然后调用显示子程序点亮LED灯,通过延时程序进行短暂延时后继续获取下一个要显示的LED灯的所在的层和列。
如果你想要设计自己所要的动画效果,可以通过常用的光立方取模软件获得相应的动画编码。
(2)部分显示效果编码
uchar code display[]={
                        
                     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,0x18,0x18,0x00,0x00,0x00,	    //1
                     0x00,0x00,0x00,0x18,0x18,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,0x3c,0x24,0x24,0x3c,0x00,0x00,
                     0x00,0x00,0x24,0x00,0x00,0x24,0x00,0x00,	    //2
                     0x00,0x00,0x24,0x00,0x00,0x24,0x00,0x00,
                     0x00,0x00,0x3c,0x24,0x24,0x3c,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,0x18,0x18,0x00,0x00,0x00,	    //骰子1-49
                     0x00,0x00,0x00,0x18,0x18,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,}					 

 

(3)主函数代码
void main()
{
    init();	
    while(1)
    {
        for(i=0;i<8;i++)
        {
            Z = Z_Seg[i];
            for(j=0;j<8;j++)
                {
                    Y = Y_Seg[j];
                    X = display[count++];
                    delay();
                }
            }
        count=64*temp;	
    }
}

 

发表评论