毕业课程设计--光立方.docx_第1页
毕业课程设计--光立方.docx_第2页
毕业课程设计--光立方.docx_第3页
毕业课程设计--光立方.docx_第4页
毕业课程设计--光立方.docx_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要本设计制作出一个三维立体显示图案的LED光立方。本产品不仅可以像发光二极管点阵一样显示平面的静态或动态画面,还可以显示立体的静态或动态画面,打破了传统的平面显示方案。同时又增加了显示的花样和立体图案显示效果,可以广泛用于传媒信息显示和各种装饰显示,为将来显示技术的进步和发展指导了方向,光立方显示比发光二极管点阵更具有视觉效果,而且画面图案更加非富多彩。本设计是采用AT89S52单片机为核心控制器,八D边沿触发器(三态)74LS573扩展I/O口,完成硬件电路设计。通过软件编程控制数据下载到单片机完成设计图案的显示。软件采用自上而下的模块化设计思想,使系统朝着分布式、小型化方向发展,增强系统的可扩展性和运行的稳定性。 关键词: 52单片机;74HC573锁存器;8*8*8LED显示; ABSTRACTThis design produced a three-dimensional pattern of the LED light cube. This product can not only like a light-emitting diode dot matrix display plane static or dynamic screen can also display three-dimensional static or dynamic images,and to break the traditional program.While increasing the display patterns and three-dimensional effect can be widely used to display and decorative display for future progress and development to guide the direction,light cube display more visual effects than the light-emitting diode dot matrix,and the picture is more rich colorful. With a combination of graphics and characters more perfect display characteristics.The design is AT89S52 MCU core controller,eight D edge flip-flop 74LS574 (tri-state) expansion I/O port completion of the hardware circuit design. Programmed by software to control the data is downloaded to the MCU to complete the designs of the show. This design software is a top-down modular design,the system moving in the direction of distributed,small development,enhance the stability of the systems scalability and running. KEY WORDS: 52single-chip;74HC573latch;8*8*8 3DLED;目录1、 设计要求与方案1 1.1设计目的1 1.2设计要求1 1.3设计思路1 1.4设计的总体要求及方案选择22、 工作原理3 2.1模块的简介3 2.2 3DLED光立方工作原理43、方案选择5 3.1电源的选择5 3.2 3D显示核心控制器5 3.3 I/O口扩展芯片的选择6 3.4 LED发光显示二级管64、硬件整体设计概述及功能分析8 4.1 系统概述 8 4.2 系列单片机简介9 4.3 时钟电路设计9 4.4 复位电路设计10 4.5 74HC573芯片连接电路图与介绍115、 主程序设计思路13 5.1程序流程框图13 5.2显示程序的设计13 5.2.1 LED显示屏的数据传送13 5.2.2 显示程序的设计146、 硬件电路设计15 6.1 单片机与74HC573连接线路图15 6.2 LED焊接方法15 6.2.1焊前准备工作15 6.2.2焊接16 6.3 整体实物图177、 程序设计分析与选择18 7.1单片机C语言主要特点19 7.2单片机C语言与标准语言的区别19 7.3数据类型的选用20 7.4算法设计问题20 7.5数据存储器的分配21 7.6单片机C语言与汇编语言的混合编程21 7.7程序分析选择238、 程序设计249、 设计结果分析28总 结30致谢31参考文献321、设计要求与方案1.1 设计目的 在当今现代信息化社会的高速发展过程中,大屏幕显示已经从公共信息展示等商业应用向消费类多媒体应用渗透。随着宽带网络的发展,数字化的多媒体内容将在信息世界中占据主流,新型的大屏幕显示设备将代替传统电视机成为人们享受信息和多媒体内容的中心。为追求舒适、逼真、清晰的3D视频显示,为此制作出一个三维立体显示图案的LED光立方。该设计方案将打破了传统的平面显示视频的方法,该方案设计的LED显示屏显示画面色彩鲜艳,立体感强,静如油画,可以广泛应用于广告公司、交通运输、车站、商场、医院、宾馆、证券市场、工业企业管理等公共场所。1.2 设计要求 (1)毕业设计(论文)中心突出,内容充实,论据充分,论证有力,数据可靠,结构紧凑,层次分明,图表清晰,格式规范,字迹工整,结论正确。 (2)设计制作一个8*8*8的三维的发光二极管显示方阵,能够通过编写程序来实现对每一个发光二级管控制,从而来显示多种多样的图案。控制显示输出至少二十种显示效果。 (3)通过大量编写程序调试实验现象结果分析研究数据形成规律,对规律总结得出结论并初步确定算法。1.3 设计思路 本设计根据二极管点阵的原理由单片机I/O口控制点亮不同的二极管从而组成出不同的画面,根据人眼的视觉暂留现象即当物体移去时视觉神经对物体的印象不会立即消失而是要延续0.1-0.4秒的时间 ,来设置每幅画面的延迟时间使连续的一系列画面呈现动态。每一个层面的二极管阳极接在一起受一路I/O口控制,实际电路中该路I/O口输出的控制信号通过5V继电器的吸合和断开来控制的,再输入发光二极管的阳极使其驱动。每一个二极管的阴极分别受单片机扩展后的I/O控制。每个灯都是由片选端口和控制端口共同决定亮或灭。因此,我们可以随意的来点亮立方体中任意一处的灯,来构建多种多样的图案。1.4 设计的总体要求及方案选择 本次设计制作一个8*8*8的三维的发光二极管立方显示体,能够通过编写程序来实现对每一个发光二级管的亮灭控制,从而可以显示多种多样的图案。为了吸引观众增强显示效果,可以有多种显示模式。最简单的显示模式是静态显示。与静态显示模式相对应,就有各种动态显示模式,它们所显示的图文都是能够变化的。按照图文运动的特点又可以分为闪烁、平移、旋转、缩放等多种显示模式。产生不同显示显示模式的方法,并不意味着一定要重新编写显示数据,可以通过一定的算法从原来的显示数据直接生成。这样程序书写就不会过于繁琐和重复,而且对核心控制器的内存空间要求不高。借鉴单片机控制LED点阵显示的原理,通过系统分析,确定该系统该具有哪些功能,有哪些模块,各个模块之间是怎样连接,以及怎样组合电路是最合理最简单的,即硬件方案设计。编写硬件电路的相对应软件程序部分,利用仿真软件对程序进行测试修改。电路系统焊接完毕后,测试整个的系统模块的功能,看各个功能是否能正常运行,并依据实验结果找出程序中的错误,改正这些错误至测试成功完成毕业设计要求。 2、工作原理2.1模块的简介 有8个8*8点阵,再用8个引脚来当充当各个8*8点阵的“开关”。只要将64个灯阳极连在一起,在连到这个引脚上。采用了HC573暂存的方法,来分别把64个灯的亮灭信息存到这个上面,然后再一起输出到灯上,573的64个输出引脚控制前面所述每一个面的64个灯;而每层灯的阴极全连接在一起接入单片机,由单片机控制的每一个层灯。通过单片机主控芯片AT89S52来控制所有灯的亮灭,从而控制P0、P1、P2实现控制X、Y、Z空间立体控制来显示我们所需要显示的现象。如图2.1和2.2所示。整个设计主要分为三个模块分别是主控模块、驱动模块、显示模块. 图2.1 层面 图2.2 64个灯孔2.2 3DLED光立方工作原理本设计介绍一个3D LED光立方显示屏的制作,在单片机的P0口输出显示代码,然后把扫描片选择锁存器送入74HC573,通过片选哪一列对应的芯片就可以把显示的内容送到显示屏显示。考虑到P0口必需设置上拉电阻,我们采用4.7 k排电阻作为上拉电阻。设计原理:利用单片控制LED点阵显示的原理和控制技术,来制作控制光立方显示。通过编写程序控制不同LED的显示,显示所要显示的内容。根据人眼的视觉暂留效应,设置每幅画面的延迟时间使连续的一系列画面呈现动态。最终达到所要显示的内容。每个灯都是由层控制端和列控制端共同决定亮或灭。单片机层驱动器LED光立方列驱动器图2.2 LED光立方整体显示框图在三维光立方中采用动态扫描显示,这种显示方式巧妙地利用了人眼的视觉暂留特性。将连续的几帧画面高速的循环显示,只要帧速率高于24帧/秒,人眼看起来就是一个完整的,相对静止的画面。最典型的例子就是电影放映机。在电子领域中,因为这种动态扫描显示方式极大的缩减了发光单元的信号线数量,因此在LED显示技术中被广泛使用。现简单描述一下用动态扫描显示的方式,显示字符“B”的过程。图2.3 用动态扫描显示字符“B”的过程3、方案选择3.1电源的选择方案一:采用普通干电池作为LED系统的电源,由于点阵系统耗电量较大,点阵系统一般悬挂在高处上,一直不停的工作。使用干电池需经常换电池,不符合节约型社会的要求。方案二:采用一块LM7805三端集成稳压器。把市电经变压器降压输入电路,而后整流送到LM7805三端稳压器稳压输出作为工作电压。不仅功率上可以满足系统需要,不需要更换电源,并且比较轻便,使用更加安全可靠。方案三:采用5V电源的移动充电宝。基于以上分析,决定选取5V电源的移动充电宝供电电源。3.2 3D显示核心控制器控制部分是整个系统的核心部分,其功能可以实现与上位机通信接收上位机发送的数据和控制指令经处理过后控制显示屏显示内容。其常用的电子设计方法有单片机、DSP、及EDA技术。方案一:单片机单片机是集成了CPU,ROM,RAM和I/ O口的微型计算机。它有很强的接口性能,非常适合于工业控制,因此又叫微控制器(MCU)。单片机品种齐全,型号多样 CPU 从8,16,32到64位,多采用RISC 技术,片上I/O非常丰富,有的单片机集成有A/ D,“ 看门狗”,PWM,显示驱动,函数发生器,键盘控制等。它们的价格也高低不等,这样极大地满足了开发者的选择自由。除此之外单片机还具有低电压和低功耗的特点。随着超大规模集成电路的发展,单片机在便携式产品中大有用武之地。方案二:DSP 芯片DSP 又叫数字信号处理器。顾名思义,DSP主要用于数字信号处理领域,非常适合高密度,重复运算及大数据容量的信号处理。现在已经广泛应用于通信、便携式计算机和便携式仪表、雷达、图像、航空、家用电器、医疗设备等领域。 DSP区别于一般微处理器的另一重要标志是硬件乘法器以及特殊指令,一般微处理器用软件实现乘法,逐条执行指令,速度慢。DSP 依靠硬件乘法器单周期完成乘法运算,而且还具有专门的信号处理指令。它的强大数据处理能力和高运行速度,是最值得称道的两大特色。芯片内置544字的高速SRAM。外部可寻址64K字程序/数据及I/O,令周期在25ns50ns之间,实时性处理比16位单片机快2倍以上,可取代一般的单片机。方案三:EDAEDA(即Electronic Design Automation) 即电子设计自动化,它是以计算机为工具,在EDA 软件平台上,对用硬件描述语言HDL 完成的设计文件自动地逻辑编译、逻辑化简、逻辑分割、逻辑综合及优化、逻辑布局布线、逻辑仿真,直至对于特定目标芯片进行适配编译、逻辑影射和编程下载等。而且MCU和DSP都是通过串行执行指令来实现特定功能,不可避免低速,而FPGA/CPLD则可实现硬件上的并行工作,在实时测控和高速应用领域前景广阔;另一方面,FPGA/CPLP器件在功能开发上是软件实现的,但物理机制却和纯硬件电路一样,十分可靠。基于以上分析,三种设计方式相比较各有优点且都能够实现控制功能,但单片机的技术门槛较低开发成本也较低非常适合初学者进行学习和锻炼使用。现在市场上常用的单片机主要有MCS-52、AVR、ARM、PIC等。其中应用最广泛的单片机首推Intel的52系列,由于产品硬件结构合理,指令系统规范,加之生产历史“悠久”,有先入为主的优势常作为单片机学习的教材。所以决定选取52系列单片机作为控制部分的核心器件。3.3 I/O口扩展芯片的选择方案一:选取串口输入并口输出芯片74LS164,虽然I/O口使用较少,由于本次设计共需要72路I/O口,列驱动电路就需要8块74LS164。显示数据是先后顺序给送去的,显示会有延迟,而LED动态显示的刷新的时间控制大约10ms,实时性差,效果不好。方案二:74HC573 跟74LS573的管脚一样。器件的输入是和标准CMOS 输出兼容的;加上拉电阻,他们能和HC/ALSTTL 输出兼容。当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。8块74HC573共用64个I/O口,数据可以并行写入芯片,延迟时间少,满足设计要求。综合以上比较,决定选取74HC573作为列线驱动IO口扩展芯片。 3.4 LED发光显示二级管LED是一种固体光源,当它两端加上正向电压时就可以发光。采用不同的材料,可制成不同颜色的发光二极管。作为一种新的光源,广受欢迎而得以快速发展。从而在各种各样的传媒信息的宣传中得以体现。简述其分类方法如下。1)按颜色分类单基色显示屏:单一颜色(红色、绿色、黄色、蓝色等等)。双基色显示屏:红和绿双基色,256级灰度、可以显示65536种颜色。全彩色显示屏:红、绿、蓝三基色,256级灰度的全彩色显示屏可以显示一千六百多万种颜色。2)按使用场合分类室内显示屏:发光点较小,一般3mm-8mm,显示面积一般零点几至十几平方米。 室外显示屏:面积一般几十平方米至几百平方米,亮度高,可在阳光下工作,具有防风、防雨、防水功能。 3)按发光点直径分类室内屏:3mm、3。75mm、5mm。 室外屏:10mm、12mm、16mm、19mm、21mm、26mm。 基于以上分析结果,加上由于成本和控制的难易程度,决定选取单色3mm绿光LED作为本次设计显示色彩,亮度高,显示效果很好。4、硬件整体设计概述及功能分析4.1 系统概述 3D LED光立方总体框图如图3.1所示。电路大体上可以分成核心控制电路、显示驱动电路、串信通信电路三部分。核心控制电路部分包括一个52系统CUP和一些外围电路。在整个电路当中此电路部分可以相当于一个上位机,它负责控制整个电路以及相应的程序的运行、与PC机的串行通讯、以及给显示屏部分发送命令。单片机根据编写好的内容和指令通过I/O口扩展后驱动8*8*8 LED光立方显示屏。本次设计将以此方案为指导思想展开具体的硬件电路设计。 显示电路采用动态扫描方式进行显示时,每列有一个列驱动器,各列的同名行共用一个行驱动器。由单片机给出的行选通信号,从第一列开始,按顺序依次对各列进行扫描选通,根据锁存器的特性可以把数据锁存输出。这样就可以把八列的数据输出显示,完成列线数据的传送。另一方而,根据各列层面要显示的数据,通过三极管驱动继电器来控制相应层面的电平,列与层面的数据结合共同来显示图案。 AT89S52行驱动器列驱动器 8*8*8LED 点阵 显示屏电源复位电路时钟电路图4.1 系统结构设计总图4.2 系列单片机简介 单片机(Microcontroller,又称微处理器)是在一块硅片上集成了各种部件的微型机,这些部件包括中央处理器CPU、数据存储器RAM、程序存储器ROM、定时器/计数器和多种I/O接口电路。单片机最小系统包括时钟电路和复位电路。时钟电路用于产生AT89S52单片机工作时必需的控制信号。单片机的内部电路正是在时钟信号的控制下,严格地按照时序执行指令进行工作。复位电路是为单片机初始化操作准备的。只要单片机的复位引脚RST上的复位信号要持续两个机器周期(24个时钟周期)以上,就可以使AT89S52单片机复位。如图3.2所示。 图4.2 单片机最小系统电路图4.3 时钟电路设计AT89S52单片机各功能部件的运行都以时钟信号为基准,有条不紊、一拍一拍地工作。因此时钟频率直接影响单片机的处理速度,时钟电路的质量也是直接影响单片机系统的稳定性。常用的时钟电路有两种方式,一种是内部时钟方式,另一种是外部时钟方式。本次采用外部时钟方式。AT89S52单片机芯片内部设有一个由反向放大器构成的振荡器,XTAL1和XTAL2分别为振荡电路的的输入端和输出端,时钟可有内部或外部生成,在XTAL1和XTAL2引脚上外接定时元件,内部振荡电路就会产生自激振荡。系统采用的定时元件为石英晶体和电容组成的并联谐振回路。时钟频率fosc采用12MHZ,C1、C2的电容值取30pF,电容的大小起频率微测的作用。如3.3图所示。图4.3 时钟电路图4.4 复位电路设计 AT89S52单片机在启动运行时或者出现死机时需要复位,使CPU以及其他功能部件处于一个确定的初始状态,PC初始化为0000H。单片机从这个状态开始执行程序。除了进入系统的正常初始化之外,当程序行出错(如程序“跑飞”)或操作错误使系统处于 “死锁”状态时,也需要按复位键即RST脚为高电平,使AT89S52摆脱“跑飞”“死锁”状态而重新启动程序。 单片机有多种复位方式,常用的复位操作有上电复位和手动按键电平复位方式。本设计采用手动按键电平复位方式,电路搭建图见图4.4。上电复位是通过外部复位电路的电容充电来实现的,复位电路产生的复位信号(高电平有效)由RST通过复位电路相连,手动输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号对AT89S52单片机进行复位。当上电时,C3相当于短路,有时碰到干扰时会造成错误复位,可在复位端加个去耦电容,可以复位电路更加可靠。 图4.4 按键电平复位电路图4.5 74HC573芯片连接电路图与介绍图4.5 74HC573芯片连接电路图 74HC573 跟74LS573的管脚一样。器件的输入是和标准CMOS 输出兼容的;加上拉电阻,他们能和HC/ALSTTL 输出兼容。当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。输出能直接接到CMOS,NMOS 和TTL 接口上操作电压范围:2.0V6.0V,低输入电流:1.0uA,CMOS 器件的高噪声抵抗特性。管脚功能图: 管脚功能图74HC573功能表INPUTS 输入Outputs输出OE LE D Q (HC573) HXXZLLXNO CHANGE *LHLLLHHH74HC573逻辑图5、主程序设计思路5.1 程序流程框图系统软件采用汇编语言编写,按照模块化的设计思路设计程序。首先分析程序所要实现的功能,程序要实现可静态显示、动态显示、三维立体显示。通过按键控制程序选择不同的显示程序进行显示。图5.1 主程序流程图程序开始时首先必须对单片机进行初始化设置,其中初始化设置的内容包括:中断优先级的设定,中断初始化,定时器初始化,串行通信时通信方式的选择和波特率的设定,各IO口功能的设定等。把各子程序写为一个可单独执行的完整子程序段。各子程序编译没有错误后再下载到单片机进行仿真验证,这两项都通过后再将所有的程序整合到一起,形成一个完整的程序再进行编译和仿真验证。5.2 显示程序的设计 5.2.1 LED显示屏的数据传送 动态扫描显示是把整个LED屏幕分成若干部分,每一幅画面显示过程是显示完一部分后,又显示第二部分直到显示完最后一部分又重新开始显示第一部分,重复循环进行。在重复扫描速度足够快的情况下,我们看到的就是一幅稳定的静态画面。也就是说采用动态扫描显示需要不断进行画面的刷新。动态扫描分为行扫描和列扫描,两种方式区别在于选通端和数据输入端分别是行还是列。先选通列然后再从行送入对应列的数据,这样从第1列到第8列循环往复,只要切换的速度足够的快利用人眼的延时特性就可以看见一幅稳定的画面。 5.2.2 显示程序的设计 显示采用的是扫描显示方式,选通一列后按照列对应的数据表的数据第i列对应的列数据为数组中的第i和第i+7个元素。将对应数据由低至高位依次从控制端口输出显示。向右逻辑移位所得结果通过单片机端口输出到锁存器,通过片选需要显示对应的锁存器在输出显示。如此依次循环选通各列来显示所需画面。YN显示数据送0选通列,送锁存输出 送下一列数据,选通信号左移左移次数8显示完成后程序初始化 开始子程序返回 动态显示程序流程图见5.2.2。把显示的数据送到P0口,相应的锁存器接收数据,再把片选锁存器的数据送到端口,相应锁存器接收数据并锁存输出显示,接着把下一组数据送到P0口,改变片选锁存器的数据,送到相应锁存器输出显示,直到把所有的数据局输出传送完毕后,显示完成后,退出显示程序,等待指令。输出形式多种多样,可以静态输出图案,也可以动态、左移、右移、循环等花样显示。 图5.2.2 显示程序流程图6、硬件电路设计6.1 单片机与74HC573连接线路图 首先在porter平台里画出单片机AT89S52与芯片74HC573的连接图,变换成PCB图,转印在PCB板上面,然后再根据图把各个元器件焊接上去。但考虑到PCB板太小,不能满足灯座的占地面积,所以把PCB板重新固定在20*22的万能板上。如图5.1所示。图6.1 单片机与74HC573连接线路图6.2 LED灯焊接方法 6.2.1 焊接前准备工作 准备好烙铁、焊锡丝、钳子等工具,以及LED。LED的正负极很好判别,长的引脚为+,短的为-。LED最好选用直径3mm的LED,推荐选绿色。长脚的LED可以省很多工作量。实际测量长脚是29mm,短脚为27mm,由于LED光立方板子灯的间距决定了,每个LED的间距是20mm。这样长短引脚都符合这个尺寸。由于所有LED框架焊接好后,一旦有LED损坏更换难度很大,所以焊接前要测试所有LED,用一般数字显示万用表打到二极管量程,用万用表红表笔接长引脚,黑的接短引脚。LED正常发光并且亮度基本一致,这样的LED就是好的,否则是坏灯。如果为了确保可靠也可以焊接好一层后测试LED是否能点亮。 6.2.2 焊接 将8个LED焊接为一组,可以通过2种方法完成。 方法一:需要用钳子将LED的正极扭弯,这个弯,一定要小,正好露出LED外围打弯正合适,LED的正极折弯后留下的引脚长度必须大于LED的间距20mm,以确保有足够的重合位LED灯脚全部折好后,就可以焊接了,为了方便焊接可以在万能板上面钻几个2mm的孔,间距为 8个洞洞置以便焊接。焊接细节,将一个LED正极的引脚靠近到另一个LED正极的打弯处,然后上焊锡焊接,焊接要光亮可靠,有一定机械强度。这样将全部LED焊接成8个一组的LED灯排待用。焊接时避免用过多助焊剂,要不会粘到LED表面,影响外观。焊机避免正负2极短路。注意每一层的二极管都是共阴的。 方法二:需要借助一个工艺设备,这个东西可以自己动手制作,用这个辅助焊接当然要容易些。焊接方法也是一样的,将一个LED正极的引脚靠近到另一个LED正极的打弯处,然后上焊锡焊接,焊接要光亮可靠,有一定机械强度。这样将全部LED焊接成8个一组的LED灯排待用。焊接小经验,由于LED灯脚有一定弹性,一个LED的引脚靠近到另一个LED正极的打弯处时,一松手就又弹远了,所以建议焊接时多掰一点,掰过了之后利用弹性将两个要焊接的引脚 靠进,这样焊接会容易许多。如图6.2.2所示。 图6.2.2 灯焊接模具6.3整体实物图 整个光立方的连接是用排线和杜邦线连接而成,这样方便拆和安装,但过程比较繁琐,也很容易出错误,有事也会产生接触不良。整体图如图6.3.1和图6.3.2所示。 图6.3.1 排线和杜邦线连接图 6.3.2 整体实物图7 程序设计的选择与分析 作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。但是基于单片机的C语言和标准C语言有很大区别,如何结合单片机的系统资源,用C语言开发符合实际工程需要的单片机系统,对用编程者来说具有十分重要的意义。7.1单片机C语言主要特点 用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的模块完成不同的功能1,这样可使整个应用系统程序结构清晰,易于调试和维护。不同的功能模块,分别指定相应的入口参数和出口参数,对于一些要重复调用的程序一般把其编成函数,这样可以减少程序代码的长度,又便于整个程序的管理,还可增强可读性和移植性。在实际单片机程序设计中,程序结构一般均采用如下结构:#include /*头文件说明部份*/unsigned char x1,x2; /*全局变量声明部份*/Function1( ) /*功能函数定义部份*/main() inti,j; /*整型变量声明部份*/Function1(); /*功能函数说明部份*/7.2 单片机C语言与标准C语言的区别 由于现在越来越多的产品都采用单片机开发,所完成的计算和控制工作也日趋复杂,但是单片机系统是一种资源十分有限的系统,这主要表现在程序存储器资源的不足,因此在程序设计时如何使用好这些有限的资源就显得十分重要。用C语言编程虽然具有许多的优点,但是生成的代码相对要长,要是编程技术不好,生成的代码甚至有可能比汇编语言生成的代码长几倍,因此对编程者来说,应该注意到单片机C语言和一般意义上的标准C语言的区别,对程序进行适当的优化。7.3 数据类型的选用 单片机C语言编程不同于一般的C语言编程的显著的一个特点,就是要和程序存储器资源结合起来,虽然其提供的数据据类型十分丰富,但是只有bit和char等数据类型是是机器语言直接支持的数据类型,用此类数据类型的语句所生成的代码较短;而其它的数据类型如整型、浮点型等数据要有一定的内部程序或内部函数的支持,相对来说用该类数据类型的语句生成的代码要长。有些C语言程序表面上看起来十分的简单,但在在实际编译时,生成的代码却相当长。因此我们要按照实际需要,合理地选用数据,可以大大的减少所生成的代码长度。例如在S52中每种数据类型变量所占用存储器字节数和经编译后生成的代码长度如表1所示: 通过表1我们知道,不同的数据类型所生成的机器代码长度相差很多,相同类型的数据类型有无符号对机器代码长度也有影响。在程序编译时生成机器代码长的数据类型的优先级越高,不同的数据类型在进行程序运算时要转化为高优先级的的数据类型,相应的代码长度也会增长2。因此我们应尽可能地使用bit,char等机器语言直接支持的数据类型,无符号数的变量应声明为无符号数,尽可能地减少程序中使用的数据类型的种类。7.4算法设计问题 单片机C语言和标准C语言存在着很大差别,在计算机上进行C语言程序设计时由于不必考虑程序代码的长短,只需考虑程序功能实现,但是在单片机上进行C语言程序设计就必须考虑系统的硬件资源。有时并不是程序的算法越简单、长度越短越好,因为有一些算法要调用一些内部的子程序和函数,生成的机器代码长度非常长。不同的算法对程序代码长度影响十分大,因此在进行程序设计时,就尽量采用程序生成代码短的算法,在不影响程序功能实现的情况下可以采用一些优化算法2。 在单片机C语言编译成机器代码时,不同的运算生成的机器代码的长度相差很大,尽可能地减少程序中对某种数据类型的运算种类,越复杂的数据类型效果越明显。在进行数据计算时,在一定的精度范围内,可以用一些近似的计算来完成一些运算,既不损失精度又能减少大量的代码。比如:用逻辑AND/&取模比MOD/%操作更有效。 在用热敏电阻测量温度时,可根据热敏电阻温度特性公式来求值。数学表达式表示为:RT=RT0expB(1/T-1/T0) 如果直接按照公式温度时程序结构简单,算法复杂度不高,但是程序将调用文件中的对数函数,在编译成机器码时函数有1K多字节,对于一般只有几K字节的单片机系统来说,这是十分不合适的。考虑到系统资源问题可以用一种替代方法查表法来实现算法。只要给出一定温度范围内不同温度值对应热敏电阻的电阻值,然后建立表格,只要按照系统求出的阻值,进行查表,插值,就可以求出相应的温度值。这种算法相比前面的的公式法的算法复杂高,C语言程序代码也长,但在编译成机器码时,代码长度却很短,只有一、二百字节。7.5 数据存储器的分配 单片机内部数据存储器RAM只有几百字节,如果扩展外部存储器RAM来提高数据存储量话必将会增加了硬件成本,使系统更加的复杂,访问外部存储器比访问内部存储器所需的代码也要长得多。有效地使用片内存储器、提高存储器空间的利用率对开发者来说十分关键。 内部处理器、内部堆栈、压缩栈、所有程序变量和所有包含进来的库函数都将使用数量有限的内部数据存储器RAM。因为C语言采用了存储器的覆盖技术2,可以在程序进行连接时,它将那些已经被其它程序段释放了的存储器空间重新定义给另一个程序段的变量使用,当这个程序运行结束时再将这些存储器释放以供其它程序段使用。全局变量的作用范围是整个程序,因此不能被释放;静态变量由于在函数的调用中专用不变,也不能被释放;只有局部变量中的动态变量可以被释放。 因此在进行程序设计时应该尽量的使用局部变量,提高内部数据存储器的使用率。在C语言中程序中间结果及参数传传递是通过内部的寄存器来完成的,要是内部的存储器不够,将会给你的程序带来许多莫名其妙的错误。例如在进行程序设计时语句不应该太长,一个长语句可以分成多个语句,这样的话可以大的减少中间变量,当然太长时就会造成临时寄存器的不够用,导致计算出错。7.6 单片机C语言与汇编语言的混合编程 在绝大多数场合采用C语言编程即可完成预期的目的,但是对实时时钟系统、要求执行效率高的的系统就不适合采用C语言编程,对这些特殊情况进行编程时要结合汇编语言。汇编语言具有直接和硬件打道、执行代码的效率高等特点,可以做到C语言所不能做到的一些事情,例如对时钟要求很严格时,使用汇编语言成了唯一的选择。这种混合编程2的方法将C语言和汇编语言的优点结合起来,已经成为目前单片机开发最流行的编程方法。 目前大多数据单片机系统,在C语言中使用汇编语言有两种情况:一种是汇编程序部分和C程序部分为不同的模块,或不同的文件,通常由C程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C语言程序中嵌入一段汇编语言程序。 当汇编程序和C程序为不同模块时程序一般可分为若于个C程序模块和汇编程序模块,C程序模块通常是程序的主体框架,而汇编程序模块通常由用C语言实现效率不高的函数组成,也可以是已经成熟的、没有必要再转化成C语言的汇编子程序。在这种混合编程技术中,关键是参数的传递和函数的返回值。它们必须有完整的约定,否则数据的交换就可能出错。 对于嵌入式汇编,可以在C程序中使用一些关键字嵌入下些汇编程序,这种方法主要用于实现数学运算或中断处理,以便生成精练的代码,减少运行时间。当汇编函数不大,且内部没有复杂的跳转时,可以用嵌入式汇编实现。 AT89S52单片机内置模拟比较器,13脚即P1.1是比较器的负输入端,12脚即P1.0是比较器的正输入端,比较器的输出端做在了CPU内部即P3.6未被引出,CPU可以直接读取P3.6状态来判定两输入端比较的结果其和一个外部电阻及一个外部电容器就可以设计成一个A/D转换器,采用RC模拟转换的原理,来检测外部P1.1引脚的输入电压。由于系统对时钟要求很严格,因此就采用了C语言和汇编语言混合编程技术,程序调用形式如下: 汇编子程序: PUBLIC _AD ;入口地址 con SEGMENT CODE ;程序段 RSEG con _AD: SETB P3.7 ;充电 Loop: JB P3.6,AD_END ;开始计数匹配 INC A CJNE A,#100,Loop AD_END: CLR P3.7; 放电 CJNE A,#100,Ret_Val ;看结果是否有溢出,有溢出说明结果不对 SJMP Con_OV;返回值 Ret_Val:DEC A MOV R7, A; A/D转换的结果保存在R7中,传递给主程序 Con_OV: RET END单片机C程序:includeunsigned char AD(unsigned char);/在C程序中声明汇编模数转换子程序void timer0(void) interrupt 1 using 1 unsigned char x; x=AD(); /在C程序中调用汇编程序 Main /主程序 在以上程序中,函数的返回值为一无符号字符型数,根据调用规则,返回值在R7中,这样才可保证数据的传递不出错。另外,在调用过程中,必须注意寄存器的入栈。这样在以后用到A/D转换时,在C语言中调用汇编语言子程序AD()即可。7.7 程序分析选择 C语言具有很强的功能性和结构性,可以缩短单片机控制系统的开发周期,而且易于调试和维护,已经成为目前单片机语言中最流行的编程语言。所以本设计选取C语言作为编辑语言。8程序设计#include #define uint unsigned int #define uchar unsigned charuchar_ceng=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;uchar table_erwei=0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF;uchar LED_A=0x00, 0x7E, 0x88, 0x88, 0x88, 0x88, 0x7E, 0x00;uchar LED_B=0x00, 0x6C, 0x92, 0x92, 0x92, 0x92, 0xFE, 0x00;uchar LED_C=0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x7C, 0x00;uchar LED_D=0x00, 0x7C, 0x82, 0x82, 0x82, 0x82, 0xFE, 0x00;void delay(uint z);void erwei();void ceng();void juxing();void LEDA();void LEDB();void LEDC();void LEDD();void main() while(1) ceng();delay(200);erwei();delay(200);LEDA();delay(200); void delay(uint z) uchar x,y; for(x=0;xz;x+) for(y=0;y121;y+); void erwei() uint a; P2=0xFF;P0=0xFF; for(a=0;a0;a-) P1=table_erweia;delay(200);delay(200); void ceng() uint i; P2=0xFF;P0=0xFF; for(i=0;i0;i-) P1=uchar_cengi; delay(200); delay(200); delay(200); void LEDA() uint b; P1=0XFF; P2=0XFF;for(b=0;b8;b+) P0=LED_Ab; delay(200); 9 设计结果分析 本次光立方的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论