光立方完全解析

光立方完全解析这个 4 4 4 的三色光立方是我在初学单片机的时候做的一个小项目

大家好,欢迎来到IT知识分享网。

       转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/

       这个4*4*4的三色光立方是我在初学单片机的时候做的一个小项目。很适合给初学单片机和C语言的同学练手,而且效果很炫。今天再看此代码有很多不规范之处,但由于硬件已经送人,没法继续调试,希望小伙伴们引以为戒。写此文主要是想让大家知道其中的原理,知道怎么做固然重要,更重要的是知道为什么要这样做。

        效果展示:http://v.youku.com/v_show/id_XNjAyMTkwODE2.html

光立方完全解析

光立方完全解析

光立方完全解析

一.总述

        光立方是什么?光立方其实就是将点阵折叠起来然后再立起来。初学单片机完全可以按照这个思路:点亮一个小灯->点亮流水灯->点阵显示->点亮光立方。这其中是存在着联系的,下面我来说说这其中的原理。

         点亮一个小灯:没什么好说的,控制一个IO为高低电平。

            点亮流水灯:这个也简单,就是控制几个IO的的高低电平呗。

               点阵显示 :这个看似有难度,其实也不难,核心就是一个字“扫”,首先知道字模的数据,然后先显示一列,再以极短的时间显示下一列,知道整个点阵显示完。由于人眼的暂留效应,会看起来是静态的。其实LCD和它也类似,这个暂且先不说。

             点亮光立方:为什么我说光立方是折叠起来然后再立起来的点阵呢?这个先卖个关子,等讲完硬件之后你自然会明白。其实原理和点阵差不多的。

二.硬件

          说先说下,当时因为这个电路设计实在简单,并没有画原理图,直接上来就拿洞洞板子焊的。你可以先画个图,但其实真不用画图。

    1.单片机

           建议选用51系列的STC12C5A60S2-35I-PDIP40单片机,因为用89C51输出电流不足要加三级管扩流(PNP三极管做开关管),我当初就是这么做的,给我带来很多麻烦,而且也不美观。希望小伙伴们吸取教训。最小系统怎么搭建我就不说了,应该都会把。

     2.双色LED

           双色LED就是有三个引脚。其中一个引脚是地其余两个是LED的引脚。能显示三种颜色。其实完全可以换证七彩的LED就是有四个引脚的那种,那样效果更炫,单片机的引脚是够用的。只是现在没有时间玩了,呵呵,有兴趣的小伙伴们可以自行尝试。

     3.点阵变身光地方

           好了到现在是该说说,怎要把点阵折叠然后再立起来了。这里我贴几张图片,让我们来看看制作过程,我想大家能有深刻的了解。

光立方完全解析

             看了上面的图片,你应该明白我为什么这么说了。好了,下面我说说怎样具体怎么做

光立方完全解析

 这个是最基础的元素,需要做出16个这个东东,这个东东阳极都是相连的,阴极引出来,和下一个单元相连。

一个竖着的面就这样出来了

光立方完全解析四个这个面,按照第一个图连,就OK了。

三.软件

    1.软件框架

          说实话当年做的时候什么东东,只知道,每个单片机程序里面都有个while(1)。哈哈,我写的这个光立方程序主要就是在while(1)里面循环各种现实效果。

void main() { while(1) { hongbegin(); //红由亮到暗 hongend(); //红由暗道亮 P2=0XFF; //将P2关闭以免影响下面黄色灯效果 huangbegin(); //黄呼吸灯 huangend(); chengsedeng(); //橙色灯 huangsebianhongse(); //黄色变红色 miansheng() ; //面上升 mianjiang() ; //面下降 mianzuodaoyou();//面左到右; mianyoudaozuo(); //面从右到左 shuidi() ; //模仿水滴效果(从嘴上一排下落) luoxuansheng() ; //螺旋上升 luoxuanjiang() ; //螺旋下降 pingheng() ; //平衡木 yinxiangshang() ; //音响效果上下 yinxiangzuo() ; //音响效果左右 sxingsaomian() ; //S形扫面 litixuanzhuan(); //立体旋转 zuoshangliang() ; //左上角一点到全体亮 sijiaoneishou() ; //四角向内收 shuidijiandong() ; //仿水滴溅动 shuibo() ; //仿水波浪 feiji() ; //仿飞机飞行 chaojimali() ; //超级玛丽 chengsedeng(); //橙色灯 huangbegin(); //黄呼吸灯 huangend(); hongend(); //红由暗道亮 hongbegin(); //红由亮到暗 jiesu(); //结束函数 } } 

     2.呼吸灯

            说是呼吸灯,渐亮、渐灭的,说的那么高大上,其实就是PWM,再说的土一点就是控制一个周期内的导通时间,周期内的导通时间逐渐增加,自然就越来越亮。逐渐减小,自然就越来越暗,直到完全熄灭。这个东西如果你用STC12来说的话,其实可以非常简单,就是一个D/A转换。将数字信号,转换成模拟信号。当然我那个时候还不太懂这些,直接用的89C52,52是没有D/A转换芯片的,我用的软件模拟PWM,其实就是延时的原理。下面是实现的部分代码。

/*P1为黄色,P2为红色。     P0为阴极*/  uchar code table[]={                                       //呼吸灯专用 0,0,1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18, 19,20,21,22,23,24,25,26,27, 28,29,30,31,32,33,34,35,36, 37,38,39,40,41,42,43,44,45, 46,47,48,49,50,51,52,53,54, 55,56,57,58,59,60,61,62,63, 64,65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80,81,82, 83,84,85,86,87,88,89,90,91, 92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109, 110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125, 126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141, 142,143,144,145,146,147,148,149,150,}; void delay(uint z) {         uint x,y;         for(x=5;x>0;x--)                             for(y=z;y>0;y--); } void hongbegin()  //全亮 呼吸灭 {     int i;     for(i=0;i<140;i++)     {         honglight2(i);     }     P0=0x00;              //保持亮的状态     P2=0xff;     P1=0xff;        } void honglight2(uchar num2)                        //由亮到灭     (可以理解为亮的时间由长到短。灭的时间由短到长) {         uchar j;         P0=0xff;                     //首先关闭P0         P2=0x00;                      //打开P2         j = table[num2];         delay(j);                      //延时   (由短到长的)         P0=0x00;                      //打开P0叫它亮         P2=0x00;         delay(150-j);                  //延时由长到短 }

      3.代码讲解

            首先我们知道,动画是由图片来快速播放形成的,光立方依靠的也是这个原理。

unsigned char code tabP0[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};  //低电平扫描    ,每次只让亮一排(一个P0口) void mianjiang()   {              unsigned char code tabP2[3][8]={                    //定义数组 。储存数据      {0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF},         {0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF},         {0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF},     };     int j,k,i;                                     //定义三个变量     for(j=0;j<3;j++)                             //j图像个数     {             for(k=0;k<20;k++)                         //k为每个图像存在时间、k越大单个图像存在时间越长         {                 for(i=0;i<8;i++)                      //   每个图像由八帧、构成             {    P2=0XFF;                          //  此函数和消除残留的阴影                 //P0=1;                 P0=tabP0[i];                         //将阴极P0取出                 P2=tabP2[j][i];                      //将数组阳极取出                 P1=0XFF;                          //将P1关闭以免影响红色效果                 ys(2);                               //根据人眼暂留效应。。加大可看见整个亮灯过程、、减小即可显示稳定图像             }         }     }         }

全部代码和取摸软已经打包并且上传。

下载地址:  点击打开链接

参考:取模软件出处:http://user.qzone..com//blog/

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/136169.html

(0)
上一篇 2025-06-29 16:00
下一篇 2025-06-29 16:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信