光立方毕业设计 - 图文

更新时间:2024-03-12 03:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于STC12C5A60S2的光立方设计

【摘要】 本次设计使用512个LED灯制作8*8*8的LED立方体,命名为光立方。采用

STC12C5A60S2芯片作为主控,8个74HC573锁存器和一个ULN2803芯片扩展I/O口,作为外围控制。通过编程控制I/O口,点亮指定的LED灯,使得显示不同的画面。8*8*8光立方因点亮LED灯将会形成各种图形,如爱心、数字、雨滴、正方体等十几种画面。整个立体呈现不同的造型和图案,动画衔接完美,使其变得美轮美奂、绚丽多彩,立体感十足。此外,我们还可以外接音频输入,通过AD采样,快速傅里叶变换FFT,可以让光立方显示音频频谱。经过系统测试,最终达到设计要求。

【关键词】 光立方 STC12C5A60S2 74HC573 ULN2803

Based on STC12C5A60S2 of the Light Cube Design

【Abstract】:The 8*8*8 LED cube is made of 512 LED lights,named Light Cube

which used STC12C5A60S2 as main control chip,it has 8 74HC573 latches extended I/O ports,and a ULN2803 chip as out control. Through programming control I/O port, the LED light. 8 * 8 * 8 cubic light for light leds will form a variety of graphics, such as love heart,numbers,rain,cube and so on. animation, cohesion is perfect, stereo sense is dye-in-the-wood. In addition, we also can external audio input, through the AD sampling, fast Fourier transform FFT, can let light cube display audio spectrum. After the system test, finally to meet the design requirements.

【Keywords】: The Light Cube STC12C5A60S2 74HC573 ULN2803

1

目 录

【摘要】 ....................................................................................................................................................... 1 【Abstract】 ................................................................................................................................................. 1 目 录 ............................................................................................................................................................... 2 第一章 引言 ................................................................................................................................................... 1

1.1光立方的研究意义 ............................................................................................................................ 1 1.2发展历程和现状................................................................................................................................ 1 1.3 光立方的功能和特点 ....................................................................................................................... 1 1.4 光立体的优越性以及主要应用 ...................................................................................................... 2 第二章 控制模块设计.................................................................................................................................... 3

2.1 系统总框图 ...................................................................................................................................... 3 2.2 总体方案的选择............................................................................................................................... 3

2.2.1主控芯片................................................................................................................................. 3 2.2 总体方案的选择............................................................................................................................... 3

2.2.1主控芯片................................................................................................................................. 3 2.2.2 电源选择................................................................................................................................ 4 2.2.3 元件选择................................................................................................................................ 4

第三章 光立方显示部分概述 ........................................................................................................................ 7

3.1 光立方的制作................................................................................................................................... 7

3.1.1 光立方的原理 ........................................................................................................................ 7 3.1.2 LED灯的选用 ..................................................................................................................... 7 3.1.3 LED灯的焊接 ........................................................................................................................ 9 3.2显示部分检测.................................................................................................................................. 10 第四章 硬件设计 ......................................................................................................................................... 13

4.1最小系统 ......................................................................................................................................... 13 4.2 按键模块 ........................................................................................................................................ 13 4.3功放模块 ......................................................................................................................................... 14

4.3.1 功放原理图 .......................................................................................................................... 14 4.4呼吸指示灯 ..................................................................................................................................... 15 4.5 竖排控制电路................................................................................................................................. 15 4.6 光立方层控制电路 ......................................................................................................................... 16 4.7 硬件电路焊接................................................................................................................................. 17 4.8 元件清单 ........................................................................................................ 错误!未定义书签。 第五章 系统软件设计.................................................................................................................................. 19

5.1 软件设计总体思路 ......................................................................................................................... 19

5.1.1 程序设计框图 ...................................................................................................................... 19 5.1.2 显示程序设计 ...................................................................................................................... 20 图5-3 伸缩动画流程图 ............................................................................................................. 21 5.1.3音频信号频谱分析 ............................................................................................................... 22

第六章 系统调试与测试结果 ...................................................................................................................... 24

6.1 软件调试 ........................................................................................................................................ 24

2

6.2 光立方初步调试............................................................................................................................. 25

6.2.1检查电源............................................................................................................................... 25 6.3 光立方最终调试............................................................................................................................. 26 6.4 光立方测试遇到的问题 ................................................................................................................. 26 结论 ............................................................................................................................................................... 27 致谢语 ........................................................................................................................................................... 28 参考文献 ....................................................................................................................................................... 29 附录 ............................................................................................................................................................... 30

附录1:实物图 .................................................................................................................................... 30 附录2:系统总原理图 ......................................................................................................................... 31 附录3:呼吸灯PCB ............................................................................................................................ 32 附录4:光立方主程序 ......................................................................................................................... 32

3

第一章 引言

本章简要介绍了光立方的研究意义、发展和现状,以及所设计光立方的功能特点,光立方的优越性,并依此提出了本论文研究的主要内容。

1.1光立方的研究意义

LED点阵显示屏已经应用到了我们生活中的方方面面,科技发展的脚步一直向前,3D电影给人带来了震撼的视觉体验,于是想设计出一种3D显示屏。通过学习《单片机原理与应用(第二版)》一书,知道LED静态显示和动态显示,以及两种显示的控制方法。LED点阵显示屏的特点有比数码管实用、便宜、亮度高等优点,而且做出来的LED显示很耐用。具有亮度高、工作电压低、功耗低、小型化、寿命长、耐冲击和性能稳定等优点。LED显示屏发展前景极为广阔,利用LED做成3D显示屏,3D LED显示不仅可以像LED点阵一样显示平面动态或静态图案,同时还可以立体显示动态或静态图案,打破了传统平面显示的方式。更是给人不同视觉盛宴。

1.2发展历程和现状

二十一世纪将是平板显示的时代,基础材料产业化,使LED灯生产工艺更加完善,成本更低,应用加快发展。LED产品性能的提高,使全彩显示屏的亮度、色彩、白平衡均达到了比较理想的效果,完全可以满足各种相对复杂的坏境条件要求。同时,由于全彩色显示屏价格性能比的优势,预计在未来几年中的发展中,全彩LED 3D显示屏在户外广告媒体中越来越多的代替传统的磁翻板、灯箱、霓虹灯等产品,体育场馆、舞台的显示方面全彩LED 3D显示屏更会成为主流产品1。全彩色LED 3D显示屏的广泛应用会是LED 3D显示产业如发展的一个新的增长点。未来LED 3D显示屏会向着规范化、标准化、产品结构多样化等方向发展。

目前,我国主要的LED广告大屏幕制造厂商主要集中在华北、华东、华南区域,大型制造商的市场范围几乎覆盖了整个中国市场。国产LED大屏幕性价比比较高,以其独有的优势占据了很大一部分市场份额。我国LED显示屏产业的快速发展,逐步形成了一批具有一定规模的骨干企业,而且产品不断推陈出新,使LED显示屏产业成为我国电子信息产业的重要组成部分,也是平板显示领域唯一立足国内形成的民族高科技产业。

1.3 光立方的功能和特点

1、8*8*8的LED阵列立体显示器。

2、连贯图形显示效果,浑然一体,一气呵成,能给观赏者带来立体的可视的震撼视觉效果。

3、超炫的立体动态显示,多种显示样式,如面平移、数字倒计时、方框伸缩、心跳动、雨滴等十多种动画。

4、具有音频频谱显示模式,可随音频同步显示,给观赏者视觉和听觉双重体验。

1

5、全开放式用户自定义操控,用户可根据自己的喜好自行编写对应的程序。

6、光立方内置两种模式:图形自动播放模式、音频显示模式,K2选择音频模式,K3选择图形自动播放模式。

1.4 光立体的优越性以及主要应用

1. 3D以其亮度高,功耗低,视角大,寿命长,可视距离远等优点而具有极为广阔的发展前景。随着人们生活水平的提高,3D LED逐渐应用于各行各业。人们对其的要求也越来越高,已经不再满足于二维平面,进而转向三维平面。3D LED的出现是一个很好的契机。

2. LED光立体极具观赏性,人们可以根据自己的要求,设计不同的图案, 展现不同的立体效果。可以说它是变幻无穷的。因其极大地观赏性,使人们在接受信息,数据的同时更加印象深刻,使信息的传输更有效率。

3. 随着3D技术的逐步发展,3D LED被广泛应用于现实生活中,比如LED显示屏,LED图像,LED立体摄影。这些技术在我们的生活中随处可见,电影院,会议场合,舞台设计,以及各种娱乐场所。

2

第二章 控制模块设计

2.1 系统总框图

光立方系统主要框图如图2-1所示,主要包括主控部分、LED显示部分、电源模块、

功放模块、以及呼吸指示灯模块五部分。电源开关打开后,呼吸指示灯工作,系统初始化完成后,等待选择音频显示还是动画自动播放模式,进入音频模式后可伴随音频显示“跳舞”动画。

图2-1图系统方框图

2.2 总体方案的选择

2.2.1主控

光立方系统主要框图如图2-1,主要包括主控部分、LED显示部分、电源模块、运放模块、以及呼吸指示灯模块五部分。整个系统又分软件部分和硬件部分,良好的硬件设计为软件的执行提供支撑,为系统工作提供硬件实体;软件为系统的工作提供各种算法,软件与硬件的的结合,是系统高效工作的基础。

2.2 总体方案的选择

2.2.1主控芯片

本次设计首先要实现光立方的立体扫描,产生出特定的显示效果。通过设计多种多样的动态图画,给人一种绚丽多彩的效果。此外还要求显示效果能依音乐节奏而跳动,这就要求对音乐进行采集。对音乐采集可以采用独立AD芯片,或者选用内带AD转换功能的MCU。为此,有三种选择。

选择一:采用STC89C52单片机作为主控,独立AD0808或者AD0804芯片用做音频采集。 选择二:采用红晶科技公司的STC12C5A60S2芯片作为主控。

3

STC12C5A60S2芯片有以下几个特点: (1)其和8051指令、管脚完全兼容。

(2)片内的具有大容量程序存储器且是FLASH工艺的。 (3)低功耗设计,擦写次数10万次以上。

(4)自带高达60K字节FLASHROM,这种工艺的存储器用户可以用电的方式瞬间擦除、改写,具有串口烧写编程功能。

(5)I/O口驱动电流均可达到20mA,但整个芯片最大不得超过100mA。 (6)另外同样晶振的情况下,速度是普通51单片机的8~12倍,有8路10位ADC,采样速度可达到25万次/秒,且超强抗干扰。 选择三:采用DSP芯片作为主控。

DSP又叫数字信号处理器。顾名思义,DSP主要用于数字信号处理领域,非常适合重复运算,高密度及大数据容量的信号处理2。现在已经广泛应用于通信、便携式仪表、

3

便携式计算机和雷达、图像、家用电器、医疗设备等领域。其优点有:

(1)DSP具有硬件乘法器以及特殊指令,依靠硬件乘法器单周期完成乘法运算。 (2)具有专门的信号处理指令,相对于其他微处理器用软件实现各种算法速度快好多倍。

(3)芯片内置544字的高速SRAM。

通过分析以上三种方案,都有其各自优点而且都可以实现控制过程。DSP的强大数据处理能力和高运行速度,是最值得称道的两大特色,价格较高,本次设计也没必要那么高的处理速度。单片机的技术门槛较低,开发成本也较低。STC89C52芯片成本很低,在处理速度上较STC12C5A60S2慢的多,容量也小,。同时为实现本次设计,还需外加AD采集芯片,加大硬件设计难度。由于光立方的动画效果和程序量比较大,而且要求相对比较高。考虑到价格,性能方面因素,最终选取处理速度较快、存储较大且价格适中的STC12C5A60S2芯片作为核心控制芯片。 2.2.2 电源选择

直接采用5V移动电源。 2.2.3 元件选择

(1)由于灯的个数比较多,每层64个LED并联共阴,这样分流到每个LED的电流

会变得非常小,会造成无法点亮或者半亮,影响显示效果。因此所需要的电流相对也比较大,可以选择ULN2003或者ULN2803,两者都是反向输出,输出能力可达500mA /50V,可用来做光立方共阴层驱动。但前者只能驱动七位,而后者可以驱动八位,所以选择ULN2803驱动。ULN2803是八重达林顿晶体管阵列,1 脚至 8脚为8路输入, 11到 18脚为8路输出,应用时9脚接地,要是驱动感性负载,10脚接负载电源V+。其内部结构如图2-2。其特点有:

1、可直接驱动继电器。 3、可用于电平转换。

4、输入的电平信号为高低电平(5V或0V),输入低电平时,输出达林顿管截止。输入为高电平时,输出达林顿饱和。

4

图2-2 ULN2803内部结构

(2)要做到光立方每一个LED可以自由控制,就需要64列共阳脚都要控制,而STC12C5A60S2单片机I/O显然不够,为了单片机送出下一组显示数据时不会立刻丢掉前一次显示数据而造成图像不完整,本人选用带有数据锁存功能的74HC573芯片,如图2-3所示74HC引脚图。八个锁存器都是透明的D 型锁存器,当使能(G)为高电平时,Q 输出将随数据(D)输入而变。当使能为低电平时,输出将锁存在已建立的数据电平上。输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。特别适用于缓冲寄存器,I/O 通道,双向总线驱动器和工作寄存器。对它的使用也比较成熟,因此在驱动部分使用了熟悉的74HC573,其控制逻辑如图2-4所示。其优点有:

1.高阻态;就是输出既不是高电平,也不是低电平,而是高阻抗的状态;在这种状态下,可以多个芯片并联输出。

2.数据锁存;当输入的数据消失时,在芯片的输出端,数据仍然保持。 3.数据缓冲; 加强驱动能力。

输入 OE′ L L L H LE H H L X D H L X X 输出 Q H L Q0 Z LE为锁存控制端 OE为使能端 1脚三态允许控制端低电平有效 1D~8D为数据输入端 1Q~8Q为数据输出端

5

图2-3 74HC573引脚图

2.2.4 光立方显示电路的基本框图

LED光立方主要用到了STC12C5A60S2单片机中的P0口、P2口、P3口 、串行输入输出端以及外接晶体引线端XTAL1和XTAL2。I/O口分配如图2-5所示。

图2-5 I/O分配图

P0口作为数据输出端,单片机控制数据传送到8个74HC573锁存器的输入端,而8个74HC573锁存器输出端分别控制一排8列LED阳极引脚。

P2口作为数据输出端,单片机送出数据控制使能端而实现锁存器的数据输出与锁存,从而控制数据在某一时刻输出到指定某一排或某几排。

P3口作为数据输出端,单片机内部输出控制数据传送到ULN2803的输入端,进而控制每一层。通过ULN2803数据没有发生任何变化,只是电流前后有很大差别,这时候电流将增大很多。

6

第三章 光立方显示部分概述

3.1 光立方的制作

3.1.1 光立方的原理

借鉴LED点阵控制原理,将光立方可以看做是8个8*8点阵屏的层叠一起。点阵屏的显示便是光立方一层的显示,只要通过程序再次控制8个层,便可以实现光立方的显示,由于人眼的视觉暂留,使我们感觉到看到的东西是一起在亮的,这样我们就可以看到一个完整图像,这是本次设计的基本原理。设计3D 图形,需要有新的思维方式,发现三维空间中点、线、面、体的算法规律。展示3D效果的超炫表现力,让人享受各种视觉上的冲击,迎合3D显示时代的到来。光立方分解为8个8*8LED点阵叠成8层,再用8个引脚来充当8个点阵的开关。单片机P0、P2、P3实现控制XYZ空间立体控制来显示特定图案。 3.1.2 LED灯的选用

本次设计旨在让光立方动画显示更加绚丽多彩,因此使用2*5*7 雾状散光扁方形磨砂LED(红、黄、蓝三种),红和黄分别三竖排,剩余两排用蓝色LED。这种灯型更容易看到光点,以获得更好的视觉效果。额定电压范围3.0~3.2v,额定电流15~18mA,管脚长度27-29mm,实物图如图3-1所示:

7

图3-1 LED实物图

首先,要进行LED灯立体矩阵的搭建。LED搭接过程还是比较困难的,8*8*8=512LED,分为8层,每层8列,每列8个LED灯,列内共阳,层内共阴,如图3-2所示。为使光立方外形的美观,每一片的LED阵列都要求排列整齐,互相看齐,这对焊接的能力有一定的要求。

图3-2 光立方焊接示意图

第一步:水平折弯。这个因为LED本身管脚上有个结,可以徒手完成。本次设计是层内共阴,同时为了视觉效果更好,本人将阴极管脚在水平方向折弯90°,并使之与LED面垂直,如图3-3所示。同样的方法,将512个LED灯的阴极都水平折弯。为了焊接的统一性,在折弯的时候尽量保持角度一致。

8

图3-3 LED水平折弯 图3-4 LED垂直折弯

第二步:垂直折弯。可利用尖嘴钳将LED灯阳极管脚向外折一次再折回原来的方向,如图3-4所示。这个弯,一定不要太大,正好露出LED外围2mm打弯合适,LED的正极折弯后留下的引脚长度必须大于LED的间距25.4mm,以确保有足够的重合位置以便焊接。LED灯上下之间焊接的时候就就会发现这一步是非常必要的。 3.1.3 LED灯的焊接

为了方便焊接,自制简易模具,模具孔位间隔要提前量好,保证在管脚搭接时不要太多或者不能焊接。然后按照单独8竖排分别焊接,每一排8列,如图3-5所示。接着将折好的LED灯插入一列,其阴极管脚正好搭接在一起,完成焊接如图3-6和图3-7。在这里本人发现有非常值得注意的一点,因为LED比较脆弱,在焊接过程中很容易因为高温而烧毁LED灯,对于这一点,应该尽量缩短电烙铁接触时间。同时为了确保每一个LED都没有问题,在完成一层后都要检查是否可以点亮。

图3-5 LED布局示意图

9

图3-6 LED焊接图

图3-7 LED焊接图

3.2显示部分检测

对于焊接完成的检测这一步非常重要,如果安装完成后再更换LED灯是非常麻烦的

事。

分别焊接完8竖排LED灯后,将每一竖排LED的都进行检查,确保每一个LED都可以点亮。这里本人直接在电脑USB输出口引出电源。这里值得注意一点,USB输出电源最低3.3V(USB转串口),最高5V左右(本人用数字万用表测了一次是5.16V)。而LED灯压降不超过3V,为了因电压过高烧毁LED灯,在测试之前我们可以选择了一个适中电阻接在电源一端。

10

(a) (b)

(c) (d)

图3-8 检测过程

接下来将电源正极接在第一列LED阳极引脚,负极端依次触碰各行阴极管脚,观

察并记录坏掉的LED,如图3-8-1所示。然后将电源正极接到第二列,负极端依次触碰各行阴极管脚,如图(a)、(b)、(c)、(d)用同样的方法,将8竖排全部检测完成。最后将更换新的LED灯再检查一遍。

另外,还可以将一竖排同时点亮的方式进行检测,这样做可能会出现某些LED灯因电流太小无法点亮出现误判的情况。虽然逐个点亮这样的检测方式效率很慢,但可以有效避免上述误判现象,防止后期发现给更换带来更大的不便。在一定程度来说,这样做也是在提高工作效率。

11

图3-9 LED立方体焊接

最后将完成后的8个面进行组成立体焊接,其方法将之前8个面上同一层上阴极依

次焊接一起,形成层共阴,用8条细导线分别连接8个层与ULN2803输出端相连。底层留下64个阳极引脚与8个74HC573输出端分别焊接一起。如图3-9所示。

12

示。

图4-11 74HC573焊接 图4-12 光立方组装

8个74HC573锁存器分别对应LED灯阵列的8竖排,因此在芯片安插的时候按照

一定顺序摆放,如图4-11所示。 细导线质地柔软,焊接后显得较为杂乱,所以焊接完成每一条走线的时候用万用表测试是否断路。最后为防止多次检查而弄断走线,可以用热熔胶适当固定一下。焊接完成后将上下两层用四根铜柱固定。通过四个铜柱卡位,可以使排插和排针正好镶接在一起,这样做的好处就是方便拆卸,能够后期检查以及功能扩展,如图4-12所示。

另外,在这里值得指出的一个亮点是,本人在LED电源附近加了一个104瓷片电容,如图4-9所示。因为硬件焊接完成后,检查硬件电路无误后,安装LED灯阵列,通过不断测试发现光立方会全亮或者不亮。无意想起玩具小车电路上在电源上加了电容,本人试了一下,结果动画才可以完美显示了。通过上网查资料才知道,平时所用电脑USB接口或者移动电源并不是很稳定,容易因为形成干扰。连接电容,主要用于降低电源内阻,改善电源带动负载的能力,滤除低频干扰等。

18

第五章 系统软件设计

5.1 软件设计总体思路

本次光立方设计中,要求通过软件编程控制P0、P2和P3口各个位高低实现对每

一个LED灯的亮灭控制,在程序中运用for或while循环、if语句、带参函数等方法,用最少的语句达到最佳的显示效果。为了能够增强显示效果吸引观众眼球,可以选择编写多种显示模式。最简单的显示模式是静态显示。与静态显示模式相对应,就有动态显示模式,它们所显示的图文都是能够变化的。按照图文运动的特点又可以分为雨滴、翻转、旋转、缩放等多种显示模式,这就需要建立各种动画代码数组。但是为了显示很多种不同动画,并不意味着一定要重新编写显示数据,可以通过一定的算法从原来的显示数据直接生成,这样程序编写就不会过于繁琐和重复。 5.1.1 程序设计框图

光立方程序设计主要是控制P0、P2、P3口通过高低电平组合,不同时刻点亮不同LED,在这里就需要考虑数据刷新率的问题。我们知道当显示器播放速率大于15帧的动画,才会在人眼中形成流畅的效果,为此就需要一个准确的时间基准来一次点亮光立方的每一层,这个值有单片机定时器设置,同时很可能还需要其他数据的采集和处理,所以也应该使用多种中断。

分析系统该具有哪些功能,应该编写那些子函数,各个模块之间是如何调用。本次程序设计分三大模块,第一部分是部分建立多种动画和数字代码数组;第二部分编写两种模式执行算法,调用建立好的动画代码库;第三步部主程序,用于扫描按键进入哪种工作模式,FFT()函数和Dis()。然后编译下载到硬件并依据测试结果找出程序中的错误,改正这些错误至测试成功。 开始

系统初始化 按键扫描 N N 按键 K2? 按键 K3? Y

音频频谱动画 键盘扫描

N 按键K1? AD初始化

频谱显示 自动播放模式 开始动画播放

19 结束

图5-1 系统主程序流程图

本次设计采用Keil4软件编写C语言程序,C语言简洁灵活、通俗易懂、兼容性高、编译方便快捷。并且将整个程序分成多个子函数,例如单片机初始化、主程序、按键扫描、显示程序四部分进行编写。初始化过程包括中断初始化、中断优先级配置、定时器配置、AD初始化。在编写程序时,为了方便多次调试,首先可以将每个子程序编写成一个可以独立执行的完整程序,编译没有错误后下载到单片机进行验证。各个子程序都测试成功后整合成一个综合程序,编译完成后,再次下载到单片机进行整体测试。 5.1.2 显示程序设计

显示程序本人主要建立多个动画数组,这个可以用已有的取模软件提取动画代码,同时也要自己编一些个性动画代码。采用动态扫描方式调用显示函数。所谓动态扫描显示就是一个完整的画面分成好几帧显示,每一时刻只显示画面的一帧,如果显示间隔很小,人眼的视觉无法分辨,利用人眼暂留原理,就可以看到一幅完整图像。

一、自动播放动画流程图

menu是K1按键,通过K1按下次数选择执行不同动画模式,程序见附录四中模块一。 开始

按键选择while(1)

Switch(menu)

case 1: case 2:

自动播放动画 模拟音频动画

MODE_Music()

结束

图5-2 自动播放模式流程图

1.1 动画一:面平移流程图

光立方动画显示,就必须不断在每个完整图像显示后延时一会,再次刷入新的数据,不断刷新不同图像数据,就可以看到图像动起来了。图像之间切换速度很快,在人们眼中显示的效果便是流畅的动画。

20

开始

系统初始化 显示数据送 P0 P2选通列,锁存器输出 选通数据左移 左移次数 >8 显示完成 子程序返回 图5-2 面平移显示流程图

1.2 动画二:方框伸缩动画流程图如5-3所示,程序见附录四中子模块二。 go:上次动画执行结束标记go=1,否则go=0。

if(go) go=0; 进入shensuo() 执行伸缩代码库 动画显示 go=1 下一动画开始 图5-3 伸缩动画流程图

至此,其他动画流程图就不再一一列举了。

21

5.1.3音频信号频谱分析

FFT是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。

设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N^2次运算。当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。这样变换以后,总的运算次数就变成N+2*(N/2)^2=N+(N^2)/2,转换过程如图5-3所示

图5-3 N=8 DFT-FFT

首先,我们用ADC去采样一个模拟信号之后,使之变为数字信号。若我们N个采样

点,经过FFT运算之后,就可以得到N个点的FFT结果。但通常为了方便进行FFT运算常N取2的整数次方。而本次光立方设计可以采集16便可以满足要求,由于FFT结果的对称性,通常只使用前N/2个采样点的结果。

基2-FFT算法是倒位序存储,但算法完成后结果按正序输出,将原始采样数据放在数组tab[16]中,tab[0]存放第一次读取的AD转换数据,tab[1]存放第二次读取的AD转换值,一次类推,完成16次转换呢值得存放,倒叙输出存放在tab1[16]数组中,FFT算法如下:

X(k)=X′(k)+X′(k+b)WNp(1) X(k+b)=X′(k)-X′(k+b)WNp(2) 式中,WNp=cos(2πP/N)-j sin(2πP/N)。 将式(1)化简成实部和虚部的形式,得到:

XR(k)=XR′(k)+XR′(k+b)cos(2πP/N)+XI′(k+b)sin(2πP/N)(3) XI(k)=XI′(k)-XR′(k+b)sin(2πP/N)+XI′(k+b)cos(2πP/N)(4) 同理,式(2)化简得到:

XR(k+b)=XR′(k)-XR′(k+b)cos(2πP/N)-XI′(k+b)sin(2πP/N)(5) XI(k+b)=XI′(k)+XR′(k+b)sin(2πP/N)-XI′(k+b)cos(2πP/N)(6)

可见每个蝶形运算的输出都是由其输入值与某一正弦函数和余弦函数的乘积累加

22

得到的。经过FFT变换,然后取某些频率项的幅值,量化显示,驱动LED点阵,点亮相应的LED灯。流程图如图5-4所示,程序见附录四中模块三。

开始 AD初始化 启动AD采集 开始采集 是否16个值

中断处理(FFT)

频谱显示

结束 图5-4 频谱显示流程图

23

第六章 系统调试与测试结果

一个完整的电子设计,无论模块设计如何精确,最终整体系统都要进行不断的测试

和调试。在本次光立方设计中,先进行软件部分调试,最后将程序下载到单片机进行整体调试。软件部分调试主要将编写好的C语言程序编译产生单片机可读取的.HEX二进制文件;整机调试主要是看编写程序端口控制与硬件设计是否匹配,显示结果是否按程序设计执行。

6.1 软件调试

首先本人编写一段简单程序,要求实现点亮全部LED灯,以及可以通过按键选择

显示“U”形字样。只要P0口8位全部输出高电平,P3同样输出高电平(ULN2803是电平转换功能),也就是语句P0=0xff; P3=0xff; 就可以实现光立方的全部点亮。而输出“U”形字样需要将其分解成多帧扫描显示,如图6-1所示。

图6-1 U型分解图

24

图6-2 测试程序调试

程序编译成功产生.hex文件,结果如图6-2所示。本人此次编写这段简短程序有

两个目的。

第一:编程点亮所有LED灯,可以用软件控制方法再次检查是否有坏掉的LED灯。 第二:通过编程“U”字样程序控制,检查显示是否按程序设计执行,同时可以确定I/O口高低位分别对应控制的行与列,可以避免编程所显示的图像都是倒立的或者不是所要设计的画面。

6.2 光立方初步调试

6.2.1检查电源

用5V移动电源用于单片机,功放模块供电,并接到主控扳上,检查电源指示灯是否闪烁,单片机能否正常工作。

将编译好的程序下载到单片机进行整体检测

图6-4 LED全亮 图6-5 “U”型字样

下载完成后,打开电源,通过按键K2,发现有一列灯没有亮,由于光立方每一层

共阴,每一列LED共阳接法,根据此原理本人检查发现接头没有插好,重新插紧,问题解决了,显示效果如图6-4所示,接着按下K3可以看到显“U”型字样,可能由于点亮

25

排数太少,或者拍摄角度不对造成显示效果不是太好,如图6-5所示。总之本次测试基本符合要求。

6.3 光立方最终调试

经初步测试无误后,开始编写光立方整程序。为了便于后期方便读懂程序以及再次

填加某些动画,本人将程序分三部分编写,分别是主程序,音频采集与现实模块,动画自动播放模块。主程序主要实现键盘扫描并确定执行哪种模式现实。经过多次编译、修改,程序编译结果如图6-6所示。

图6-6 完整程序编译结果 图6-7 显示效果

将完成编译程序下载到单片机上,可以发现还是有很多问题的。比如延时太慢造成的图像显示亮度不均匀,如图6-7所示。或者动画衔接不连贯,出现不适宜的停顿。

6.4 光立方测试遇到的问题

(1) 发现动画显示一段时间后跳出到开始界面,为此纠结很长时间,但最后发现

用的电源(USB)电流不稳定,后来换用5V移动电源供电,光立方正常运行程序显示动画。

(2) 光立方正常运行时发现顶层LED灯亮度与其他各层不同。以为驱动电路有问题,就把8个74HC573芯片仔细检查一遍,发现驱动模块工作正常,最后检查LED焊接发现顶层阴极断路。问题解决后,亮度一致,光立方动画显示正常。

(3) 光立方动画显示不连贯,有明显停顿,造成这样显示一般是延时过长。通过改小延时函数参数,动画完美显示。

26

结论

本次光立方设计主要通过单片机控制512个LED灯的自由点亮,从而可以实现各种动画显示,在设计过程期间出现很多错误,都被及的发现并改正。

(1)下载程序检测时发现图案不完整,检查程序后发现,原来是在送完P0口数据后,就立马加了个延时,再送P2口数据,再延时,这样导致P0口与P2口之间的显示效果在视觉上慢了半拍,达不到预期图案要显示的效果,最后将中间的那个延时程序调到送完P2口数据之后再给其进行延时,通过调试发现能够正常显示。

(2)在编写各种图案显示代码的时候,让我深刻的体会到,要想编好相应的代码,虽然可以配合取模软件,但光立方的三维空间的想象能力还是比较重要,512个灯到底是要求哪个灯给高电平哪个灯给低电平,还要根据显示要求组合好。以防出现乱码显示情况。

(3)本次设计硬件部分相对简单,主要是动画编写,因此熟练应用定时器、中断等编程方式,可以大大减少程序冗余。

(4)在做音频频谱过程中,由于不会实时处理漂浮点下落速度,从而使频谱显示显示变化高度一致,没有达到想要的显示效果,这也是本次设计的一个不足之处。

27

致谢语

接近半年的毕业设计结束了,在这段时间的设计和学习过程中,我得到了很多人的帮助,学到了很多东西,由衷的感谢一直以来关心和帮助我的老师与同学。

首先,感谢我的指导老师任志山和其他指导过我的老师们。在选定设计课题的时候,任老师给我们每个同学分析近几年的发展趋势,引出了以“实用”、“创新”为特色的设计要求,并给我们每个指出了设计课题的大方向。在设计过程中,老师以自己精专的知识,不断地启发我,使我的设计得以顺利进行。有了老师们的监督和指导,让我很好地把所学的专业知识得以应用,在实践中再次提高。而且大大培养了自己的动手能力,这对我以后的工作会有很大的帮助。另外,每个毕业的学生都要面临毕业论文的问题,一个优秀的设计论文,需要注意的细节很多,而学生很难一次性做到位。比如在写论文时,存在论文布局、内容、格式等方面的问题,老师给我一一讲解与修改,花费了老师的很多时间,任老师以其渊博的学识、严谨的治学态度、敏捷的思维、求实的工作作风以及饱满的工作热情给我留下了深刻的影响,是我终生学习的榜样。在这里我特别谢谢我的指导老师——任志山。

再次,我要感谢同学对我帮助和指导,在设计中不懂的请教同学时,总是很热心的帮我发现问题,寻找更好的解决办法。

最后,祝你们身体健康, 工作顺利。

28

参考文献

[1] 《单片机、DSP、PLD、EDA的介绍、比较和分析》 山西电子技术 王海林 王玮 2004年 [2]《新概念51单片机C语言教程[M]》电子工业出版社 郭天祥 2009 [3]《基于单片机的数据采集与控制系统[J]》 中国新通信 马凯 2014.9 [4]《常用电子元件及其应用》 人民邮电出版社 陈永甫 2005

[5]《单片机实现音频频谱显示的快速算法研究》 高等教育出版社 吴吉发 陈特放 2009.11 [6]《基于单片机的LED点阵显示系统的设计[J]》计算机与数字工程 戴禄君 刘战峰 2014.4

[7]《基于单片机的梦幻光立方3D显示器设计与制作[J]》电脑编程技巧与维护 鲁宛生 王林景 王林生2013.14.

[8]《国外家用LED灯简介及我国相关产业发展对策》 张瑞西 南京工业大学 2010.15 [9]《Keil Software_Cx51 Compiler User’s Guide》 09.2001

[10]《国庆60周年联欢晚会\光立方\的设计与实施[J]》 演艺科技 白明 2009.06

[11] 《基于STC单片机的8×8×8LED光立方系统设计[J]》 自然科学版 肖英 李行杰 2013.06

29

附录

附录1:实物图

图一

30

图二

图三

附录2:系统总原理图

31

附录3:呼吸灯PCB

附录4:光立方主程序

#include #include #include

uchar function_tab=0;

/*************主函数******************/ void main() { while(1) { P3=0x00; if(!keyamenu) //判断K2是否按下 { delay(30); //按键驱抖 if(!keyamenu) {function_tab=1;FFT_Deal();} //标记1 音频显示动画 } if(!keyout) //判断K3是否按下 { delay(30);//按键驱抖 if(!keyout) {function_tab=2;dis();} //标记2 自动播放模式 } } }

模块一

/**********动画播放模式选择********/ void dis() { int i,j; char go; delay(800); init(); //初始化函数 ////////////////////////呼吸灯 P2=0xff; P0=0; P2=0x80; P3=1;

32

while(!menu) { for(i=0;i<400;i++) { key_menu_scan(); if(menu) break; P0=0x80; delay1(i); P0=0; delay1(400-i); if(i<200) { j=2; while(j--) { P0=0x80; delay1(i); P0=0; delay1(400-i); } } } for(i=0;i<401;i++) { if(menu) break; key_menu_scan(); P0=0x80; delay1(400-i); P0=0; delay1(i); if(i>200) { j=2; while(j--) { P0=0x80; delay1(400-i); P0=0; delay1(i); } } } }

//P3M0=0x00;

///////////////////////////开机扫描 turn_on(9); H_scan(5); V_scan(5); W_scan(5);

/////////////////主菜单选项 while(1) { hy(number+37*8,2); while(!amenu) { W_side(number+(36+menu)*8,1,45); } switch(menu){ case 1: //模拟音谱显示 delay(400); while(!out)

33

{ TR0=1; MODE_Music(); //模拟音频 } TR0=0; break;

case 2: //动画显示 delay(400); amenu=0;//menu=1; go=1; cut(); go=1; while(go) //动画1:倒计时 { for(i=0;i<10;i++) hy(number+27*8+i*8,3); if(out) go=1; else go=0; } go=1; //字母旋转 while(go) { zimu(number,19,12,1); if(out) go=1; else go=0; } go=1; //方框缩放 while(go) { for(i=0;i<2;i++) for(j=0;j<2;j++) cube(0,j,6); for(i=0;i<2;i++) for(j=0;j<2;j++) cube(1,j,6); if(out) go=1; else go=0; } go=1; //上升沿 while(go) { rain(1,10,9); if(out) go=1; else go=0; } go=1; while(go) //旋转条 { xuanzhuantiao(1,4,4); xuanzhuantiao(1,3,5); xuanzhuantiao(1,2,6); xuanzhuantiao(1,1,7); if(out) go=1; else

34

go=0; }

go=1; //雪花旋转 while(go) { donghua(bianxing_table,11,1,24); xzcube(); donghua(y_table,6,5,5); donghua(x_table,6,5,5); donghua(z_table,6,5,5); link00(); if(out) go=1; else go=0; }

go=1; while(go) //伸缩 { shensuo(5); if(out) go=1; else go=0; }

go=1; while(go) //波浪 { donghua(sin_cube_table,14,22,5); if(out) go=1; else go=0; }

go=1; //方框缩放 while(go) { for(i=0;i<3;i++) for(j=0;j<3;j++) cube(0,j,6); for(i=0;i<3;i++) for(j=0;j<3;j++) cube(1,j,6); if(out) go=1; else go=0; }

go=1; while(go) //爱心跳动 { donghua(hart_table,2,10,32); if(out) go=1; else go=0; }

go=1; while(go) //闪点楼梯 { for(i=1;i>0;i--) shandian(i); if(out)

35

go=1; else go=0; } go=1; while(go) //字母上升9-0 { szfc0(10); if(out) go=1; else go=0; } go=1; //上升沿 while(go) { rain(1,10,9); rain(0,10,9); if(out) go=1; else go=0; } break; } out=0; amenu=0; menu=1; } }

模块二:

/*************伸缩程序***********/ void shensuo(uchar v) { char i,j; uchar a[64]={0}; for(i=0;i<64;i++) a[i]=0xff; for(i=0;i<7;i++) { move(a,0,0,1); zhen(a,v); } for(i=0;i<7;i++) { move(a,0,1,1); for(j=0;j<64;j++) a[j]|=0x01; zhen(a,v); } for(i=0;i<7;i++) { move(a,2,0,1); zhen(a,v); } for(i=0;i<7;i++) { move(a,2,1,1); for(j=0;j<8;j++) a[j]|=0xff; zhen(a,v);

36

} for(i=7;i>0;i--) { for(j=0;j<8;j++) a[j*8+i]=0; zhen(a,v); } for(i=1;i<8;i++) { for(j=0;j<8;j++) a[j*8+i]|=0xff; zhen(a,v); } }

模块三

/***********音频显示**********/ void FFT() { int xdata i,bb,j,k,p; int max,a[6]; int xdata TR,TI,temp; for(i=0; i<64;i++) {

Real[BRTable[i]]=STC_ADC(); Image[i]=0; }

for(i=1;i<=6;i++) {

bb=1;

bb<<=(i-1); for(j=0;j<=bb-1;j++) {

p=1;

p<<=(6-i); p=p*j;

for(k=j;k<64;k=k+2*bb) { key_amenu_scan(); key_out_scan(); TR = Real[k]; TI = Image[k]; temp=Real[k+bb];

Real[k]=Real[k]+((Real[k+bb]*cos_tabb[p])>>7)+((Image[k+bb]*sin_tabb[p])>>7); Image[k]=Image[k]-((Real[k+bb]*sin_tabb[p])>>7)+((Image[k+bb]*cos_tabb[p])>>7); Real[k+bb]=TR-((Real[k+bb]*cos_tabb[p])>>7)-((Image[k+bb]*sin_tabb[p])>>7); Image[k+bb]=TI+((temp*sin_tabb[p])>>7)-((Image[k+bb]*cos_tabb[p])>>7); Real[k]>>=1; Image[k]>>=1;

Real[k+bb]>>=1; Image[k+bb]>>=1; } } } max=0; for(i=0;i<6;i++) { a[i]=sqrt_16((Real[i+1]*Real[i+1]+Image[i+1]*Image[i+1])>>1); if(a[i]<2 ) a[i]=0; else a[i]-=2;

37

if(max7) { max/=7; for(i=0;i<6;i++) { a[i]/=max; } } for(i=0;i<6;i++) c[i]=a[i]; }

/*********AD初始化函数**********/ void ADC_Init() { P1ASF=0X01; //P1.0音频采样 AUXR1|=0X04; ADC_CONTR=0X88; //AD电源开启 EA=1; EADC=1; //AD采样开始 }

/*********音频显示模式******/ void FFT_Deal() { uint ADC_result_deal=0,i=0; GPIO_Init(); //I/O口初始化 ADC_Init(); //AD初始化 while(1) { if(temp>=20) { temp=0; ADC_result_deal=ADC_result/20; //去20个数的平均值 ADC_result=0; switch(ADC_result_deal*20/256) { case 8:display_dat_deal(0xff,0);break; case 7:display_dat_deal(0x7f,0);break; case 6:display_dat_deal(0x3f,0);break; case 5:display_dat_deal(0x1f,0);break; case 4:display_dat_deal(0x0f,0);break; case 3:display_dat_deal(0x07,0);break; case 2:display_dat_deal(0x03,0);break; case 1:display_dat_deal(0x01,0);break; default:display_dat_deal(0x00,0);break; } } } }

/********AD转换中断******/ void adc() interrupt 5 { temp++; ADC_CONTR&=0X00; //关闭AD转换 ADC_result+=ADC_RESL; ADC_CONTR|=0X88; //开启AD转换 }

/**********部分动画代码*********/

uchar code yc_table[]={//2帧,yinchu函数使用 0x00,0x00,0x00,0x7e,0x7e,0x00,0x00,0x00,//1I 0x00,0x00,0x00,0x7e,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,

38

0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 0x00,0x00,0x00,0x7e,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x7e,0x7e,0x00,0x00,0x00,

0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,//2心脏 0x00,0x00,0x00,0x3c,0x3c,0x00,0x00,0x00, 0x00,0x00,0x18,0x7e,0x7e,0x18,0x00,0x00, 0x00,0x00,0x3c,0x7e,0x7e,0x3c,0x00,0x00, 0x00,0x18,0x7e,0xff,0xff,0x7e,0x18,0x00, 0x00,0x00,0x7e,0xff,0xff,0x7e,0x00,0x00, 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,//3U 0x00,0x00,0x00,0x3c,0x3c,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00, 0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00,

0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x00, //4苹果 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x00, 0x00, 0x00, 0x3c, 0xfe, 0xfe, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//5五角星 0x00,0x00,0x00,0x22,0x22,0x00,0x00,0x00, 0x00,0x00,0x00,0x36,0x36,0x00,0x00,0x00, 0x00,0x00,0x00,0x1c,0x1c,0x00,0x00,0x00, 0x00,0x00,0x00,0x3e,0x3e,0x00,0x00,0x00, 0x00,0x00,0x00,0x7f,0x7f,0x00,0x00,0x00, 0x00,0x00,0x00,0x1c,0x1c,0x00,0x00,0x00, 0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x00 };

uchar code tab_xuanzhuantiao[]=//面旋转 旋转条 {

39

0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, 0x00,0x01,0x06,0x08,0x10,0x60,0x80,0x00, 0x00,0x00,0x01,0x0e,0x70,0x80,0x00,0x00, 0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00, 0x00,0x00,0x80,0x70,0x0e,0x01,0x00,0x00, 0x00,0x80,0x60,0x10,0x08,0x06,0x01,0x00,// 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,//1 0x40,0x20,0x20,0x10,0x08,0x04,0x04,0x02, 0x20,0x10,0x10,0x10,0x08,0x08,0x08,0x04, 0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10, 0x04,0x08,0x08,0x08,0x10,0x10,0x10,0x20, 0x02,0x04,0x04,0x08,0x10,0x20,0x20,0x40//7 };

uchar code flash0__tab[]= //对角扩散 {

0X03,0X07,0X06,0X08,0X10,0X20,0X40,0X80, 0X07,0X07,0X0F,0X1C,0X18,0X20,0X40,0X80, 0X0F,0X0F,0X1F,0X3F,0X3C,0X78,0X60,0X80, 0X1F,0X1F,0X3F,0X3F,0X7F,0X7C,0X70,0X80, 0X3F,0X3F,0X3F,0X7F,0X7F,0X7F,0XF8,0XC0, 0X7F,0X7F,0X7F,0X7F,0XFF,0XFF,0XFF,0XF0, 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF//7 };

40

本文来源:https://www.bwwdw.com/article/vys8.html

Top