基于单片机的光立方设计-优秀论文报告
- 格式:doc
- 大小:491.00 KB
- 文档页数:16
摘要本文详细的介绍了光立方的搭建过程,以51系列的单片机STC12C5A60S2为主要的控制芯片,由512个LED通过共阴的形式连接起来,由74HC595为扩展单片机的I/O口,用ULN2803为驱动电路,形成一个规格为8*8*8(长,宽,高)立方体,还介绍了这款芯片的特点和使用方法及在调试过程中遇到的软件和硬件方面的问题及解决方法,详细的阐述了光立方的设计原理和架构方法,对光立方目前存在的意义也进行了详细的介绍。
关键词:光立方;74HC573;单片机;ULN2803;LED目录1 引言 (1)2 总体设计 (1)2.1 光立方的基本原理 (2)2.2 光立方设计分析 (2)2.3 系统的结构框图 (2)3 详细设计 (3)3.1 硬件设计 (3)3.1.1 单片机 (3)3.1.2 移位寄存器 (3)3.1.3 端口驱动 (4)3.1.4 时钟电路 (4)3.2 软件设计 (5)3.2.1 程序流程图 (5)3.2.2 主要程序 (6)4 实验结果及分析 (12)4.1 硬件实物图 (12)4.2 实验结果分析 (12)5 心得体会 (13)参考文献 (14)1 引言自从国庆60周年联欢晚会开始演练后一个全新的名词——光立方,吸引了全国人民的关注。
光立方是由四千多棵光艺高科技“发光树”组成的,在2009年10月1日天安门广场举行的国庆联欢晚会上面世。
国庆联欢晚会三样法宝,光立方为最。
“光立方”在气势和整体感觉上,融合了北京奥运会开幕式“击缶而歌”和“活字印刷”的风格,而各种图案则与贯穿奥运会开幕式的“画卷”有异曲同工之妙。
“光立方”可以根据爱国歌曲的不同内容,展示不同的造型和图案。
光立方顾名思义是一个立方体,我采用的是8*8*8的模式,主要分为三个模块主控模块、驱动模块、显示模块。
我所做的光立方驱动电路,主控电路等都是纯手工焊接。
采用的主控芯片STC15F2K60S2芯片,驱动电路是采用我们常用的74HC573数字芯片。
利用512个LED组成的8x8x8的立方体结构,每层共64个LED采用共阴的接法,一共8层,利用锁存器74HC573与驱动器ULN2803的硬件组合而成。
基于STC 15F2K60S2单片机系统硬件组成的光立方,利用单片机控制LED的亮灭,并利用延时控制LED亮灭时间,最终使得整个立方体展现美轮美奂绚丽多彩造型和图案。
我们永远会记得2009年的庆祝60周年纪念日的那个晚上,由4028名表演者组成的光立方的图案,让世界人民感到耳目一新的感觉。
光立方的出现使得整个晚会上升到一个很高的高度。
那光立方的作用是很明显的,应用于现代的各种晚会的场合,会使得晚会变得有意义而精彩。
视觉上的冲击让人们会感到眼前一亮的感觉,相对于传统形式的晚会,带有高新科技的产品助阵会使得人们在精神上的生活变的精彩而又充足。
光立方的出现并不是偶然,而是社会发展的必然性,我们不能只活在过去式的生活里,科技的进步引领这时代的潮流,人们对科技产品的兴趣越来越浓厚,主要是其七彩颜色的变换,让人感觉处在一个神奇的王国当中,因为光立方通过LED灯的七彩颜色变换变的非常的美丽,其立体式的结构使得其渲染效果非常明显。
光立方的出现具有划时代的意义,对于人们以后的生活方式有了很大的提高。
此次光立方的设计使用的是单片机控制,降低了成本。
通过程序的编写使之能达到我们的要求,就像人的大脑,表达出人的思想。
多彩多色的LED展现出的画面就是它们的语言,就科技性非常的高。
创新能力不只是结构的变化,更在于我们是如何控制去展现它们。
2 总体设计2.1 光立方的基本原理本系统设计主要以STC12C5A60S2单片机为核心,并以512个蓝色LED灯做为显示模块组成的光立方,主要有主控模块、驱动模块、显示模块构成,2.2 光立方设计分析本次设计使用STC12C5A60S2比普通单片机速度高出几倍的单片机实现一基于单片机的光立方的设计,主要由三部分组成:主控模块、驱动模块、显示模块。
本光立方可以实现显示各种图案、显示时长约为7分钟2.3 系统的结构框图图2.1 电路的总体设计框架3 详细设计3.1 硬件设计3.1.1 单片机的简单介绍采用单片机STC12C5A60s2为核心,此单片机是STC生产的单时钟/机器周期(IT)的单片机,是高速/高可靠/低功耗/超强抗干扰的新一代8051单片机,采用第八代加密技术,加密性超强,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成高精度R/C 时钟,±1%温飘,常温下温飘5%。
,5MHz—35MHz宽范围可设置,可彻底省掉外部昂贵的晶振和外部复位电路(内部已集成高可靠复位电路,8级可选复位门槛电压)。
3路CCP/PWM/PCA(可实现3个定时器或3个D/A转换器); 8路高速10位A/D转换器(30万次/秒),内置2K字节大容量SPAM,两组高速异步串行通信端口(UART1/UART2,可在五组管脚之间进行切换,分时复用可作5组串口使用),1组高速同步串行通信端口SPI,针对多串行口通信/电机控制/强干扰场合。
综合考虑采用 STC--IAP15f2k60s2为核心,此单片机是在MCS—8051基础上的进一步加强,是一种多综合版块。
并且此单片机有以下几大优点:1、对于此超强的抗干扰性和加密性2、采用STC第八代加密技术3、不需要外部晶振和复位电路的单片机4、可省掉外部EEPROM,利用IAP技术5、ISP/IAP,在线编程,无需编程器/仿真器6、大容量2K字节SPROM7、高速10位A/D转换器,8通道8、低功耗,低价格3.1.2 移位寄存器的简单介绍74HC573是高性能硅门CMOS器件SN74HC573跟LS/AL573的管脚一样。
器件的输入是和标准CMOS输出兼容的,加上拉电阻,他们能和LS/ALSTTL输出兼容。
当锁存使能端LE为高时,这些器件的锁存对于数据是透明的,(也就是说输出同步)。
当锁存使能变低时符合建立时间和保持时间的数据会被锁存。
3.1.3 端口驱动的简单介绍NPN八达林顿连接晶体管是低逻辑电平数字电路(如TTL,CNOS或PMOS/NMOS)和大电流高电压要求的灯、继电器、打印机锤和其它类似负载间的接口的理想器件。
广泛用于计算机,工业和消费类产品中。
所有器件有集电极开路输出和用于瞬变抑制的续流二极管。
ULN2803的设计与标准TTL系列兼容,而ULN2804可使6至15伏高电平CMOS或PMOS优化。
控制系统模块由STC12C5A60S2单片机,电源模块及指示系统组成。
系统由4节CR2032纽扣电池组成6V的电池组供电,单片机P0口与8个74HC573的输入端相连,P1口与ULN2803的输入端连接,P2口与74HC573的使能端相连,将单片机的两个外部中断P3.2、P3.3用作按钮。
将二极管IN4007串接于单片机的40脚VCC端与电池正极之间,使的单片机两端的电压处于额定电压范围内。
3.1.4 时钟电路设计时钟电路时,我们首先必须先了解单片机时钟端口的使用和特点:XTAL1(AT89C51中19 脚):单片机内部振荡电路的输入端口。
XTAL2(AT89C51中18 脚):单片机内部振荡电路的输出端口。
XTAL1 与XTAL2其实就是一个反向的放大器,它可以与石英晶振连接作为一个时钟振荡电路。
内部方式的的时钟电路就是如图3-3所示,只要在XTAL1、XTAL2上接一个石英晶体并在两端接两个电容,这样就可以产生一个内部激荡电路,这里需要注意的是此实验用的晶振是12MHZ的,和晶振相连的电容一般选用33PF的陶瓷电容。
外部方式的时钟电路就是如图3-4所示,RXD直接接地,TXD再接外部振荡器。
外部振荡信号要求采用频率低于12MHZ的方波。
图3.1 内部方式时钟电路图3.2 外部方式时钟电路要检测晶振是不是正常工作可以通过示波器来检查,方法是在XTAL2 输出端接示波器并观察波形是不是正弦波,要是是正弦波则正常工作,反之则不正常工作。
也可以通过电压表来测量,侧量XTAL2 输出端与地的电压,要是2V则正常工作。
3.2软件设计3.2.1 程序流程图一般编写程序都是从功能出发,要求怎么的功能就写怎么的代码,本系统都是采用C语言的编码格式编写的代码。
流程图如3-3所示:图3.3 主程序流程图程序的开始之前必须要写好各个模块的初始化定义,初始化的内容有中断初始化,定时器的初始化,串口的通信方式和波特率的选定,I/O口的设定等等。
3.2.2 主要程序#include<STC12C5A60S2.h>#define uint unsigned int#define uchar unsigned charsbit keyamenu=P4^4; //按键sbit keyout=P4^5;sbit keymenu=P4^6;uint code tab_water[]={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0080,0x0140,0x0080,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, };char code tab00[]={7,7,7,7,7,7,7,7,6,5,4,3,2,1,0,0,0,0,0,0,0,0,1,2,3,4,5,6}char code tab_mian[]={4,3,7,2,0,6,1,5};char code tab_xian[]={5,0,3,6,1,7,4,2};char code tab_dian[]={};uchar code tab_shandian[]={uchar code tuku1[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,0xff};uchar codetable1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff/*0X1C,0X3E,0X7E,0XFC,0XFC,0X7E,0X3 E,0X1C*/};uchar code table2[]={0Xe0,0Xe0,0Xe0,0xe0,0Xe0,0Xe0,0Xe0,0Xe0,0X07,0X07,0X07,0X07,0X07,0X07,0X07,0X07 };char num;char c[6];//用于存储5个不同频率的幅值char b[6];//用于使音谱柱形显示的平滑char amenu,menu,out;int xdata Real[64]; //实部int xdata Image[64]; //虚部void delay(int t){ int i;while(t--)for(i=0;i<700;i++); }void delay1(int t){ char i;while(t--)for(i=0;i<20;i++); }void clc()//全局清屏{ P3=0;P2=0xff;P0=0;P2=0; }uchar daoxu(uchar x) //一字节倒序{ uchar k=0;char i;for(i=0;i<8;i++){ if((x>>(7-i))&0x01)k|=0x01<<i; }return k; }void key_menu_scan(){ if(!keymenu){ delay(30);//按键驱抖if(!keymenu){ P3=0; menu++;if(menu==4)menu=1; }while(!keymenu); //释放判断} }void xuanzhuantiao(char kind,char num,char v) //空心旋转,kind=1实心,否则空心{ uchar a[64]={0}; char i,j,k;while(num--){ for(i=0;i<14;i++){ for(j=0;j<8;j++){ for(k=0;k<8;k++){ if(k>1&&k<6&&j>1&&j<6&&kind!=1)a[k+j*8]=tab_xuanzhuantiao[i*8+k]&0xc3;elsea[k+j*8]=tab_xuanzhuantiao[i*8+k]; } } zhen(a,v); } } }void qumianxuanzhuan(char kind,char num,char v)//曲面旋转{ uchar a[64]={0};char i,j,k;for(j=0;j<8;j++)for(i=0;i<8;i++)a[i+j*8]=tab_xuanzhuantiao[i];zhen(a,v);if(kind==1){ for(j=1;j<8;j++)//顺时针初形变换{ for(i=0;i<j;i++)for(k=0;k<8;k++)a[k+i*8]=tab_xuanzhuantiao[(j-i)*8+k];zhen(a,v); }for(i=8;i<14;i++){ move(a,2,1,1);for(j=0;j<8;j++)a[j]=tab_xuanzhuantiao[i*8+j];zhen(a,v); } }else{ for(j=1;j<8;j++)//逆时针初形变换{ for(i=0;i<j;i++)for(k=0;k<8;k++)a[k+i*8]=tab_xuanzhuantiao[(14-j+i)*8+k];zhen(a,v); }for(i=7;i>=0;i--){ move(a,2,1,1);for(j=0;j<8;j++)a[j]=tab_xuanzhuantiao[i*8+j];zhen(a,v); } }while(num--)//主循环{ if(kind==1)for(i=0;i<14;i++){ move(a,2,1,1);for(j=0;j<8;j++)a[j]=tab_xuanzhuantiao[i*8+j];zhen(a,v); }elsefor(i=13;i>=0;i--){ move(a,2,1,1);for(j=0;j<8;j++)a[j]=tab_xuanzhuantiao[i*8+j];zhen(a,v); } }if(kind==1)for(j=0;j<7;j++){ for(i=7;i>=j;i--){ if(i>j)for(k=0;k<8;k++)a[k+i*8]=tab_xuanzhuantiao[(14-i+j)*8+k];elsefor(k=0;k<8;k++)a[k+i*8]=tab_xuanzhuantiao[k]; }zhen(a,v); }elsefor(j=1;j<7;j++){ for(i=7;i>=j;i--){ if(i>j)for(k=0;k<8;k++)a[k+i*8]=tab_xuanzhuantiao[(i-j)*8+k];elsefor(k=0;k<8;k++)a[k+i*8]=tab_xuanzhuantiao[k]; }zhen(a,v); } }void xzcube(){ char i;donghua(y_table,6,8,8);for(i=0;i<26;i++){ if(i==12||i==13||i==14)zhen(yx_table+i*64,30);elsezhen(yx_table+i*64,14); }donghua(x_table,6,8,8);for(i=0;i<26;i++){ if(i==12||i==13||i==14)zhen(xz_table+i*64,30);elsezhen(xz_table+i*64,14); }donghua(z_table,6,8,8) }/**********初始化函数*****************/void init(){/***********I/O口初始化*************/P1M1=1; P1ASF=1; P3M0=0xff;P2M0=0xff; P0M0=0xff; P4SW = 0x31;TMOD=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;EA=1; ET0=1; TR0=0;menu=0; out=0; amenu=0; num=0; }/*************主函数******************/void main(){ int i,j; char go;delay(800);init();delay(400);while(1){ donghua(sin_cube_table,14,22,5); //波浪denghuo(3);szfc0(10); //字幕,兼有计时zimu(number,19,12,1); //字幕,cube滑动linkpc1(10); //字幕,l love youpc1(4,3);leitu(yc_table,5,2)clc(); //一面转动link_jb0(1);jb0(10,3);for(i=0;i<7;i++) //字幕,顶层亮,往下学字print(tab_print+i*8,1);for(i=7;i<11;i++)print(tab_print+i*8,0); } }4 实验结果及分析4.1 硬件实物图焊接好的电路实物图如图所示;接入电源光立方开始显示各种图案,时长约为7分钟。