这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 毕业设计专区 » 光立方

共19条 1/2 1 2 跳转至

光立方

专家
2013-01-07 10:05:23     打赏

作者:内蒙古民族大学物理与电子信息学院 王思乐 朱明想 刘尧哉
指导教师:孙晓为

  作品简介

  开发背景和功能使用说明:
  该作品的设计思路来源于现代人追求新鲜的特点,人们的在传统广告信息轰炸下逐渐的视觉疲劳,越来越激发不了人消费群体的消费欲望。在此背景下,我们设计了可以显示3D图形的光立方,通过光立方实时的三维立体的显示广告,不停的变换立体图形效果达到引起消费者注意的目的,不仅可以使商家的商标和广告唯美的变换,还可以使消费者更愿意发时间去欣赏它,实时的了解商家要表达的信息。
  我们的光立方主要功能是在整体上实现画面立体的显示,实现动态的实时3D显示效果,同时可以根据要求改变程序的数组部分就可实现画面的自主定义,也可自己写更多美轮美奂的图形。即可显示出我们想要的3维立体图形,字母,数字,也可实现图形字母数字的来回变换,移动和交替的变换,达到不间断的变换效果。
  注:
  由于此次时间仓促,我们的PCB画出后,没有时间再去发到工厂制作,所以此次的74LS259控制主板使用万用板全部手工焊接。

  结构说明:
  1、硬件设计:
  硬件系统设计框图如下  

   2、软件设计:
  软件设计框图如下  

   图片:  

   平台选型说明

  由于此次选择的项目是光立方,考虑到本作品的设计最低要求和可行性,同时由于大赛的51开发板成本低,并且大赛提供的51单片机内部频率高,IO口丰富,且内部Flash程序存储器大,完全可以实现对光立方的控制。所以我们选择了单片机开发板(以STC15F2K61S2芯片为控制核心)这套开发板,基于STC15F2K61S2的所含的功能,我们通过外接的部分引脚扩展,在开发板上的直接调试,然后通过外界电路可以简单快捷的调试和观察效果。所以此次光立方制作是基于STC15f2K61S2单片机平台设计的。

  设计说明

  一、系统设计
  1、硬件设计:
  硬件系统设计框图如下  

   2、软件设计:
  软件系统设计框图如下  

   二、功能模块设计
  (一)硬件模块设计
  1、LED组合灯的驱动芯片74LS259芯片如下图  

   2、引脚概述  




关键词: 立方     设计    

专家
2013-01-07 10:15:43     打赏
2楼

   3、74LS259控制主板模块:结合大赛51开发板,所用电路原理图如下(只画出大赛所用单片机IAP15F2K61S2,开发板电路未画)  

   4、硬件原理分析:结合以上原理图,在实际的电路搭建中,所有的电路主板共用了一个电源,经过稳压后,在5V左右变化,采用的三极管参数为:
  9013 结构:NPN
  低频管 放大倍数30-90
  集电极-基电压 40V
  集电极-发射极电压 20V
  射极-基极电压 5V
  集电极电流 500mA
  耗散功率 625mW
  特怔频率 最小 150MHZ
  放大倍数:D64-91 E78-112 F96-135 G122-166 H144-220 I190-300  

   该型号的二极管工作电流在20至40mA,而74ls259提供的理论最大输出电流为36mA,所以74ls259的输出电流足够点亮该二极管,为了提高二极管的亮度,同时为了合理的利用现有的器件。
  所以利用三极管的放大电流和开关的作用,在一个二极管分支(包含64个二极管)的组合中我们把每行8个二极管的阴极共接到一个三极管上,这样一共八行二极管接到三极管,三极管接到P1口。再把每列八个二极管的阳极共接到一起,通过74LS259译码器连接到P2.5—P2.7这三个IO口。然后利用矩阵键盘的原理,在选通该分支电路工作时,就可以选择好行后,再选择列,以达到控制单个二极管的亮灭。 通过P3口来选择二极管的分支。
  在焊接二极管的分支的过程中完全按照原理图的原理来焊接,然后按照排列的规律把八个8x8LED点阵连接在一个底座电路板上组合成立体的效果。

  (二)软件模块设计:
  首先是该系统的驱动程序的编写,经过分析我们总结出了两种方法。
  方法一:一种完全是依靠数组来实现,即用十六进制的数组以八个LED管为单位,例如0x01来控制P2口,输出到立方体的电路上即表示立方体的y轴的第一列整个给出高电平(可参考图5中的电路原理图),然后再给P3口一个十六进制数例如0x01,即可控制大家的y轴上的第一个灯亮(相当于给了该二极管一个低电平)。这样就可完全以数组的形式来控制立方体中任意对应的二极管的亮灭。我们的x,y,z轴的定义如下 图(从正面看)。  

   方法二:利用循环的程序来实现,即用到某个灯亮时直接给高电平即可,例如要然x轴的一排八个LED灯全亮,利用for语句一次给P2口的P01到平7口依次赋高电平同时给P31口高电平即可。

  三、总结
  1、硬件:
  在硬件上的驱动部分我们利用了74LS259在3-8译码器工作状态时,每输出一个地址时八个输出引脚中只有一个引脚输出高电平的特点,除去了输出错误码和乱码的可能,因为每次只可能单独的控制一个y轴上的坐标点。同时大大简化了其他的附加电路,在二极管的阴极我们只需加一个三极管就可同时时实现放大电流与控制二极管的导通两项功能,充分的利用了三极管的特性。这些特点满足了简单的控制和简单的用软件去实现我们想要的各种图形,为以后的软件开发和大型开发打下了基础,也大大节省了电路成本。但我们也看到了该电路的局限性,适合早期的开发和调试,当加大该立方体的体积时,即增加LED的数目时,我们的电路就需要更多的单片机的外接引脚来控制,同时电路的制作复杂程度也会上升。

  2、软件:
  在软件上我们开发上我们用了两套的开发驱动,一套专用于显示图形和实现图形旋转的程序,即以数组为基础的驱动。另一套专用于实现简单的测试和基本演示的功能,同时以这套驱动为基础可写出更多的静态的图形效果,程序源码见该文档的附件。但我们也看到了我们的驱动各有优缺点,第一套的驱动程序可以增加LED的亮度,控制简单,每次只需改动数组内容即可,但是非常的占用单片机有限的内存。第二套驱动大部分是以循环的方式来实现我们想要的效果,控制相对简单但是随着循环的次数增加LED整体的亮度会有所下降,而且随着显示图形的复杂度增加,使用此驱动的算法复杂度也会增加,使程序变的晦涩难以理解。所以我们根据不同的情况使用不同驱动,以求达到最佳效率。


专家
2013-01-07 10:16:33     打赏
3楼

  四、不足之处
  由于比赛时间限制,此次光立方为8*8*8的光立方,所以显示的画面和图形受限,只显示一些比较简单的商标和图形3维立体效果。当硬件电路扩大时,使用更多的led,做成16*16*16或者更为复杂的光立方时,可以实现更多复杂商标和图形的立体变换显示。原理是相通的。但是硬件电路的复杂度会急剧上升,所以以后如何用更加简单的硬件电路来实现光立方,是我们以后要考虑的问题。

  五、附件:(c语言源代码)
  注:由于代码长度上千行,所以只贴出了主函数和驱动部分
  /*****此驱动函数实现通过循环控制led来实现图形的变换和移动**********/
  void BBLED( uchar x , uchar y , uchar z ) // 列的LED控制 x为x轴的灯从0~7,
  // y为y轴的控制从0~7,z为z轴的灯为十进制从0~7
  //可单独控制一个灯的亮灭
  {
  P3 = 255 - (1 << z); //2的z次幂 _nop_();
  P25 = y-( y>> 1 << 1 ); //y对二取余
  P26 = (y>>1)-( (y>>1) >> 1 <<1 ); //y对二取模,对二取余
  P27 = (y>>2); //y对四取模
  _nop_();
  _nop_();
  P1 = (1 << x) ;
  delay10us(); //10延时毫秒
  P1 = 0x00;
  _nop_();
  }
  /*********此驱动函数实现通过数组来实现图形的变换和移动**************/
  void led2(uchar address,uchar rowlig,uint Brightness) //rowlig表示所亮的行,address
  //表示每一列的地址,一共64列. Brightness表示亮度,所赋值越大,亮度越大
  {
  /************************最外层28列地址**************************************/
  if(0<=address&&address<8) { P1=0; P3=z[address]; P2=0xff; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(8<=address&&address<15) { P1=0; P3=0x7f; P2=y[address-7]; P1=x[rowlig]; 
elay_us(Brightness);P1=0;}
  if(15<=address&&address<22) { P1=0; P3=z[21-address]; P2=0x1f; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(22<=address&&address<28) { P1=0; P3=0xfe; P2=y[28-address]; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  /***************************次外层20列地址****************************/
  if(28<=address&&address<34) { P1=0; P3=z[address-27]; P2=0xdf; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(34<=address&&address<39) { P1=0; P3=0xbf; P2=y[address-32]; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(39<=address&&address<44) { P1=0; P3=z[44-address]; P2=0x3f; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(44<=address&&address<48) { P1=0; P3=0xfd; P2=y[49-address]; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  /*********************倒数第二层12列地址**********************/
  if(48<=address&&address<52) { P1=0; P3=z[address-46]; P2=0xbf; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(52<=address&&address<55) { P1=0; P3=0xdf; P2=y[address-49]; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(55<=address&&address<58) { P1=0; P3=z[59-address]; P2=0x5f; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(58<=address&&address<60) { P1=0; P3=0xfb; P2=y[62-address]; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  /************************最内层4列地址**********************/
  if(60<=address&&address<62) { P1=0; P3=z[address-57]; P2=0x9f; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(62==address) { P1=0; P3=0xef; P2=0x7f; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  if(63==address) { P1=0; P3=0xf7; P2=0x7f; P1=x[rowlig]; delay_us(Brightness);P1=0;}
  }
  /*********主函数**************/
  void main()
  {
  uchar nn; //nn控制每个图形函数的循环次数
  P1 = 0X00; //初始化
  P2 = 0X00;
  P3 = 0XFF;
  init ();
  while(1)
  {
  daojishi(); //倒计时
  nn=2;
  jinzhi(); //金字塔
  zenduo(); //用于衔接下个图形
  ledall(); //全亮
  mtoo0() ; //以立方体的形式从边缘到中心
  while(nn--)
  mtoo2(); //从中心到边缘来回缩放
  mtoo3(); //实现立方块从中心到边缘的放大再缩小效果
  jiansao(); //衔接函数
  utod(); //单排led从下到上再从上到下的单排循环
  qtoh(); //单排led从前到后再从后到前的单排循环
  rtol(); //单排led从右到左后再在从左到右
  jianduo1(); //衔接函数
  nn=2;
  while(nn--)
  ledall(); //全亮函数
  jiansao(); //衔接函数
  fungus(); // 蘑菇图形
  nn=3;
  while(nn--)
  tu2(); //绕着光立方纵向转
  tu3(78); //绕着光立方横向转
  nn=150;
  while(nn--) //亮一排led
  for(row=0;row<8;row++)
  for(cen=0;cen<8;cen++)
  led(cen,row,0);
  appletu1(); //引出苹果
  pwuxin(); //引出五星
  nn=6;
  while(nn--)
  roll(wuxin,29); //五角星中心旋转
  nn=3;
  while(nn--)
  roll(xin,29); //心形中心旋转
  nn=2;
  while(nn--)
  roll(shan,29); //扇形绕中心旋转
  roll(apple2,105); //苹果绕中心旋转
  dayin(); //打印苹果
  zhuan1(apple,30,140); //苹果绕外层旋转
  jp(); //苹果消失
  jie(); //衔接苹果与箭头
  roll(jiantou1,65); //箭头旋转
  picmo(); // 信号以排移动
  zhuan1(jiantou,20,69); //箭头绕环
  nn=3;
  while(nn--)
  play1(); //stc商标
  link(); //衔接图形
  nn=2;
  while(nn--)
  move();
  flag(); //流动旗帜one
  link1(); //衔接图形
  nn=3;
  while(nn--)
  mtoo1(); //以排的形式从中心到边缘
  dove(); // 扇形旋转
  nn=8;
  while(nn--)
  xuzu(); //顺时针旋转图形
  nn=3;
  while(nn--)
  tu1(); //三角体变换
  flag2(); //流动旗帜two
  jcube(); //衔接cube
  cube(); //四角光立方移动
  play2(); //显示年月日
  while(1)
  butterfly(); // 蝴蝶图形
  }
  }

  作品特色

  一、光立方在LED行业中的运用:
  1、LED显示屏面积过大,造成幕墙式的视觉阻隔。
  2、LED显示屏播放的内容过分商业化造成观看人群的拒看心理。
  所以光立方独特地3维立体显示效果,更会吸引人群的注意力,使消费者愿意花时间去欣赏它,实时的了解商家要表达的信息。

  二、光立方的创新
  立体led光立方是不同于传统led广告牌,它创新的支持3维立体显示效果,可以从任意角度看到内部的显示字,所有的字都可以在现实界面以内任意变化和移动,放一些变幻莫测的画面,这将是一种改变广告传媒效果的新技术。
  这种广告牌炫酷效果超好,是未来LED的发现趋势,而且成本能有效控制。

系统演示视频:http://v.eepw.com.cn/video/play/id/2329


高工
2013-01-07 12:43:39     打赏
4楼

创意太厉害了,首先想起了水立方……


院士
2013-01-07 23:46:10     打赏
5楼
这个东西我做过…… 

高工
2013-01-07 23:50:33     打赏
6楼
楼主给个效果图,大家欣赏欣赏

专家
2013-01-08 20:11:43     打赏
7楼
jobs  贴个图看看

菜鸟
2013-03-10 18:45:22     打赏
8楼
可以发份资料来学习一下吗?

菜鸟
2013-07-14 13:52:39     打赏
9楼
赞一个。。。做得很好哦!哈哈~~~

菜鸟
2013-10-09 19:49:46     打赏
10楼
谢谢分享!

共19条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]