单片机艺术彩灯控制设计与制作实践指南
摘 要
随着人们生活环境的不断改善和美化,艺术彩灯的广泛应用离不开其色彩丰富、价格低廉及控制简单的特点,
如城市照明工程中的照明;彩色霓虹灯、广告牌自带的彩灯等。但是当前市面上大多LED所具备的控制系统都是通过
全硬件电路进行控制的,其结构复杂、功能单一、成品模式固定,此外,这种结构耗费芯片多、功耗大,客户缺乏
灵便的操作性能。
本文以AT89C52单片机作为控制核心,对艺术彩灯的控制结构和全硬件部分进行了编程设计。结合设计目标所设
定的发光定位将二极管放置在相应区域,根据C语言控制其发光,灯光闪烁频率根据时间顺序和间隔顺序对二极管发
放指令、由于单片机输出的高低电平差,不同的小灯会有不同的明暗变化,这就是艺术彩灯的控制系统。
关键词:艺术彩灯;发光LED二极管;AT89C52;C语言
引 言
单片机指集成电路芯片,虽然它的体积很小,但依然能组成一个功能十分完善的计算机系统,它采用了先进的
超大规模集成电路技术,使得一块小小的芯片上同时集成了CPU、RAM、ROM中断系统、定时器以及各种I\O端口。
由于单片机技术的飞速发展,其应用已广泛渗透到我国国民经济的各个领域,影响到我们生活的方方面面。目
前,单片机技术已经广泛运用于智能仪器、智能家居、数据采集和工程控制等各个领域。单片机的种类也有很多,
当前我国市场中,应用最多的单片机当属51系列的8位单片机。随着近年来的发展,51单片机早已步入全新的发展阶
段。51单片机与市面上具备特殊功能的单片机进行集成,其相应控制器合适继续沿用IP核的方式集成在FPGA系统
中。因此,为了设计一个完善的应用系统,我们必须在实际工作中勤于实践,逐步积累这方面的经验。随着社会对
单片机应用人才的需求,它已然成为工科大学生的必修课之一。
1、绪论
1.1 选题依据及意义
1.1.1 选题依据
随着现代社会的发展,人们对生活精致的追求越来越高,于是艺术彩灯就诞生了。简单的照明工具变得越来越
多样化,各式各样花样的变化会给人一种视觉冲击,以至于现在我们在大街小巷到处都能看到这样多变的艺术彩
灯。以前我们用电子电路来设计这样的艺术彩灯,用set控制器和状态解码器来实现光的模式变化效果,但现在我们
可以用单片机AT89C52来实现,因为它比电子电路有明显的优势,控制硬件电路相对简单,软件程序不复杂,所以制
作十分简单,但功能不低于电子电路设计,由于它体积小、方便、易懂,所以我们经常使用单片机来制作艺术彩
灯。
单片机在日常生活中的应用无处不在,如家中的床头灯、节日庆典用的高彩灯等。价格实惠的艺术彩灯可以极
大地满足我们在各个领域的需求,在这种大趋势下,我认为有必要开发一种特殊的艺术灯控制系统。因为用单片机
开发的艺术彩灯控制系统简单、易用、方便快捷,能极大地满足当今市场的需求,且单片机中有许多定时器和寄存
器,可以很容易地完成对小灯的控制,简单易用。此外,它结构简单,成本低。在当前家庭个性化的需求下,它有
着良好的市场前景。
1.1.2 选题意义
LED与单片机的综合设计,可以培养电信专业毕业生单片机与电子技术的实际应用能力,掌握设计和生产电子产
品的知识和要求。如今艺术彩灯被广泛运用于各个领域中,而彩灯设计中最大的一个难题便是单片机控制电路的设
计,通过本次毕业设计正好能够对我们所学的综合知识进行检验,进一步提升综合能力的运用,以及面对难题时的
心理素质,巩固和拓展我们所学的课堂知识,加深对电路设计的理解,掌握单片机编程的基本设计和分析方法,且
对以后的学习和工作有着深刻的意义。
1.2 国内外研究现状及发展趋势
单片机自问世以来,得到了广泛的应用。其具备体积小、重量轻等特点,并且其传输速度快、运行稳定、低功
耗、芯片抗干扰能力强,因而在测控系统、数据采集、智能接口等多种单片机系统中均受到广泛的应用。而在艺术
彩灯的控制结构设计中,采用单片机替代传统的分立元件控制,成为控制系统的核心。相比于穿用的彩灯设计,单
片机控制具备的彩灯图案较多、随时可调,硬件电路结构也相对简单,成本低廉、功能强大。
LED发光原理是利用二极管中电子和空穴结合过程中的能量转换产生光输出。LED具有无发热、元件寿命长、反
应速度快、体积小、功耗低、适合批量生产、可靠性高等特点。LED的制造材料通常是砷、磷、镓和其他I-V元素。
LED被公认为世界上最高效的人工照明技术。目前,大多LED的应用都被误解为是在企业的误导下取代了LCD技
术,然而实际上早在上世纪60年代就开始了节能照明技术。当前市场上LED主要应用于各类指示灯、路灯及电子电器
背景灯等。由于其高能低耗的特点,人们通常认为采用LED技术是一种比较环保的方式。事实上在尔湾加利福尼亚大
学的一项研究报告中指出,LED应用过程中的环境效益与其所含的有毒物质刚好抵消。在研究中,该大学充分探究了
彩色LED灯中的常见彩灯:红、黄、蓝、绿。研究结果表明这些灯管都含有大量的金属元素,其主要为锑、砷、铬、
铅等,并且其中的部分元素超过了相关监管机构的制定的标准,会对人眼造成伤害。因此,使用LED导航指示灯、
LED路灯和LED台灯时存在一定的不利因素。在使用过程中容易使人感到头晕和不适,长期使用后甚至会导致眼睛受
伤。
1.3 本课题研究内容
本课题是一个基于51单片机的广告艺术彩灯自动控制设计,其详细要求如下:
1.用16盏以上的LED小灯,实现3种彩灯灯光效果(不含全部点亮,全部熄灭):顺时针流水灯、逆时针流水灯、交替
闪烁、顺时针对角灯、逆时针对角灯、顺时针逐个点亮、顺时针逐个熄灭、逆时针逐个点亮,围成由里及外三层心
形结构;
2.灯光效果的切换通过输入按钮进行控制
3.可以通过按钮实现彩灯效果的暂停,同时使灯管全亮,恢复之前的效果则再次按下相同按钮即可实现;
4.可以自动进行效果切换,同时设定调节按钮使自动模式和手动模式可以一键切换;
5.可使用定时中断延时;
2、艺术彩灯系统的结构
2.1 艺术彩灯系统框架
图2-1 艺术彩灯系统框架图
图2-2 艺术彩灯硬件结构图
2.2 艺术彩灯系统流程图
图2-3 艺术彩灯系统流程图
3、艺术彩灯系统的硬件设计
3.1 单片机的定义
单片机(Single-Chip Microcomputer)属于集成电路芯片的一种,将数据处理所需要的中央处理器、随机存储
器、只读存储器、多种I/O接口和定时器等都集成到一起,在采用集成技术将各种模块集成到一块硅片上,在实现各
种功能的情况下体积小巧,并且自成一体构成体积小巧、功能完备的微型计算机系统,因而得到工业控制领域的广
泛应用。单片机的功能主要分为几大模块,其中数据采集系统能够完成各类复杂的运算;控制系统,则完成对运算
符号的控制以及运算指令的下达,这些功能都能通过单片机独立进行实现。换而言之,单片机可以视为一个单独的
系统,并且通过集成电路将数据运算和处理能力都体现在了芯片中,从而完成了数据的高速化处理。单片机的结构
由五部分组成:运算单元、控制器、存储器和输入输出设备。
3.1.1 AT89C52芯片功能特性及应用
如果想要单片机自动完成我们下达的任务,就必须把这些任务改编成指令,而这些指令集合起来就称为程序。
单片机上会有一个用来存储程序的元件,称为内存。内存由许多存储单元组成,它就像一个书架,指令就像一本本
书籍被存储在书架上,当我们需要哪一个指令,就从相应的位置中取出并且执行。正如为了方便找到相应的书籍,会对每一本书进行标记标签,然后根据相应的内容分配到唯一的地址,这一过程称为存储单元。如此一来,只要获
得了存储单元的地址,就能快速的找到相应的单元,并且提取相关的数据。如图3-1(1)和3-1(2)所示,AT89C52
是一种CMOS#8位微处理器,其能耗低、功效高,并且具有4K字节闪存,能够进行程序编辑和擦除,也可将其视为单
片微型计算机的一种。AT89C52采用ATMEL高密度非易失性存储器相关技术进行制造,能够和工业标准MCS-51指令集
和输出引脚进行兼容。并且由于其高效微控器的存在,能够将8位CPU和闪存进行组合,集成到芯片中,并且价格相
对低廉,从而为大多嵌入式控制系统带来了高质量、低成本的解决方案。
图3-1(1)89C52单片机引脚图 图3-1(2)单片机的引脚排列及逻辑序号图
3.1.2 AT89C52芯片硬件结构
单片机的硬件结构主要由为一个八位CPU、一个时钟电路、一个256字节的数据存储器、8K字节的程序存储器、
一个全双工的异步串行口、三个16位定时/计数器、四个八位并行I/O口以及六个中断源组成。
3.1.3 主要引脚功能
1.电源引脚Vcc和Vss通常只能与+5V的电源端和接地端进行连接,并且要在Vcc和Vss的两者的引脚之间接纳0.1
μ高频滤波电容。
2.时钟电路引脚XTAL1与外部晶振和微调电容的一端进行连接,其属于振荡器倒相放大器的输入,倘若要使用外部
TTL时钟,则需要将引脚接地。XTAL2则与外部晶振和微调电容的另一端进行连接,其属于片内中振荡器倒相放大器
的输出,倘若要使用外部TTL时钟,则需将输入端与外部时钟进行连接。
3. 地址锁存器ALE通常对其从P0口所输出的低8位地址进行控制,能够完成数据和地位地址的复用。在进行工作时,
ALE端则会周期性的以固定频率,即时钟频率的1/6对外进行正脉冲信号的输出,ALE可以同时负荷8个LSTTL器件的运
转。
4.外部程序存储器读选通信号PESN仅能在低电平时实现其功能。CPU获取外部指令后,其能够在每个机器周期中实现
两次功效。
5.程序存储器地址允许输入端 EA/VPP 。当EA/VPP为高电平时,CPU则对片内的存储器指令进行执行;当EA/VPP 为
低电平时,CPU则只执行片外程序存储器的相关指令。
6.复位信号RST 在高电平有效,输入端保持两个机器周期的高电平后,就能够实现复位。另外,RST具备掉电保护效
果,在该端接入+5V备用电源时,倘若Vcc出现掉电情况,此时RST可以保护片内RAM信息完整并且不会缺失。
7.输入/输出口引脚P0、P1、P2和P3
P0口作为漏极开路的8位准双向口,可以驱动8个LSTTL负载,也作为8位地址线和8位数据线的复用端口。
P1口是一个内部带上拉电阻的8位准双向I/O口,P1口最多可以驱动4个LSTTL负载。
P2口作为一个内部带上拉电阻的8位准双向I/O口,其驱动能力也是4个LSTTL负载。在访问外部程序存储器时,
P2口作为存储器的高8位地址线。
P3口同样是内部带上拉电阻的8位准双向I/O口,但除了作为一般的I/O口使用之外,同时它还有其他功能。
3.1.4 外部总线结构
所谓的总线是一组把MCU和外部设备连接起来的公共线。我们在扩展系统时,通常需要将给MCU连接上外部设
备,但是这样的话每个元件和外部设备都需要用自己的线路连接CPU,最终会导致我们设计出来的电路会十分复杂繁
琐,然后出现一系列问题,因此简化电路的系统结构是十分重要的一环。为了达到符合要求的设计,可以选择用一
组线路和适当的接口电路来将各个元件和外部设备连接起来,这组连接线就称为总线MCS-51系列单片机的三总线结
构可以由片外引脚组成。MCU的引脚包括电源端子VCC、接地端VSS、复位端RST、晶体振荡器接入端xtal1和xtal2,
以及通用I/O端口。其他pin设置用于系统扩展。由这些引脚组成的单片机系统的三总线结构如图3-1(3)所示。
3-1(3)外部总线结构图
3.2 系统硬件模块
3.2.1 电源设计
AT89C52芯片大多采用低压电源,大大降低了芯片的功耗。本系统使用的AT89C52芯片只有一个电源,+5v电源,
由220V市电转换而成。单片机的供电电压很低,因此其电流也很小,一般为毫安级。其主要功能是驱动控制电路正
常工作。经计算,AT89C52芯片的额定电流在20mA到200mA之间。
3.2.2 主控模块
如图3-2(1)和3-2(2)所示,主控模块主要由AT89C52单片机、6个74HC595芯片、若干拨动式开关以及一个按
键开关组成。由于单片机I\O口数量不够,所以对I\O口进行了适当的扩展,增加了如下图所示的6个74HC595芯片。
图3-2(1)艺术彩灯系统主控模块拓展芯片图
图3-2(2)艺术彩灯系统主控模块芯片图
3.2.3 复位电路
如图3-2(3)所示,复位电路通常对单片机的启动状态进行控制。在整个运行系统中,由于系统会受到外界的
干扰从而出现程序错误或者死机的情况,此时采用复位电路就可以重新烧录单片机类进行代码。复位方式通常分为
两种,即自动复位和按键复位。在设计过程中为简化电路的编程数量,本文采用手动复位方式。复位电路的C3电容
大小是直接影响复位时间的,一般选用10uF极性电容。处于工作模式时,可采用频率更高的晶体振荡器提高系统的
运算能力,在单片机系统中,运算速度的高低与轻症频率有着直接联系,晶振频率越大,则其所具备的运算速度也会越快。
3.2.4 LED模块
如图3-2(4)所示,发光二极管LED通常采用半导体材料制成,能够直接将电流转换为光能,因此LED在接通电
源时就会产生光亮。LED具有功耗低、体积小、可靠性高、使用寿命长、响应速度快等优点。LED模块共有48个LED发
光二极管,通过软件代码实现流量变化。电阻的作用是保护二极管,为其提供小电流,防止二极管因电流过大而烧
毁。在设计中,LED通过公共阴极连接。我们只需将其初始值连续向左或向右移动,就会看到LED依次点亮,从而实
现艺术彩灯的功能。
3.2.5 晶振电路
如图3-2(5)所示,单片机晶体振荡器主要功能是用于为系统提供相应的时钟信号。一般情况下,系统所具备
的全部器件,仅仅需要一个晶体振荡器就能完成同步,倘若通过电子频率对晶体振荡器进行相应的调整,就能进一
步完成通讯系统中机频和射频两者的同步。晶振电路是指单片机上的两个引脚xta10和xta11连接晶体振荡器所组成
的电路,为了提高电路的稳定性减少载波对电路稳定性产生的影响,一般会将晶体振荡器的两个引脚处的电容进行
接地,并且电容的电阻值需要保持一致,如果相差较大,那么晶体振荡器的共振则会受到影响,最终导致晶体振荡
器失效。这里我们选择两个30pf的电容器。
3.2.6 排阻
图3-2(6)艺术彩灯系统排阻图
如图3-2(6)所示,将多个电阻值相同的电阻所含的一个引脚连在一起,然后将电阻的另一个引脚正常引出,
就可以构成一个排阻。倘若排阻由n个电阻构成,那么其引脚数量则为n+1,最左侧的引脚属于公共引脚,一般会采
用标点将其标出。倘若一个数字电路的并行接口需要进行上拉或者下拉电阻时,那么排阻的应用将会使电阻的固定
变得相对简单。
4、艺术彩灯系统的软件设计
4.1设计思想
艺术彩灯系统主要由51单片机最小系统、48个LED灯、按键控制电路、6个74HC595芯片进行扩展而成并围成由内
及外的3层心型结构。由于题目要求围成3层心型结构,显然如果要围成一个漂亮的、像样的3层心型结构必须利用单
片机的I/O口进行扩展,因为单片机最多就是32个I/O口,此外还要求有按键控制部分,因此如果不采用扩展的方式
实现,在不考虑控制按键的前提下最多只可以接32个LED,如果考虑控制按键,那么可用的LED灯数必然会更少,所
以最终选择了扩展单片机的I/O口。
LED彩灯的花型及变换方式由软件程序实现并结合按键进行控制。系统的花型变换有10种之多,包括顺时针流水
灯、逆时针流水灯、交替闪烁等等花型多,样式丰富,具有一定的创新意义。
系统上电后默认是自动模式,由第1种花型开始逐步过渡到第10种花型,同时具有手动和自动切换的功能,当进
入手动状态时候,可以通过花型切换按键进行人工手动切换花型,另外,可以任意时刻暂停/继续流水,功能丰富。
流水灯花样: 1、有复位按键。 2、8种花样的流水灯,顺时针流水灯、逆时针流水灯、交替闪烁、顺时针对角
灯、逆时针对角灯、顺时针逐个点亮、顺时针逐个熄灭、逆时针逐个点亮,围成由里及外三层形结构。
4.2 软件设计
本设计选用C语言作为编程语言。选择C语言进行编程的原因是其具备诸多优点,同时又有着简单、方便、简
洁、灵活的特点,但同时它的可操作性也很强,设计程序时的自由度很大,数据结构类型多,且兼容性强可移植性
好。再搭配上Keil作为编程工具,最后生成的代码程序十分简单高效,作为高级语言的优势展现的淋漓尽致。
完成程序编辑后需要进行仿真进行验证,本设计选用Proteus仿真平台,在Proteus中完成原理图的绘制,然后
将程序代码输入到keil中并进行编译,编译完成后就可以调用目标代码文件:hex,并使用这两个软件进行联合仿
真。这样我们就可以通过模拟仿真来达到类似于物理操作实验的效果,并且其状态与过程完全与物理操作试验吻
合,并且相关电路的元件和连接线与传统的MCU试验完全吻合。且Proteus中拥有几乎所有我们能用上的元件,它的
元件库比一般的实验室大得多,这就大大提高了我们的操作性,在平时做不了的实验可以在Proteus中模拟实现。通
过使用Proteus进行设计,可以大大减少我们的设计时间,由于元件都是虚拟的,设计成本也因此大大降低。这对我
们学生来说无疑是一个锻炼设计能力和学习精神的好平台。
附 录
主程序设计:
#include <reg52.h>
#include <math.h>
#include <stdio.h>
#include <intrins.h>
#define UCHAR unsigned char
#define UINT unsigned int
24
#define ULONG unsigned long
UCHAR code OUT1[288]=
{
0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,
0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,
0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFD,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFB,0XFF,0XFF,0XFF,0XFF,
0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,
0XFF,0XEF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XBF,0XFF,0XFF,0XFF,0XFF,
0XFF,0X7F,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFD,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFB,0XFF,0XFF,0XFF,
0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,
0XFF,0XFF,0XEF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XDF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XBF,0XFF,0XFF,0XFF,
0XFF,0XFF,0X7F,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFD,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFB,0XFF,0XFF,
0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,
0XFF,0XFF,0XFF,0XEF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XDF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XBF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X7F,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFD,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFB,0XFF,
0XFF,0XFF,0XFF,0XFF,0XF7,0XFF,
0XFF,0XFF,0XFF,0XFF,0XEF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XDF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XBF,0XFF,
0XFF,0XFF,0XFF,0XFF,0X7F,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,
0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,
25
0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X7F
};
UCHAR code OUT2[288]=
{
0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,
0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
0XFF,0XFF,0XFF,0XFF,0X7F,0XFF,
0XFF,0XFF,0XFF,0XFF,0XBF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XDF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XEF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XF7,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFB,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFD,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,
0XFF,0XFF,0XFF,0X7F,0XFF,0XFF,
0XFF,0XFF,0XFF,0XBF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XDF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XEF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFB,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFD,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFE,0XFF,0XFF,
0XFF,0XFF,0X7F,0XFF,0XFF,0XFF,
0XFF,0XFF,0XBF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XDF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XEF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XF7,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFB,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFD,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFE,0XFF,0XFF,0XFF,
0XFF,0X7F,0XFF,0XFF,0XFF,0XFF,
0XFF,0XBF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XEF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFB,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFD,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFE,0XFF,0XFF,0XFF,0XFF,
26
0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,
0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFE,0XFF,0XFF,0XFF,0XFF,0XFF
};
UCHAR code OUT3[288]=
{
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
27
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55,
0XAA,0XAA,0XAA,0XAA,0XAA,0XAA,
0X55,0X55,0X55,0X55,0X55,0X55
};
UCHAR code OUT4[288]=
{
0XFE,0XFF,0XFF,0XFF,0XFF,0X7F,
0XFD,0XFF,0XFF,0XFF,0XFF,0XBF,
0XFB,0XFF,0XFF,0XFF,0XFF,0XDF,
0XF7,0XFF,0XFF,0XFF,0XFF,0XEF,
0XEF,0XFF,0XFF,0XFF,0XFF,0XF7,
0XDF,0XFF,0XFF,0XFF,0XFF,0XFB,
0XBF,0XFF,0XFF,0XFF,0XFF,0XFD,
0X7F,0XFF,0XFF,0XFF,0XFF,0XFE,
0XFF,0XFE,0XFF,0XFF,0X7F,0XFF,
0XFF,0XFD,0XFF,0XFF,0XBF,0XFF,
0XFF,0XFB,0XFF,0XFF,0XDF,0XFF,
0XFF,0XF7,0XFF,0XFF,0XEF,0XFF,
0XFF,0XEF,0XFF,0XFF,0XF7,0XFF,
0XFF,0XDF,0XFF,0XFF,0XFB,0XFF,
0XFF,0XBF,0XFF,0XFF,0XFD,0XFF,
0XFF,0X7F,0XFF,0XFF,0XFE,0XFF,
0XFF,0XFF,0XFE,0X7F,0XFF,0XFF,
0XFF,0XFF,0XFD,0XBF,0XFF,0XFF,
0XFF,0XFF,0XFB,0XDF,0XFF,0XFF,
0XFF,0XFF,0XF7,0XEF,0XFF,0XFF,
0XFF,0XFF,0XEF,0XF7,0XFF,0XFF,
0XFF,0XFF,0XDF,0XFB,0XFF,0XFF,
0XFF,0XFF,0XBF,0XFD,0XFF,0XFF,
0XFF,0XFF,0X7F,0XFE,0XFF,0XFF,
0XFE,0XFF,0XFF,0XFF,0XFF,0X7F,
0XFD,0XFF,0XFF,0XFF,0XFF,0XBF,
0XFB,0XFF,0XFF,0XFF,0XFF,0XDF,
0XF7,0XFF,0XFF,0XFF,0XFF,0XEF,
0XEF,0XFF,0XFF,0XFF,0XFF,0XF7,
0XDF,0XFF,0XFF,0XFF,0XFF,0XFB,
0XBF,0XFF,0XFF,0XFF,0XFF,0XFD,
0X7F,0XFF,0XFF,0XFF,0XFF,0XFE,
28
0XFF,0XFE,0XFF,0XFF,0X7F,0XFF,
0XFF,0XFD,0XFF,0XFF,0XBF,0XFF,
0XFF,0XFB,0XFF,0XFF,0XDF,0XFF,
0XFF,0XF7,0XFF,0XFF,0XEF,0XFF,
0XFF,0XEF,0XFF,0XFF,0XF7,0XFF,
0XFF,0XDF,0XFF,0XFF,0XFB,0XFF,
0XFF,0XBF,0XFF,0XFF,0XFD,0XFF,
0XFF,0X7F,0XFF,0XFF,0XFE,0XFF,
0XFF,0XFF,0XFE,0X7F,0XFF,0XFF,
0XFF,0XFF,0XFD,0XBF,0XFF,0XFF,
0XFF,0XFF,0XFB,0XDF,0XFF,0XFF,
0XFF,0XFF,0XF7,0XEF,0XFF,0XFF,
0XFF,0XFF,0XEF,0XF7,0XFF,0XFF,
0XFF,0XFF,0XDF,0XFB,0XFF,0XFF,
0XFF,0XFF,0XBF,0XFD,0XFF,0XFF,
0XFF,0XFF,0X7F,0XFE,0XFF,0XFF,
};
UCHAR code OUT5[288]=
{
0X01,0X00,0X00,0X00,0X00,0X00,
0X03,0X00,0X00,0X00,0X00,0X00,
0X07,0X00,0X00,0X00,0X00,0X00,
0X0F,0X00,0X00,0X00,0X00,0X00,
0X1F,0X00,0X00,0X00,0X00,0X00,
0X3F,0X00,0X00,0X00,0X00,0X00,
0X7F,0X00,0X00,0X00,0X00,0X00,
0XFF,0X00,0X00,0X00,0X00,0X00,
0XFF,0X01,0X00,0X00,0X00,0X00,
0XFF,0X03,0X00,0X00,0X00,0X00,
0XFF,0X07,0X00,0X00,0X00,0X00,
0XFF,0X0F,0X00,0X00,0X00,0X00,
0XFF,0X1F,0X00,0X00,0X00,0X00,
0XFF,0X3F,0X00,0X00,0X00,0X00,
0XFF,0X7F,0X00,0X00,0X00,0X00,
0XFF,0XFF,0X00,0X00,0X00,0X00,
0XFF,0XFF,0X01,0X00,0X00,0X00,
0XFF,0XFF,0X03,0X00,0X00,0X00,
0XFF,0XFF,0X07,0X00,0X00,0X00,
0XFF,0XFF,0X0F,0X00,0X00,0X00,
0XFF,0XFF,0X1F,0X00,0X00,0X00,
0XFF,0XFF,0X3F,0X00,0X00,0X00,
0XFF,0XFF,0X7F,0X00,0X00,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0X00,
0XFF,0XFF,0XFF,0X01,0X00,0X00,
0XFF,0XFF,0XFF,0X03,0X00,0X00,
0XFF,0XFF,0XFF,0X07,0X00,0X00,
0XFF,0XFF,0XFF,0X0F,0X00,0X00,
29
0XFF,0XFF,0XFF,0X1F,0X00,0X00,
0XFF,0XFF,0XFF,0X3F,0X00,0X00,
0XFF,0XFF,0XFF,0X7F,0X00,0X00,
0XFF,0XFF,0XFF,0XFF,0X00,0X00,
0XFF,0XFF,0XFF,0XFF,0X01,0X00,
0XFF,0XFF,0XFF,0XFF,0X03,0X00,
0XFF,0XFF,0XFF,0XFF,0X07,0X00,
0XFF,0XFF,0XFF,0XFF,0X0F,0X00,
0XFF,0XFF,0XFF,0XFF,0X1F,0X00,
0XFF,0XFF,0XFF,0XFF,0X3F,0X00,
0XFF,0XFF,0XFF,0XFF,0X7F,0X00,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0XFF,0XFF,0X01,
0XFF,0XFF,0XFF,0XFF,0XFF,0X03,
0XFF,0XFF,0XFF,0XFF,0XFF,0X07,
0XFF,0XFF,0XFF,0XFF,0XFF,0X0F,
0XFF,0XFF,0XFF,0XFF,0XFF,0X1F,
0XFF,0XFF,0XFF,0XFF,0XFF,0X3F,
0XFF,0XFF,0XFF,0XFF,0XFF,0X7F,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF
};
UCHAR code OUT6[288]=
{
0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,
0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0XFF,0XFE,0X00,
0XFF,0XFF,0XFF,0XFF,0XFC,0X00,
0XFF,0XFF,0XFF,0XFF,0XF8,0X00,
0XFF,0XFF,0XFF,0XFF,0XF0,0X00,
0XFF,0XFF,0XFF,0XFF,0XE0,0X00,
0XFF,0XFF,0XFF,0XFF,0XC0,0X00,
0XFF,0XFF,0XFF,0XFF,0X80,0X00,
0XFF,0XFF,0XFF,0XFF,0X00,0X00,
0XFF,0XFF,0XFF,0XFE,0X00,0X00,
0XFF,0XFF,0XFF,0XFC,0X00,0X00,
0XFF,0XFF,0XFF,0XF8,0X00,0X00,
0XFF,0XFF,0XFF,0XF0,0X00,0X00,
0XFF,0XFF,0XFF,0XE0,0X00,0X00,
0XFF,0XFF,0XFF,0XC0,0X00,0X00,
0XFF,0XFF,0XFF,0X80,0X00,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0X00,
30
0XFF,0XFF,0XFE,0X00,0X00,0X00,
0XFF,0XFF,0XFC,0X00,0X00,0X00,
0XFF,0XFF,0XF8,0X00,0X00,0X00,
0XFF,0XFF,0XF0,0X00,0X00,0X00,
0XFF,0XFF,0XE0,0X00,0X00,0X00,
0XFF,0XFF,0XC0,0X00,0X00,0X00,
0XFF,0XFF,0X80,0X00,0X00,0X00,
0XFF,0XFF,0X00,0X00,0X00,0X00,
0XFF,0XFE,0X00,0X00,0X00,0X00,
0XFF,0XFC,0X00,0X00,0X00,0X00,
0XFF,0XF8,0X00,0X00,0X00,0X00,
0XFF,0XF0,0X00,0X00,0X00,0X00,
0XFF,0XE0,0X00,0X00,0X00,0X00,
0XFF,0XC0,0X00,0X00,0X00,0X00,
0XFF,0X80,0X00,0X00,0X00,0X00,
0XFF,0X00,0X00,0X00,0X00,0X00,
0XFE,0X00,0X00,0X00,0X00,0X00,
0XFC,0X00,0X00,0X00,0X00,0X00,
0XF8,0X00,0X00,0X00,0X00,0X00,
0XF0,0X00,0X00,0X00,0X00,0X00,
0XE0,0X00,0X00,0X00,0X00,0X00,
0XC0,0X00,0X00,0X00,0X00,0X00,
0X80,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00
};
UCHAR code OUT7[288]=
{
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
31
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF
};
UCHAR code OUT8[288]=
{
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
32
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0X00,0X00,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00
};
UCHAR code OUT9[288]=
{
0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,
0XF8,0XFF,0XFF,0XFF,0XFF,0XFF,
0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,
0XE0,0XFF,0XFF,0XFF,0XFF,0XFF,
0XC0,0XFF,0XFF,0XFF,0XFF,0XFF,
0X80,0XFF,0XFF,0XFF,0XFF,0XFF,
0X00,0XFF,0XFF,0XFF,0XFF,0XFF,
0X00,0XFE,0XFF,0XFF,0XFF,0XFF,
0X00,0XFC,0XFF,0XFF,0XFF,0XFF,
0X00,0XF8,0XFF,0XFF,0XFF,0XFF,
0X00,0XF0,0XFF,0XFF,0XFF,0XFF,
33
0X00,0XE0,0XFF,0XFF,0XFF,0XFF,
0X00,0XC0,0XFF,0XFF,0XFF,0XFF,
0X00,0X80,0XFF,0XFF,0XFF,0XFF,
0X00,0X00,0XFF,0XFF,0XFF,0XFF,
0X00,0X00,0XFE,0XFF,0XFF,0XFF,
0X00,0X00,0XFC,0XFF,0XFF,0XFF,
0X00,0X00,0XF8,0XFF,0XFF,0XFF,
0X00,0X00,0XF0,0XFF,0XFF,0XFF,
0X00,0X00,0XE0,0XFF,0XFF,0XFF,
0X00,0X00,0XC0,0XFF,0XFF,0XFF,
0X00,0X00,0X80,0XFF,0XFF,0XFF,
0X00,0X00,0X00,0XFF,0XFF,0XFF,
0X00,0X00,0X00,0XFE,0XFF,0XFF,
0X00,0X00,0X00,0XFC,0XFF,0XFF,
0X00,0X00,0X00,0XF8,0XFF,0XFF,
0X00,0X00,0X00,0XF0,0XFF,0XFF,
0X00,0X00,0X00,0XE0,0XFF,0XFF,
0X00,0X00,0X00,0XC0,0XFF,0XFF,
0X00,0X00,0X00,0X80,0XFF,0XFF,
0X00,0X00,0X00,0X00,0XFF,0XFF,
0X00,0X00,0X00,0X00,0XFE,0XFF,
0X00,0X00,0X00,0X00,0XFC,0XFF,
0X00,0X00,0X00,0X00,0XF8,0XFF,
0X00,0X00,0X00,0X00,0XF0,0XFF,
0X00,0X00,0X00,0X00,0XE0,0XFF,
0X00,0X00,0X00,0X00,0XC0,0XFF,
0X00,0X00,0X00,0X00,0X80,0XFF,
0X00,0X00,0X00,0X00,0X00,0XFF,
0X00,0X00,0X00,0X00,0X00,0XFE,
0X00,0X00,0X00,0X00,0X00,0XFC,
0X00,0X00,0X00,0X00,0X00,0XF8,
0X00,0X00,0X00,0X00,0X00,0XF0,
0X00,0X00,0X00,0X00,0X00,0XE0,
0X00,0X00,0X00,0X00,0X00,0XC0,
0X00,0X00,0X00,0X00,0X00,0X80,
0X00,0X00,0X00,0X00,0X00,0X00
};
UCHAR code OUT10[288]=
{
0X00,0X00,0X00,0X00,0X00,0X00,
0X80,0X00,0X00,0X00,0X00,0X00,
0XC0,0X00,0X00,0X00,0X00,0X00,
0XE0,0X00,0X00,0X00,0X00,0X00,
0XF0,0X00,0X00,0X00,0X00,0X00,
0XF8,0X00,0X00,0X00,0X00,0X00,
0XFC,0X00,0X00,0X00,0X00,0X00,
0XFE,0X00,0X00,0X00,0X00,0X00,
34
0XFF,0X00,0X00,0X00,0X00,0X00,
0XFF,0X80,0X00,0X00,0X00,0X00,
0XFF,0XC0,0X00,0X00,0X00,0X00,
0XFF,0XE0,0X00,0X00,0X00,0X00,
0XFF,0XF0,0X00,0X00,0X00,0X00,
0XFF,0XF8,0X00,0X00,0X00,0X00,
0XFF,0XFC,0X00,0X00,0X00,0X00,
0XFF,0XFE,0X00,0X00,0X00,0X00,
0XFF,0XFF,0X00,0X00,0X00,0X00,
0XFF,0XFF,0X80,0X00,0X00,0X00,
0XFF,0XFF,0XC0,0X00,0X00,0X00,
0XFF,0XFF,0XE0,0X00,0X00,0X00,
0XFF,0XFF,0XF0,0X00,0X00,0X00,
0XFF,0XFF,0XF8,0X00,0X00,0X00,
0XFF,0XFF,0XFC,0X00,0X00,0X00,
0XFF,0XFF,0XFE,0X00,0X00,0X00,
0XFF,0XFF,0XFF,0X00,0X00,0X00,
0XFF,0XFF,0XFF,0X80,0X00,0X00,
0XFF,0XFF,0XFF,0XC0,0X00,0X00,
0XFF,0XFF,0XFF,0XE0,0X00,0X00,
0XFF,0XFF,0XFF,0XF0,0X00,0X00,
0XFF,0XFF,0XFF,0XF8,0X00,0X00,
0XFF,0XFF,0XFF,0XFC,0X00,0X00,
0XFF,0XFF,0XFF,0XFE,0X00,0X00,
0XFF,0XFF,0XFF,0XFF,0X00,0X00,
0XFF,0XFF,0XFF,0XFF,0X80,0X00,
0XFF,0XFF,0XFF,0XFF,0XC0,0X00,
0XFF,0XFF,0XFF,0XFF,0XE0,0X00,
0XFF,0XFF,0XFF,0XFF,0XF0,0X00,
0XFF,0XFF,0XFF,0XFF,0XF8,0X00,
0XFF,0XFF,0XFF,0XFF,0XFC,0X00,
0XFF,0XFF,0XFF,0XFF,0XFE,0X00,
0XFF,0XFF,0XFF,0XFF,0XFF,0X00,
0XFF,0XFF,0XFF,0XFF,0XFF,0X80,
0XFF,0XFF,0XFF,0XFF,0XFF,0XC0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XE0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XF0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFC,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFE
};
//======================================================================
/* I/O port definition */
//======================================================================
sbit A1_DS = P1^1; //74HC595定义SPI要使用的 IO
sbit A1_ST_CP = P1^2;
sbit A1_SH_CP = P1^0;
35
sbit A2_DS = P1^4; //74HC595定义SPI要使用的 IO
sbit A2_ST_CP = P1^5;
sbit A2_SH_CP = P1^3;
sbit A3_DS = P1^7; //74HC595定义SPI要使用的 IO
sbit A3_ST_CP = P3^7;
sbit A3_SH_CP = P1^6;
sbit A4_DS = P3^5; //74HC595定义SPI要使用的 IO
sbit A4_ST_CP = P3^4;
sbit A4_SH_CP = P3^6;
sbit A5_DS = P2^6; //74HC595定义SPI要使用的 IO
sbit A5_ST_CP = P2^5;
sbit A5_SH_CP = P2^7;
sbit A6_DS = P2^3; //74HC595定义SPI要使用的 IO
sbit A6_ST_CP = P2^2;
sbit A6_SH_CP = P2^4;
sbit KEY_MODEL=P3^0; //样式切换按键
sbit KEY_WORK =P3^2; //继续/暂停按键
sbit KEY_AUTO =P3^3; //手动/自动按键
sbit KEY_HAND =P3^1; //手动切换按键
//======================================================================
/* Variable definition */
//======================================================================
UCHAR JDE_MODEL; //切换模式变量定义
UCHAR JDE_WORK; //工作切换变量定义
UCHAR JDE_AUTO; //手动/自动切换变量定义
UCHAR CNT_TIME; //时间计算变量定义
UCHAR DAT_WORK; //LED工作切换变量定义
//======================================================================
/* Function declaration */
//======================================================================
//延时毫秒子函数定义
void DELAY_MS(UINT i)
{
UINT j,k;
for(j=0; j<i; j++)
{
for(k=0; k<100; k++)
{
_nop_();
}
}
}
//74HC595发送数据
void SEND_A1_A8(UCHAR DAT)
{
UCHAR i;
//--发送第一个字节--//
36
for(i=0;i<8;i++)
{
A1_DS = DAT >> 7; //从高位到低位
DAT <<= 1;
A1_SH_CP = 0;
A1_SH_CP = 1;
}
//--输出--//
A1_ST_CP = 0; //set dataline low
A1_ST_CP = 1; //片选
A1_ST_CP = 0; //set dataline low
}
//74HC595发送数据
void SEND_A9_A16(UCHAR DAT)
{
UCHAR i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
A2_DS = DAT >> 7; //从高位到低位
DAT <<= 1;
A2_SH_CP = 0;
A2_SH_CP = 1;
}
//--输出--//
A2_ST_CP = 0; //set dataline low
A2_ST_CP = 1; //片选
A2_ST_CP = 0; //set dataline low
}
//74HC595发送数据
void SEND_A17_A24(UCHAR DAT)
{
UCHAR i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
A3_DS = DAT >> 7; //从高位到低位
DAT <<= 1;
A3_SH_CP = 0;
A3_SH_CP = 1;
}
//--输出--//
A3_ST_CP = 0; //set dataline low
A3_ST_CP = 1; //片选
A3_ST_CP = 0; //set dataline low
}
//74HC595发送数据
37
void SEND_A25_A32(UCHAR DAT)
{
UCHAR i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
A4_DS = DAT >> 7; //从高位到低位
DAT <<= 1;
A4_SH_CP = 0;
A4_SH_CP = 1;
}
//--输出--//
A4_ST_CP = 0; //set dataline low
A4_ST_CP = 1; //片选
A4_ST_CP = 0; //set dataline low
}
//74HC595发送数据
void SEND_A33_A40(UCHAR DAT)
{
UCHAR i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
A5_DS = DAT >> 7; //从高位到低位
DAT <<= 1;
A5_SH_CP = 0;
A5_SH_CP = 1;
}
//--输出--//
A5_ST_CP = 0; //set dataline low
A5_ST_CP = 1; //片选
A5_ST_CP = 0; //set dataline low
}
//74HC595发送数据
void SEND_A41_A48(UCHAR DAT)
{
UCHAR i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
A6_DS = DAT >> 7; //从高位到低位
DAT <<= 1;
A6_SH_CP = 0;
A6_SH_CP = 1;
}
//--输出--//
A6_ST_CP = 0; //set dataline low
38
A6_ST_CP = 1; //片选
A6_ST_CP = 0; //set dataline low
}
/***********************************************************************/
//======================================================================
// MAIN FUNCTION
//======================================================================
/***********************************************************************/
void main(void)
{
//IO口初始化
P0=P1=P2=P3=0xFF;
//定时器中断0初始化
TMOD=0x01; //定时计数器0, 工作方式1
TH0=0x3C; //定时器赋初值:12MHz
TL0=0xB0; //50ms 定时时间
ET0=1; //允许定时/计数器0中断
TR0=1; //启动定时/计数器0中断
EA=1; //打开总中断
//while循环
while(1)
{
//模式切换
if(KEY_MODEL==0)
{
DELAY_MS(10);
if(KEY_MODEL==0)
{
JDE_MODEL++; //切换模式+1
JDE_MODEL%=10; //一共10种模式
DAT_WORK=0; //变量清0
CNT_TIME=0;
while(KEY_MODEL==0){DELAY_MS(1);} //按键松手检测
}
}
//工作切换
if(KEY_WORK==0)
{
DELAY_MS(10);
if(KEY_WORK==0)
{
JDE_WORK++; //工作切换+1
JDE_WORK%=2; //继续/暂停
while(KEY_WORK==0){DELAY_MS(1);} //按键松手检测
}
}
//手动/自动切换
39
if(KEY_AUTO==0)
{
DELAY_MS(10);
if(KEY_AUTO==0)
{
JDE_AUTO++; //工作切换+1
JDE_AUTO%=2; //手动/自动
DAT_WORK=0; //变量清0
CNT_TIME=0;
while(KEY_AUTO==0){DELAY_MS(1);} //按键松手检测
}
}
}
}
/***********************************************************************/
//======================================================================
// INNER INTERRUPT: TIMER0
//======================================================================
/***********************************************************************/
void TIMER0(void) interrupt 1
{
/* 流水灯输出时间计数*/
if(JDE_WORK==0)
{
/* LED流水灯计算 */
CNT_TIME++; //时间计数+1
CNT_TIME%=2; //流水灯时间调整【设置成5*50MS=250MS】
if(CNT_TIME==1) //切换流水灯
{
DAT_WORK++; //工作+1
DAT_WORK%=48; //一共48个灯
//花色自动切换
if(DAT_WORK==0)
{
if(JDE_AUTO==0)
{
JDE_MODEL++; //切换模式+1
JDE_MODEL%=10; //一共10种模式
}
}
}
/* LED流水输出 */
switch(JDE_MODEL)
{
case 0:
SEND_A1_A8 (OUT1[DAT_WORK*6+0]);
SEND_A9_A16 (OUT1[DAT_WORK*6+1]);
40
SEND_A17_A24(OUT1[DAT_WORK*6+2]);
SEND_A25_A32(OUT1[DAT_WORK*6+3]);
SEND_A33_A40(OUT1[DAT_WORK*6+4]);
SEND_A41_A48(OUT1[DAT_WORK*6+5]);
break;
case 1:
SEND_A1_A8 (OUT2[DAT_WORK*6+0]);
SEND_A9_A16 (OUT2[DAT_WORK*6+1]);
SEND_A17_A24(OUT2[DAT_WORK*6+2]);
SEND_A25_A32(OUT2[DAT_WORK*6+3]);
SEND_A33_A40(OUT2[DAT_WORK*6+4]);
SEND_A41_A48(OUT2[DAT_WORK*6+5]);
break;
case 2:
SEND_A1_A8 (OUT3[DAT_WORK*6+0]);
SEND_A9_A16 (OUT3[DAT_WORK*6+1]);
SEND_A17_A24(OUT3[DAT_WORK*6+2]);
SEND_A25_A32(OUT3[DAT_WORK*6+3]);
SEND_A33_A40(OUT3[DAT_WORK*6+4]);
SEND_A41_A48(OUT3[DAT_WORK*6+5]);
break;
case 3:
SEND_A1_A8 (OUT4[DAT_WORK*6+0]);
SEND_A9_A16 (OUT4[DAT_WORK*6+1]);
SEND_A17_A24(OUT4[DAT_WORK*6+2]);
SEND_A25_A32(OUT4[DAT_WORK*6+3]);
SEND_A33_A40(OUT4[DAT_WORK*6+4]);
SEND_A41_A48(OUT4[DAT_WORK*6+5]);
break;
case 4:
SEND_A1_A8 (OUT5[DAT_WORK*6+0]);
SEND_A9_A16 (OUT5[DAT_WORK*6+1]);
SEND_A17_A24(OUT5[DAT_WORK*6+2]);
SEND_A25_A32(OUT5[DAT_WORK*6+3]);
SEND_A33_A40(OUT5[DAT_WORK*6+4]);
SEND_A41_A48(OUT5[DAT_WORK*6+5]);
break;
case 5:
SEND_A1_A8 (OUT6[DAT_WORK*6+0]);
SEND_A9_A16 (OUT6[DAT_WORK*6+1]);
SEND_A17_A24(OUT6[DAT_WORK*6+2]);
SEND_A25_A32(OUT6[DAT_WORK*6+3]);
SEND_A33_A40(OUT6[DAT_WORK*6+4]);
SEND_A41_A48(OUT6[DAT_WORK*6+5]);
break;
case 6:
SEND_A1_A8 (OUT7[DAT_WORK*6+0]);
41
SEND_A9_A16 (OUT7[DAT_WORK*6+1]);
SEND_A17_A24(OUT7[DAT_WORK*6+2]);
SEND_A25_A32(OUT7[DAT_WORK*6+3]);
SEND_A33_A40(OUT7[DAT_WORK*6+4]);
SEND_A41_A48(OUT7[DAT_WORK*6+5]);
break;
case 7:
SEND_A1_A8 (OUT8[DAT_WORK*6+0]);
SEND_A9_A16 (OUT8[DAT_WORK*6+1]);
SEND_A17_A24(OUT8[DAT_WORK*6+2]);
SEND_A25_A32(OUT8[DAT_WORK*6+3]);
SEND_A33_A40(OUT8[DAT_WORK*6+4]);
SEND_A41_A48(OUT8[DAT_WORK*6+5]);
break;
case 8:
SEND_A1_A8 (OUT9[DAT_WORK*6+0]);
SEND_A9_A16 (OUT9[DAT_WORK*6+1]);
SEND_A17_A24(OUT9[DAT_WORK*6+2]);
SEND_A25_A32(OUT9[DAT_WORK*6+3]);
SEND_A33_A40(OUT9[DAT_WORK*6+4]);
SEND_A41_A48(OUT9[DAT_WORK*6+5]);
break;
case 9:
SEND_A1_A8 (OUT10[DAT_WORK*6+0]);
SEND_A9_A16 (OUT10[DAT_WORK*6+1]);
SEND_A17_A24(OUT10[DAT_WORK*6+2]);
SEND_A25_A32(OUT10[DAT_WORK*6+3]);
SEND_A33_A40(OUT10[DAT_WORK*6+4]);
SEND_A41_A48(OUT10[DAT_WORK*6+5]);
break;
}
}
else
{
//点亮全部LED
SEND_A1_A8 (0x00);
SEND_A9_A16 (0x00);
SEND_A17_A24(0x00);
SEND_A25_A32(0x00);
SEND_A33_A40(0x00);
SEND_A41_A48(0x00);
}
/* 定时器0重新赋值 */
TH0=0x3C; //定时器赋初值:12MHz
TL0=0xB0; //50ms 定时时间
}
5、系统软硬件调试
5.1 软件调试
5.1.1仿真
目前世界上可以实现电子系统原理设计仿真,并且对PCB进行布线编辑的软件非Proteus莫属。因为它同时拥有
Ares和Isis的功能,且能够在模拟单片机的CPU处于工作状态的同时模拟单片机的相关电路和其它普通电路的工作状
态。有了它的帮助,我们可以直接以工程角度来模拟和调试程序,使得测试时的过程和最后的结果更加真实。这种
模拟实验在一定程度上解决了模拟实验与现实之间的矛盾。带项目符号的栅格区域是编辑窗口,左上角区域是预览
窗口,右下角则为元件区域列表,通常情况下编辑窗口所具备的功能有三种,即原理图的绘制、元件的放置及导向
的连接。预览窗口中会有两个框来显示全部的原理图,绿色框所展示的内容是当前编辑窗口中所显示的部分,蓝色
框则表示当前所占页面的边界。在选择新的项目之前,我们应该在预览窗口里查看和预览所有项目,最后在项目选
择器里选择新项目。如果我们想更新所选位置的编辑窗口,只要点击预览窗口就可以做到。然后在编辑窗口中选择
元器件进行电路的绘制,将所有元器件和线路连接好之后,点击左下角的开始键进行测试。
5.1.2仿真结果
如图5-1(1)、5-1(2)、5-1(3)、5-1(4)、5-1(5)、5-1(6)、5-1(7)、5-1(8)、5-1(9)所
示,点击左下角开始按钮开始仿真,系统默认进入自动模式,开始按顺序自动在各个花型之间切换。按下复位按钮
回到初始模式,接着按下暂停按钮,所有小灯全亮,然后按下自动手动模式切换按钮进入手动模式,通过花型切换
按钮依次进入顺时针流水灯模式、逆时针流水灯模式、交替闪烁模式、顺时针对角灯模式、逆时针对角灯模式、顺
时针逐个熄灭模式、顺时针逐个点亮模式、由里及外三层心形模式、逆时针逐个熄灭模式、逆时针逐个点亮模式,
最后开始回到第一种模式进行循环切换。
图5-1(1)顺时针、逆时针流水灯模式
图5-1(2)暂停状态
图5-1(3)交替闪烁模式
图5-1(4)顺时针、逆时针对角灯模式
从仿真结果上来看,本设计成功实现了顺时针流水灯、逆时针流水灯、交替闪烁、顺时针对角灯、逆时针对角
灯、顺时针逐个点亮、顺时针逐个熄灭等功能,并且可以在手动模式和自动模式之间切换。但是由于自己经验的不
足,最终设计出来的三层心形没有那么美观。
5.2实物调试
完成对艺术彩灯系统的硬件软件设计之后,开始对实物进行焊接。
本设计所使用的元件清单如下:15*20电路板、6个74HC595芯片、STC89C52单片机、40PIC座、6个16PIC座、48
个510欧姆电阻、10k电阻、48个5mm红色LED 、10uf电解电容、2个30pf瓷片电容、12MHZ晶振、4个按键、自锁开
关、DC电源插口、导线若干、焊锡若干、USB转圆头电源线。
图5-2(1) 艺术彩灯实物完成图
图5-2(2)艺术彩灯实物焊接图
结果成功实现,最后还有顺时针逐个点亮模式和逆时针逐个熄灭模式,就不一一展示。从上面测试的结果可以看
出,最终要求的所有花型都可以达到,且按下复位按键后系统会回到初始的自动模式并从顺时针流水灯模式开始自
动切换花型。至此,实物效果测试结束。
结 论
这次艺术彩灯系统设计所用到的+5V电源系统、单片机系统、LED彩灯,都是以前在实验室所接触过的东西,有
什么不懂的地方我可以参阅教材和查阅资料。设计主要是结合单片机技术,把理论知识与艺术彩灯系统设计结合,
通过简单的I/O接口并行输入输出8位数据以及中断服务,在软件编程的加持下,实现由开关控制多个LED彩灯的亮灭变化,最终产生艺术彩灯效果。
这次的毕业设计,提高了我的综合素质,拓宽了我的知识面,进一步增强了我的动手能力、激发了我的创新思
维以及加深了我对单片机系统深刻认识和理解。同时也暴露除了某些方面知识点的薄弱和不足。毕业设计的总体目
的是通过理论与实践的结合,考验我们的理解能力和思考能力,以及如何去动手解决问题的实际行动能力。并且还
能检查我门对知识的学习能力,判断是否能将学到的知识转化运用到实际的设计工作中来,了解课堂学习与实际工
作的距离,对现实中的设计工作有着十分重要的意义。实践能力的培养非常重要,仅仅依靠课堂教学是远远不够
的,课下时间我会查漏补缺,努力学习,夯实基础,进一步提高单片机系统设计技能以及C语言编程水平。找出自身
情况与实际需求之间的差距,为求职和正式工作做好充分的知识和能力准备。
在设计过程中我遇到了许多困难,也发现了很多的问题。虽然最后完成了设计,但我自认为设计没有达到我期
望的效果。有的问题其实很简单,但由于我对知识的掌握度不够,扩展的知识也有所欠缺。在我看来,解决问题是
一个十分耗时甚至痛苦的过程,而最后问题得到解决又会使我倍感成功。 于是我意识到应该多阅读课外的文献,只
靠书本上的知识远远不够的。而我认为最重要的是我们得学会把从书本中学到的知识与现实联系起来,以实践来巩
固理论,以理论来优化实践,这将对我们以后的学习乃至人生起到重要作用。
作者:qq_1039692211