这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 毕业设计专区 » 基于STC15系列单片机的LED立体显示系统设计与实现

共3条 1/1 1 跳转至

基于STC15系列单片机的LED立体显示系统设计与实现

专家
2013-01-07 10:53:02     打赏

作者:南京晓庄学院物理与电子工程学院 杨苏鹤 赵林强 刘庆鹏
指导教师:张林 李钢生

  作品简介

  一、设计背景
  随着摄影技术的快速发展,3D 技术已经相当成熟,人们带着 3D 眼镜去电 影院体验身临其境的 3D 效果也早已不再是新鲜事物。漫步在城市的中央,夜幕降临时,城市被各式各样的彩灯装饰得格外美丽,而在众多的彩灯中,亮度高、 功耗低、不易损坏的 LED 灯无疑成为了众多楼宇亮化的首要选择。在将 3D 立体 显示与 LED 美化相结合的基础上,我们设计并制作了基于 STC 公司生产的 STC15F2K61S2 单片机为核心的 LED 立体显示系统。

  二、作品图片
  参赛作品如图 1 所示:  

   该显示系统主要由三个部分组成,第一部分为组委会指定的以 STC15F2K61S2 芯片为控制核心的单片机开发板,作为核心 MCU 以控制显示效 果,第二部分为参赛同学自己设计并制成 PCB 板的 LED 驱动电路,用来驱动 LED显示,第三部分为由 LED 灯和万用板构成的显示主体,用来显示动画和文字图 形等。整个系统的框架如图 2 所示。  

   四、功能简介
  该系统的显示主体为 8×8×8 个蓝色方形雾面 LED 构成,因此,显示功能是 其主要功能。不同于普通平面的 LED 点阵,特殊的立体结构使其可以显示立体的图像、字符、与动画等,主要应用场所为需要广告宣传的商业场所,还有室内亮化的家居装饰等。为了使该系统更具有实用性,加入了温度显示以及音乐频谱功 能,利用 DS18B20 温度传感器检测周围温度,利用声音传感器采集声音数据,单 片机处理后进行显示,效果如图 3 和图 4 所示。  

   五、使用说明
  整个系统硬件部分由以 STC15F2K61S2 芯片为核心的开发板、LED 驱动电路、 LED 显示模块三个部分组成,分别如图 5、图 6 和图 7 所示。  

   平台选型说明

  此次电子系统设计团体赛,大赛组委会共提供了 4 种开发平台,分别是以 Xilinx Spartan - 3E 系 列 芯 片 为 控 制 核 心 的 FPGA 开 发 平 台 、 以 CY8C3866AXI-040 芯片为控制核心的 PSOC 开发平台、以 STC15F2K61S2 芯片 为控制核心的单片机开发平台、以 Freescale MK10DN512ZVLL10 芯片为控制核 心的嵌入式开发平台。最终,选取以 STC 公司生产的 STC15F2K61S2 芯片为控 制核心的单片机开发板作为开发平台,开发出了此次参赛作品“基于 STC15 系列 单片机的 LED 立体显示系统”,下面是针对 STC15 系列的平台选型说明:
  STC15F2K61S2 系列单片机采用增强型 8051 内核,单时钟/机器周期,速度 比普通 8051 快 8-12 倍。在系统可编程,无需编程器与仿真器。和同价位的单片 机相比,具有更大的容量,61K 字节片内片内 Flash 程序存储器,擦写次数 10 万次以上,片内大容量 2048 字节的 SRAM,同时大容量片内 EEPROM,擦写次 数 10 万次数以上。它还具有内部高精度 R/C 时钟,内部时钟从 5MHz~35MHz 可选。共 8 通道 10 位高速 ADC,速度可达 30 万次/秒,3 路 PWM 共 3 通道捕 获/比较单元。外围通信方面,STC15F2K61S2 有两组高速异步串行通信端口,一组高速异步串行通信端口 SPI,支持 I 2C 通信与单总线通信。

  设计说明

  一、设计原理
  和数码管动态扫描、普通 LED 点阵的显示原理一样,LED 立体显示的基本原理也是利用了人眼的视觉暂留现象,即余晖效应。但是和数码管、普通 LED 点阵 所不同的是,LED 立体显示系统通过不断扫描 8×8×8 共 512 个 LED 灯,最终在 显示终端上形成的是一幅立体的图像或是通过各个立体图像之间的有效连接形成了立体的动画。  

   如图 1 所示,单层的 LED 矩阵由 8×8 共 64 个 LED 组成,扫描时,先扫描第 一列 LED,点亮或熄灭相应的 LED,然后再切换至第二列继续显示,如此,8 次 循环后,便可扫描完单层的 LED,即可显示出二维的画面。
  同理,可以通过这样的方法扫描其它的层,如图 2 所示,整个系统共由 8层 LED 矩阵组成,8 层都扫描完毕后,便可显示出一幅立体的图像,以上便为 LED 立体显示系统的基本原理。  

  二、设计方案
  1)驱动方案设计
  整个系统所基于的平台是一块以 STC 公司的 STC15F2K61S2 芯片为核心 的单片机开发板,驱动方案选取的首要因素是芯片的驱动电流大小,因为足够大小电流的电流才能确保 LED 达到最佳的亮度,从而实现最好的显示效果, 同时又不至于烧坏 LED。基于上述原因,我们一共提出了三种设计方案: 
         A.74LS245
   74LS245 是 8 路同相三态双向总线收发器,这种方案需要用 16 片 74LS245, 分别控制 LED 矩阵的共阳极和共阴极,以实现立体显示的效果。
  B.38 译码器+P 沟道 MOS 管+串行移位芯片采用 SM16126
  该方案的最大特点在于采用了 38 译码器和串行移位芯片 SM1626,因此此方 案能够最大限度的节省单片机引脚,38 译码器和 MOS 管用来选通对应的单层 LED,而 SM1626 则负责将数据送往对应的 LED 进行显示。该方案极大的简化了 硬件电路。
  C.74HC573+ULN2008
  和 B 方案的基本原理类似,C 方案选用了八重达林顿对管 ULN2803 来选通单 层 LED,选通之后,再通过锁存器 74HC573 向 LED 的阳极发送数据,点亮相应的 LED 灯。

  方案分析:
  A 方案采取了 16 片 74LS245,首先在 IC(集成电路)芯片的数目上,该方 案就呈现了一定的劣势。同时,该方案需要将 512 个 LED 的 64 个共阳极和64 个共阴极全部引出,加大了电路复杂度的同时,也使得在 LED 的侧面需要搭建另外一块电路板,降低了显示的通透性,整个系统的美观性也有所下降。
  B 方案的优势在于电路连接得到了很大的优化,每一列 LED 的显示只需要单 片机从 IO(输入输出)口发送串行数据即可,8 层 LED 的选通也只需要 3 根数据线进行选择。但是虽然硬件部分有所简化,但是在软件方面却有所 开销,这种方案增加了软件编写的难度。另外,STC15F2K61S2 共有 40 跟引 脚,除了电源和地以外,其余引脚都可作为 IO(输入输出)口使用,因此, B 方案的优势也就不那么明显了。
  C 方案采取74HC573+ULN2803的组合来驱动整个 LED 显示模块。74HC573 是一款3态非反转透明锁存器芯片,其输入能够和标准的 CMOS 相兼容。 当 OE(输出使能)有效时,便可通过对 LE(锁存)端的使能与否来控制 输出同步或是锁存。74HC573的相关信息如图3、图4和图5所示  

   ULN2803是常用的8重达林顿管驱动器 ,包含8个 NPN 达林顿管,具有高耐压, 大电流的特性,最高能承受50V 的电压,而最多可以吸收500ma 的电流,广泛应用于计算机,工业用和消费类产品中的灯、继电器、打印锤或其它类似负载中, 其能够吸收大电流的特性非常适合用来驱动一层 LED 灯同时点亮。ULN2803相关 信息如图6和图7所示:

  




关键词: 基于     STC15     系列     单片机     立体     显示系统         

专家
2013-01-07 11:10:20     打赏
2楼

   因此,在综合了驱动能力,程序编写难易度,电路复杂度等各方面因素后,最终选取了 方案 C 作为此次系统设计的驱动方案设计。并且在此基础上,我们设计了相应的原理图,并 且生成了 PCB 文件送往工厂制成实物,原理图如8所示:  

   2)LED 选型
  目前,市面上常见的 led 有雾面长方形 led 和草帽 led。led 发光体的体积 越小,整体的通透性就越好,也就是说后排的 led 就越不容易被前排的 led 挡 住;而另一方面,发光体越大,越容易看到光点,例如使用直径更大的 led 或是 使用雾面而非光面的 led 。最终,我们选取的是2×5×7的蓝色方形雾面 LED 灯,通过工具将其正负极完成一定的角度,以进行接下来的焊接工作,图9为 LED 实物图。  

   3)LED 焊接方案
  LED 灯的焊接是整个系统制作过程中非常重要的一环,因为 LED 灯排列的整 齐度直接影响了显示效果的好坏,另外,LED 非常容易受到静电的影响,焊接时 烙铁以及焊接的同学都要做好防静电处理,烙铁的温度对于焊接的影响也很大, 保持锡丝刚刚能融化时的温度即可。在此之前,可用3.3V 的纽扣电池检验 LED 灯的好坏,以避免以后不必要的麻烦。
  为了能够保证 LED 焊接后的整齐度,我们利用3片万用板拼接成了一块大的板子,并在其上适当的位置焊上排针,这样便可快速地焊出整齐的一层 LED 矩阵。 大大提高了工作效率,如图10所示。  

   8 层 LED 矩阵分别焊好后,便可进行整个系统的焊接,方法为依次将各层的 LED 矩阵用架子架起来,同时需要保证层与层之间的距离保持一致,以确保整体 的美观度。每架上一层后,用烙铁将相对应的 LED 正极焊在一起,而同一层的负极需要焊在一起,并且通过导线引出,建议每焊好一层后便通上电以检验是否有 LED 出现坏点的情况,如图 11 所示。  

   驱动电路的电源和开发板共用来自电脑 USB 的 5V 电源,实验表明,USB 电 源足以满足该系统正常工作。整个系统焊接完成后,便可通电以检验整个电路是否有问题。
  4)软件方案设计 若想系统有很好的显示效果,需要往单片机中存入相当多的图形与动画。与相同价位的其它单片机相比,IAP15F2K61S2 具有 61K 字节片内片内Flash 程序存储器,同时它还是增强型 8051 CPU,1T,单时钟/机器周期, 速度的提高使其能够有更好的显示效果。完全能够满足系统的软件需求,整个系统的软件流程图如图 12 所示:  

   整个系统共涉及到单片机的 IO 模块、AD 转换模块、定时器模块、外部中断 模块硬件资源使用情况如表 1:  

   函数主体中,定义了一个 8×8 的二维数组,通过给这个数组赋不同的值, 即可在每一层中显示不同的图案。扫描时不同列与不同层的切换在定时器的 中断服务程序中进行,因此,定时器初值的设置需要在一定范围内,这样显 示时便不会出现 LED 闪烁的情况。程序中我们用了定时器 0,下面是相关的 初始化程序和中断服务程序:
  void Init_Timer0()
  {
  IE=0x82; TCON=0x01; TH0=0xfc; TL0=0; TR0=1;
  }
  void display() interrupt 1
  {
  uchar i;
  static uchar layer=0; P3=0;
  for (i=0;i<8;i++)
  {
  P2=1<
  delay(3);
  } P3=1<
  layer++;
  else
  layer=0;
  TH0=0xfc; //0xfc
  TL0=0;
  }

  字符与图形的显示通过一款名为 PCtoLCD2002 的取模软件进行,该软件设置中有扫描方式、逐行扫描、逐列扫描、字宽、字长、共阳连接、共阴连接等可选项,分别可以满足不同的取模需要。取下来的数值在程序中赋给用来显 示的数组,这样便可以达到改变显示的效果。软件取模过程如图 13 所示  

   for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]=shuju[i][j];
  }
  }

  DS18B20 是单总线数字温度传感器,在与微处理器连接时仅需要一条口线即 可实现微处理器与 DS18B20 的双向通讯,在使用中不需要任何外围元件。在 开发板上,其数据端与单片机的 P1.2 相连,可以通过对其的初始化以达到探测周围环境的目的,相关程序如下:

  #include
  #include
  #include
  #include"delay.h"
  #include"DS18B20.h"
  extern uchar display[8][8];
  uchar display1[8][8];
  sbit DQ=P1^2; //ds18b20 端口
  uchar tab[]="0123456789";
  /**************************************************************************
  *************/
  //18b20 初始化函数
  void Init_DS18B20(void)
  {
  unsigned char x=0;
  DQ = 1; //DQ 复位
  delay1(80); //稍做延时
  DQ = 0; //单片机将 DQ 拉低
  delay1(800); //精确延时 大于 480us
  DQ = 1; //拉高总线
  delay1(100);
  x=DQ; //稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败
  delay1(50);
  }


专家
2013-01-07 11:10:45     打赏
3楼
  //读一个字节
  unsigned char ReadOneChar(void)
  {
  unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--)
  {
  DQ =0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ) dat|=0x80; delay1(50);
  }
  return(dat);
  }
  //写一个字节
  void WriteOneChar(unsigned char dat)
  {
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
  DQ = 0;
  DQ = dat&0x01;
  delay1(50); DQ = 1; dat>>=1;
  }
  delay1(50);
  }
  //读取温度
  unsigned char ReadTemperature(void)
  {
  unsigned char a=0; unsigned char b=0; unsigned char t=0;
  //float tt=0;
  Init_DS18B20();
  WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay1(2000);
  Init_DS18B20();
  WriteOneChar(0xCC); //跳过读序号列号的操作
  WriteOneChar(0xBE); //读取温度寄存器等(共可读 9 个寄存器) 前两个就是温度
  a=ReadOneChar();
  b=ReadOneChar();
  b<<=4; b+=(a&0xf0)>>4; t=b;
  //tt=t*0.0625;
  //t= tt*10+0.5; //放大 10 倍输出并四舍五入
  return(t);
  }
  void ShowTemperature(void)
  {
  uchar temp;
  uchar a,b,c,d,e,f,g,h,m,n,l,k; uchar i,j; temp=ReadTemperature()-1;
  a=tab[temp/10]; //十位温度
  c=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 d=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 e=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 f=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 g=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 h=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 k=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 l=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1; a=tab[temp/10]; //十位温度 m=tab[temp%10]; //个位温度
  temp=ReadTemperature()-1;
  a=tab[temp/10]; //十位温度
  n=tab[temp%10]; //个位温度
  b=(c+d+e+f+g+h+l+m+n+k)/10;
  switch(a)
  {
  case 48: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]=shi0[i][j];
  }
  }
  break;
  case 49: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]=shi1[i][j];
  }
  }
  break;
  case 50: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]=shi2[i][j];
  }
  }
  break;
  case 51: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]=shi3[i][j];
  }
  }
  break;
  default:for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]=shi2[i][j];
  }
  }
  switch(b)
  {
  case 48: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge0[i][j];
  }
  }
  break;
  case 49: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge1[i][j];
  }
  }
  break;
  case 50: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge2[i][j];
  }
  }
  break;
  case 51: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge3[i][j];
  }
  }
  break;
  case 52: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge4[i][j];
  }
  case 53: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge5[i][j];
  }
  }
  break;
  case 54: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge6[i][j];
  }
  }
  break;
  case 55: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge7[i][j];
  }
  }
  break;
  case 56: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge8[i][j];
  }
  }
  break;
  case 57: for(i=0;i<8;i++)
  {
  for(j=0;j<8;j++)
  {
  display1[i][j]|=ge9[i][j];
  }
  }
  break;
  }
  for(i二0;i<8;i++)
  for(j二0;j<8;j++ )
  {
  display[i][j]二displayl [i][j];
  }
  delayl(1000);

  作品特色

  以 STC15 系列单片机为控制核心的 LED 立体显示系统突破性地采取了立体显 示的方式,将以往二维平面上显示的图形动画等通过在立体的 LED 矩阵上扫描, 从而实现了图形和动画的立体显示,大大增强了 LED 显示的效果,提高了观赏性, 可以用在诸如广告宣传、夜景亮化、家居装饰等各种场合场合。除此之外,为了 增强它的实用性和功能性,我们分别在数字温度传感器和声音传感器的基础上, 增加了电子温度计和声音频谱的显示功能。单片机控制温度传感器 DS18B20 采集 周围温度信息,处理后同样以立体显示的效果显示在 LED 上。声音传感器采集来 的声音信号经过单片机进行 AD 转换,处理后的信息在 LED 上显示,形成了 LED 光柱随音乐节奏上下变换的效果。
  LED 立体显示系统共设置有待机模式、电子温度计模式、频谱显示模式、动 画演示模式和关机模式,通过设置的拨码开关,能够在各种模式间进行切换,简单易用。

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


共3条 1/1 1 跳转至

回复

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