您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页基于单片机的LED广告牌的设计

基于单片机的LED广告牌的设计

来源:爱够旅游网


基于单片机的LED广告牌的设计

学生毕业设计(论文)报告

系 别: 电子与电气工程学院 专 业: 应用电子技术 班 号: 102 学 生 姓 名: 学 生 学 号: 1006043215 设计(论文)题目:基于单片机的LED广告牌的设计 指 导 教 师: 设 计 地 点: 常州信息职业技术学院

起 迄 日 期: 2020.11.20-2020.6.30

毕业设计(论文)任务书

专业 应用电子技术 班级 应电102 姓名

实践单位名称: 江苏国光信息股份 实践岗位名称: 驻外修理工程师 岗位职责:所处的岗位属于售后服务这一块,针对各大银行,医院等各大机构使用的金融设

备修理和保养,工作地点多在各银行网点,时刻观念要求较强。 岗位能力要求: 对运算机网络,运算机应用方面的能力要求较高,其次是实际动手能力,包括机械的拆装,部件的更换及修复,软件问题的排除与定位,终端的硬件故障修复等方面的能力 。

一、课题名称: 基于单片机的LED广告牌设计 二、要紧技术指标(或差不多要求): LED像素构成采纳纯绿管;模组辨论率16X64点;

可视角度:水平≧ 160度,上下 ≧ 120度;可视距离:4m-150m;功耗,平

均功耗450W/平米,最大功耗1000W/平米;点间距PICH=6mm。 三、要紧工作内容: 本温LED显示屏要紧包括单片机操纵模块,温度采集模块,LED显示模块,74HC595驱动模块,74L138译码驱动模块等5大部分。该LED显示屏系统的核心是单片机操纵模块,它采纳的是Atmel公司的AT89C51,该单片机能够依照温度传感器DS18B20所采集的温度数据进行温湿度的提示,从而达到提醒人们的目的。广告信息的显示是通过4 个16X16的LED组合点阵来实现的,用户能够依照自己的需求将相应的字摸代码写进程序,从而进行滚动显示,同时也能够依照需要滚动显示时刻。 四、要紧参考文献:[1]

郭建江.单片机技术与应用.东南大学出版社.

[2] 诸昌钤 编著 :《LED 显示屏系统原理及工程技术》.成都:电子科技大学出版社 [3] 张志良 主编 :《单片机原理及操纵技术》.北京:机械工业出版社,2005. [4] 李光飞 编著 :《单片机课程设计实例指导》.北京:北京航空航天出版社, [5] 吉 雷 主编 :《Proteus 从入门到熟知》. 西安:西安电子科技大学出版

学 生(签名) 年 月 日

指 导 教师(签名) 年 月 日 教研室主任(签名) 年 月 日

社,2004.

系 主 任(签名) 年 月 日

毕业设计(论文)开题报告

设计(论文)题目 基于单片机的LED点阵显示屏系统设计 一、选题的背景和意义:选题的背景和意义: 随着科学技术的不断进展, 各种商业形式的显现, 在20世纪80年代全球迅速进展起来的一种新型显示媒体—LED显示屏,迅速成长为平板显示的主流产品之一。在广告牌、公共显示屏等信息显示领域得到了广泛的应用。LED 显示屏具有抗震耐冲击、光响应速度快、节能、发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内室外环境适应能力强等优点。亮度高、工作电压低、功耗小、小型化、易与集成电路匹配、驱动简单、寿命长、耐冲击、性能稳固等这些优点为LED的进展前景提供了极大的便利,目前正朝着更高亮度、更高耐气候性、更高的发光密度、更高的发光平均性,可靠性、全色化方向进展。使得我们的设计研究专门的具有意义。 二、课题研究的要紧内容: 1提出符合设计要求的LED显示和操纵系统方案,并阐述了其工作原理。 2完成各模块电路的设计包括单片机操纵模块、温度采集模块、LED显示模块、数字时钟模块。 3软件部分设计包括LED 显示程序、按键处理程序、温度采集DS18B20读写程序、数字时钟显示程序。 4 运用PROTEUS软件进行仿真。 三、要紧研究(设计)方法论述: 1、确定单片机的类型,采纳STC89C51单片机,晶振频率选择12MHz。 2、选择的芯片,74HC595、74HC138、纯绿色8X8LED点阵、DS18B20温度传感器等原件。 3、确定开发环境为Keil Uvision2和Proteus软件。 4、复习单片机的有关知识,并进行LED点阵使用方案的讨论: 16X64的点阵共有1024个发光二极管,假如采纳锁存器来操纵端口以8位的锁存器来算就要有128个锁存器,如此的处理方式是高成本的处理方式不适合实际使用,因此就要有一种动态扫描的方式来客服成本高的缺点。所谓动态扫苗的意思确实是逐行轮番点亮,如此的话我们就能够实现16行的同名列公用一套驱动器。这种扫描方式每一行有一个行驱动器,各行的同名列公用一个列驱动器。显示数据放在单片机的储备器中,按8位一个字节的形式排放。因此这种储备方式存在列数太多不能使用并列输入的方式的问题,因此那个地点我借用了并列输出芯片74HC595。采纳串行传输的方法,能够采纳只用一根信号线将列数据一位一位传往列驱动器,然而列数据预备时刻可能相当长,可能会阻碍到LED的亮度,因此在这篇论文中我采纳了重叠处理方法,即在显示本行各列数据的同时传送下一列数据,因此为了达到重叠处理的目的,列数据的显示需要有锁存功能。 四、设计(论文)进度安排: 时刻(迄止日期) 2020.11.20~2020.11.25 工 作 内 容 数据检索,收集国内外最新的相关资料;认真学习相关的知识,确定差不多思路 2020.11.26~2020.12.20 查阅相关资料,积存知识,分析该研究的实际意义,方案论证,总体设计,撰写开题报告; 2020.1.1~2020.3.20 2020.3.26~2020.4.1 2020.4.5~2020.4.20 2020.4.21~2020.5.20 2020.5.25~2020.6 五、指导教师意见: 指导教师签名: 年 月 日 六、系部意见: 系主任签名: 年 月 日 参考收集好的资料撰写论文的具体内容,并形成初稿 提交论文初稿,交由老师批阅批正。 依照老师提出的意见修改论文,修改后再进行批示。 进行论文的最后定稿,并预备好答辩的相关工作。 预备答辩 单片机操纵LED点阵显示屏系统

名目

摘要 Abstract

第1章 前言…………………………………………………………..…………. 1 第2章 LED与51单片机介绍…………………………………..……………. 2 2.1 LED及LED点阵介绍………………………….…………….…………. 2 2.1.1 显示原理……………..………………………….…………….…....... 2 2.2 微操纵器51单片机介绍…………………………….……..……………. 3 第3章 功能要求及方案论证…………………………………………..………...4 3.1 功能要求…………………………………………………………..……….. 4 3.2 显示模块论证..…………………………….……………………..………. ..4 3.3 数据传输方案论证..……………….……………………………..………. ..4 3.3.1点阵显示屏总体框图…………………………………………………...5 第4章 LED点阵显示屏系统软硬件设计…….………………..…………….. 6 4.1 单片机系统及外围电路…………..…………………………………….. ..6 4.2 硬件驱动电路设计…………………………………………………...…. ..7 4.2.1 列驱动.…………………………………………………………...…. ..7 4.2.2 行驱动.…………………………………………………………...…. ..9 4.2.3 DS18B20的使用………………………………………………...…. 10 4.3 点阵显示屏硬件原理图……………………………………………...…. 12 4.4 软件的设计思路………………………………………………………… 13 4.4.1 系统软件设计框图…………………………………………………. 13 4.4.2 显示驱动程序………………………………………………………. 13 第5章 系统的调试与仿真……………………………………………………. 15 第6章 终止语及展望…………………………………………………………. 19 参考文献 答谢辞 附录

摘 要

LED点阵显示屏是一种由多个独立的LED发光二极管封装而成的. 新兴的显示器件。LED 点阵电子显示屏能够显示数字或符号, 通常用来显示时刻、速度、系统状态等。

本设计是4个16×16点阵LED电子显示屏的设计。整个设计介绍了以美国ATMEL公司生产的40脚单片机AT89C51为核心的操纵系统的LED点阵电子显示屏的动态设计和开发过程。通过该芯片操纵八个列驱动器74HC595和两个行驱动器74HC138来驱动显示屏显示。所设计的电子显示屏能够显示各种文字或单色图像,全屏能显示数个汉字,采纳的是16块8 x 8点阵LED显示模块来组成4个16x16点阵显示模式。显示采纳动态显示,使得图形或文字能够实现静止、移入移出等多种显示方式。

文中详细介绍了LED点阵显示的硬件设计思路、硬件电路各个部分的功能及原理、相应软件的程序设计,以及使用说明等。

关键词 :AT89C51单片机 LED 点阵显示 动态显示

Abstract

As a popular display device component, LED dot-matrix display board consists of several independent LED (Light Emitting Diode). The LED dot-matrix display board can display the number or sign, and it is usually used to show time, speed, the state of system etc.

This design is 4 16 ×16 lattice LED electron display monitor design.The whole equipment is with the 40-pin AT89C51 MCU (Micro Controller Unit) produced by the American ATMEL company at the core, introduced take it as the control system LED lattice electron display monitor dynamic design and the development process. Controls good driver 74HC154 andeight row driver 74HC595 through this chip actuates the display monitor demonstration. The electronic screen can show all kinds of written or monochrome images, one full screen display Chinese characters,sixteen pieces of 8 x 8 dot-matrix LED display modules to form the 16x16 dot matrix display mode. Show dynamic show that makes static graphic or text can be achieved, shifted out of various formats.

This paper describes the hardware design of the LED dot matrix display, and the principle function of the various parts of the circuit, the corresponding software program design and the use of some such.

Keywords: AT89C51 Micro Controller Unit;LED;Lattice Display;Dynamic

Display

第1章 前言

LED显示屏(LED display LED Screen):又叫电子显示屏或者飘字屏幕。他是由LED点阵和LED PC 面板组成,通过红色,蓝色,绿色LED灯的亮灭来显示文字、图片、动画、视频,内容能够随时更换,各部分组件差不多上模块化结构的显示器件。传统LED显示屏通常由显示模块、操纵系统及电源系统组成。显示模块由LED灯组成的点阵构成,负责发光显示;操纵系统通过操纵相应区域的亮灭,能够让屏幕显示文字、图片、视频等内容,单色、双色屏要紧用来播放文字的,全彩屏要紧是播放动画的;电源系统负责将输入电压电流转为显示屏需要的电压电流。

LED的迅速进展,是与它本身亮度高、工作电压低、功耗小、大型化、寿命长、耐冲击和性能稳固的优点分不开的。LED的进展前景极为宽敞,目前正朝着更高亮度、更高耐气候性、更高的发光密度、更高的发光平均性,可靠性、全色化方向进展。本论文LED广告牌的设计,以显示文字和数字为主。

第2章 LED与51单片机介绍

随着LED显示屏在广告传媒领域逐步崭露头角,其操纵系统也如雨后春笋,层出不穷。由于它的操纵系统均是基于嵌入式微处理器开发,因此单片机在其中也占有一席之地。本论文提出基于一般51系列单片机实现LED显示屏操纵的原理及方法。

2.1 LED及LED点阵显示

LED (Light Emitting Diode),发光二极管,是一种能够将电能转化为可见光的固态的半导体器件。LED 的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极。当电流通过导线作用于那个晶片的时候,电子就会被推向其PN 结的P 区,在P 区里电子跟空穴复合,然后就会以光子的形式发出能量,从使 LED 发光。

LED 显示屏( LED panel )是由半导体发光二极管构成的点阵模块组成的显示屏幕,通过操纵半导体发光二极管的亮灭显示文字、图形、图像、动画、视频、录像信号等各种信息。LED 显示屏具有抗震耐冲击、光响应速度快、节能、发光效率高、使用寿命长、组态灵活、色彩丰富以及对室内室外环境适应能力强等优点。

LED亮度高、工作电压低、功耗小、小型化、寿命长、耐冲击和性能稳固,因此受到广泛重视而得到迅速进展,前景极为宽敞。随着LED显示屏在广告传媒领域逐步崭露头角,其操纵系统也如雨后春笋,层出不穷。归根结底,LED显示屏操纵卡的设计中硬件是一方面因素,同时还要考虑到显示数据组织方式,通过软硬件结合的方法才能设计出一款性价比较高的操纵卡。本论文提出基于一般51系列单片机实现LED显示屏操纵的原理及方法。 2.1.1 显示原理

人眼的亮度感受可不能因光源的消逝而赶忙消逝,要有一个延迟时刻,这确实是视觉的惰性。视觉惰性能够明白得为光线对人眼视觉的作用、传输、处理等过程都需要时刻,因而使视觉具有一定的低通性。实验说明,当外界光源突然消逝时,人眼的亮度感受是按指数规律逐步减小的。如此当一个光源反复通断,在通断频率较低时,人眼能够发觉亮度的变化;而通断频率增高时,视觉就逐步不能发觉相应的亮度变化了。不致于引起闪耀感受的最低反复通断频率称为临界闪耀频率。

通过实验证明临界闪耀频率大约为24Hz。因此采纳每秒24幅画面的电影,在人看起来确实是连续活动的图象了。同样的原理,日光灯每秒通断50次,而人看起来却是一直亮的。由于视觉具有惰性,人们在观看高于临界闪耀频率的反复通断的光线时,所得到的主观亮度感受实际上是客观亮度的平均值。

视觉惰性能够说是LED显示屏得以广泛应用的生理基础。第一,在LED显示屏中能够利用视觉惰性,改善驱动电路的设计,形成了目前广为采纳的扫描驱动方式。扫描驱动方式的优点在于LED显示屏不必对每个发光灯提供单独的驱动电路,而是若干个发光灯为一组共用一个驱动电路,通过扫描的方法,使各组发光灯依次点燃,只要扫描频率高于临界闪耀频率,人眼看起来各组灯都在发光。

2.2 微操纵器51单片机介绍

单片机产生于20世纪70年代末,经历了SCM、MCU、SOC三大时期。

SCM即单片微型运算机(Single Chip Microcomputer)时期,要紧是寻求最佳的单片形状嵌入式系统的最佳体系结构。

MCU即微操纵器(Micro Controller Unit)时期,要紧的技术进展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化操纵能力。。

单片机是嵌入式系统的独立进展之路,向MCU时期进展的重要因素,确实是寻求应用系统在芯片上的最大化解决;因此,专用单片机的进展自然形成了SOC化趋势。

2.2.1 MCS-51系列单片机及其特点

①可靠性高:

按工业测控环境要求设计的芯片,抗干扰的能力优于PC机。系统软件固化在ROM中,不易受病毒破坏。芯片呢诶集成许多的信号通道,因此能够在系统稳固可靠的运行。

②便于扩展:

片内具有必需的运算机正常运行所部件,片外提供(总线,并行和串行的输入/输出)管脚,方便扩展,同时也方便多模块组合成一个系统。 ③操纵功能强:

条件分支转移指令,I/O口的逻辑操作指令,位处理指令。 ④有用性好:

体积小,功耗低,价格廉价,易于产品化

第3章 功能要求及方案论证

LED点阵显示屏操纵系统是由51微操纵器充当核心部分的。本操纵系统要实现LED操纵屏显示文字左移,时刻显示,温度显示等相关功能,适合初学者学习与研究,LED点阵显示屏的操纵逻辑思路具有延展性,依照需要可扩展更多的显示模块组,本论文以16X64点阵模块组为例。

3.1 功能要求

本方案设计一个16X64点阵电子显示屏,要满足以下条件 1.采纳51单片机作为微操纵器;

2.通过4个16x16的点阵LED进行文字显示,可调数字时钟显示,温度信息显示; 3. LED显示屏清晰无串扰; 4.文字显示具有滚动显示方式。

3.2显示模块方案论证

1.静态显示方式

所谓静态显示方式确实是8段LED数码管在显示某一个数码时,加在数码管上的段码一直保持不变,直至换成显示其他数码为止。如此数码管的每一段均应由一条输出线来操纵,则每显示一位数码需要8根输出线,那么要显示N位则需N×8根输出操纵线。如此就会占用较多I/O资源。

2.动态显示方式

针对静态显示方式的缺点,我们能够用动态显示的方式来克服。为了解决静态显示方式将会占用较多I/O资源的缺陷,在多位显示时通常采纳的是动态显示的方式。

我们将所有数码管的段码线对应并联在一起,然后再用一个8位的输出口来操纵,每一位数码管的公共端分别出一位I/O线进行操纵,这确实是动态显示。在显示不同数码时,由位线操纵各位轮番显示。位线操纵某位选通时,该位应显示数码的段码同时加在段码线上,即每一时刻仅仅有一位数码管是被点亮的,当轮番显示的速度较快(每秒24次以上),由于人眼的视觉暂留现象,看起来就像所有位同时显示一样,这时,我们就能看到稳固的图像了。

基于单片机的特性,我们将采纳动态显示方式的方案。采纳动态显示的方式进行显示时,每一行都有一个行驱动器,同时各行的同名列共用一个驱动器。数据从操纵电路到列驱动器的传输方式能够采纳并列方式或串行按8位一个字节的形式顺序排放储存在单片机的储备器之中。在显示的时候要把一行中的各列数据都传送到相对应的列驱动器上去,这就存在一个显示数据如何传输的问题。

3.3数据传输模块方案论证

明显,假如我们采纳并行的方式,因为从操纵电路到列驱动器的线路数量大,相应的硬件数目多,当列数专门多的时候,并列传输的方案就不是专门好,实现

起来也不如串行传输的方法。

假如我们采纳串行传输的方法,则操纵电路能够只用一根信号线,让列数据一位一位的向列驱动器传输。如此的方式在硬件方面无疑是十分经济的。然而,我们也能够看到如此的方式也存在不足。那确实是整个串行传输的过程较长,数据是按顺序一位一位的输出给列驱动器的,只有当一行的各列数据都差不多传输到位过后,这一行的各列才能并行地显示。如此,关于每一行的显示过程我们就能够将其分解成列数据传输和列数据显示如此两个部分。由于串行传输方式的列数据预备时刻可能相当长,在行扫描周期一定的情形下留给行显示的时刻就可能比较少了,这会阻碍到LED的亮度。

我们能够采纳重叠处理的方法来解决串行传输中的列数据预备与列数据显示时刻的矛盾问题。重叠处理的方法,即在显示一行各列数据的同时,传送下一列数据。

为了达到如此的目的,列数据的显示就需要具有锁存功能。通过上述分析,就能够归纳出列驱动器电路应具有的功能。列数据预备应当能实现串入并处的移位功能,而列数据显示则应当具有并行锁存的功能。如此,本行将已预备好的数据输入并行锁存器进行显示的时候,串并移位寄存器就进行预备下一行的列数据的动作,而可不能阻碍本行的显示。 3.3.1 点阵显示屏总体图 单 片 机 操 纵 器 列驱动器 列驱动器 列驱动器 列驱动器 行驱动器 16X16LED点阵 16X16LED点阵 16X16LED点阵 16X16LED点阵 图3.3.1 点阵显示屏总体框图

第4章 LED点阵显示屏系统软硬件设计

点阵电子显示屏的硬件电路大致上能够分成列驱动电路,行驱动电路以及单片机系统及外围电路三部分。点阵的显示屏软件的要紧功能是在向屏体提供显示数据的同时产生一系列操纵信号,使屏幕按我们的要求显示。

我们依照软件分层次设计的原理能够把显示屏的软件系统分为两部分:第一部分是底层的显示驱动程序,第二部分是上层的系统主程序。其中显示驱动程序负责向屏体送显示数据,同时产生行扫描信号和其他操纵信号来完成配合LED显示屏的扫描显示工作。

定时器T0的中断程序来实现显示驱动程序。主程序来实现系统应用程序,完成系统初始化以及显示成效处理等工作。

4.1 单片机系统及外围电路

点阵电子显示屏的硬件电路大致上能够分成列驱动电路,行驱动电路以及单片机系统及外围电路三部分。单片机采纳51芯片或其兼容系列芯片。单片机的串口与列驱动器相连,用来显示数据。P1口低4位与行驱动器相连,送出行选信号;P3.0,P3.1,P3.2,P1.7口则用来发送操纵信号。P0口空着,在有必要的时候能够扩展系统的ROM和RAM。

图4.1 51单片机最小系统

80C51单片机管脚说明如下: VCC:供电电压。 GND:接地。

P0口:P0口的输出驱动电路由上拉场效应管和驱动场效应管组成,操纵电路包括一个与非门,一个非门和多路开关MUX。P0口既能够作为通用的I/O口进行数据的输入输出,也能够作为单片机系统的地址/数据线使用,为此在P0口的电路中有一个多路转换器MUX。在操纵信号的作用下,多路转换器能够分别接通锁存器输出或地址/数据线输出。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口能驱动4个LSTTL负载。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平常,将输出电流,这是由于内部上拉的缘故。P1口作为一样的I/O口使用时记做P1.7~P1.0。

P2口:P2口既能够作为通用的I/O口使用,也能够作为地址总线使用,因此他的位结构比P1口多了一个多路操纵开关MUX。当P2口作为通用I/O口使用时,多路开关MUX倒向锁存器的输出端Q,构成一个准双向口,其功能与P1口相同,有输出,读引脚和读锁存器3种工作方式。

P3口:P3口为多功能口。当第二功能输出端保持1的时候,与非门3对锁存器Q端是畅通的,这时P3口完全实现第一功能,即作为通用的I/O口使用,而且是一个准双向I/O口,其功能与P1口是完全相同的。

RST:这时复位输入。当振荡器复位器件时,需要保持RST脚两个机器周期的高电平的时刻。

ALE/PROG:当访问外部储备器时,地址锁存承诺的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平常,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出脉冲或用于定时的目的。

然而要注意的是:每当用作外部数据储备器时,将跃过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。现在,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。假如微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序储备器的选通信号。在由外部程序储备器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据储备器时,这两次有效的/PSEN信号将不显现。

/EA/VPP:当/EA保持低电平常,则在此期间外部程序储备器(0000H-FFFFH),不管是否有内部程序储备器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平常,此间内部程序储备器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。

4.2 硬件驱动电路设计

硬件驱动电路设计要紧是有两个芯片组成:74HC595列驱动,74L138行驱动。下面我们就对列驱动器74HC595及行驱动器74HC138的功能及使用方法做简单的介绍。

4.2.1 列驱动器74HC595

列驱动器电路由集成电路74HC595构成,它具有一个8位传入并出的移位寄存器和一个8位锁存器结构,而且移位寄存器和输出锁存器的操纵是各自独立的,

能够实现在显示本行列数据的同时传送下一行的列数据,即能够达到重叠处理的目的。74HC595的外形及内部结构如图4.2所示。

图4.2 74HC595结构图

作为硅结构的CMOS器件,74HC595兼容低电压TTL电路,。74HC595是具有8位移位寄存器和1个储备器,三态输出功能的器件。移位寄存器和储备器是分别的时钟。数据在SHCP的上升沿输入到移位寄存器中,在STCP的上升沿输入到储备寄存器中去。将两个时钟连在一起,则储备寄存器总是比移位寄存器晚一个脉冲。移位寄存器有一个串行移位输入(DS)和一个串行输出(Q7’)以及一个异步的低电平复位。储备寄存器有一个并行8位的,具备三态的线输出,当使能为OE时(即为低电平),储备寄存器的数据传输到总线。 输入 SHCP X X X ↑ X ↑ 输出 STCP OE MR DQ7’ QN S X ↑ X X ↑ ↑ L L H L L L ↓ X L L L H H H X L X L H Q6 X NC NC L Z NC 功能 MR为低电平常仅仅阻碍移位寄存器 空移位寄存器到输出寄存器 清空移位寄存器,并行输出为高阻态 逻辑高电平移入移位寄存器状态0,包含所有的移位寄存器状态移入 移位寄存器的内容到达保持寄存器并从QN’ 并口输出 X Q6’ 移位寄存器内容移入,先前的移位寄存器QN’ 的内容到达保持寄存器输出 表4.1 74HC595功能表

74HC595进行8片级连,可共用一个移位时钟SHCP及数据锁存信号STCP。如此,当第一行需要显示的数据通过8x8=64个SHCP时钟后便可将其全部移入

74HC595 中,同时还将产生一个数据锁存信号STCP,将数据锁存在74HC595 中,同时在使能信号的作用下,使串入数据并行传输输出,从而使与各输出位对应的场驱动管处于放大状态或截止状态;同时由行扫描操纵电路产生信号使第一行扫描管导通,相当于第一行 LED 的正端都接高,明显,第一行 LED 是否点亮就取

决于74HC595 的锁存信号。表4.2 74HC595引脚说明表

符号 Q0~Q7 GND Q7’ MR SHCP STCP OE DS VCC 引脚 1~7,15 8 9 10 11 12 13 14 16 4.2 74HC595引脚说明

描述 并行数据输出 地 串行数据输出 主复位(低电平) 移位寄存时钟输入 储备寄存时钟输入 输出有效(低电平) 串行数据输入 电源 此外,在第一行 LED 管点亮的同时,再在74HC595 中移入第二行需要显示的数据,随后将其锁存,同时由行扫描操纵电路将第一行扫描管关闭而接通第二行,使第二行LED 管点亮,以此类推,当第十六行扫描过后再回到第一行,如此只要达到一定的扫描速度就可形成一幅完整的文字或图像。 4.2.2 行驱动器74HC138

本电路中我们加入了两个3-8线译码器74HC138,其输入是一个16进制码。 74HC138结构如图4.3所示,引脚说明表如表4.3。

图4.3 74HC138结构图

符号 引脚 9~15 8 4、5 1~3 16 描述 输出端 GND电源地 使能输出端 地址输出端 VCC电源正 Y0~Y6 GND G1~G2 A、B、C Vcc

表4.3 74HC138 引脚说明表 输入 E3 X X L H H H H H H H H /E2 /E1 X X X L L L L L L L L X H X L L L L L L L L A2 X X X L L L L H H H H A1 X X X L H L H L L H H A0 X X X L H L H L H L H H H H L H H H H H H H H H H H L H H H H H H H H H H H L H H H H H 输出 /Y0 /Y1 /Y2 /Y3 /Y4 /Y5 /Y6 /Y7 H H H H H H L H H H H H H H H H H H L H H H H H H H H H H H L H H H H H H H H H H H L H H H H H H H H H H H L 表4.4 74HC138 功能说明表

4.3.3 DS18B20知识简介

DS18B20 一样差不多上充当从机的角色,而单片机确实是主机。单片机通过一线总线访问DS18B20 的话,需要通过以下几个步骤: 1.DS18B20 复位。 2.执行ROM 指令。

3.执行DS18B20 功能指令(RAM 指令)。

一样上我们差不多上使用单点,也确实是说单线总线上仅有一个DS18B20 存在而已。因此我们无需刻意读取ROM 里边的序列号来,然后匹配那个DS18B20?而是更

直截了当的,跃过ROM 指令,然后直截了当执行DS18B20 功能指令。

DS18B20 复位,在某种意义上确实是一次访问DS18B20 的开始,或者可说成是开始信号。ROM 指令,也确实是访问,搜索,匹配,DS18B20 个别的64 位序列号的动作。在单点情形下,能够直截了当跃过ROM 指令。而跃过ROM 指令的字节是0xCC。 DS18B20 功能指令有专门多种,数据手册里有更详细的介绍。那个地点仅列出比较常用的几个DS18B20 功能指令。

0x44:开始转换温度。转换好的温度会储存到暂存器字节0 和1。

0xEE:读暂存指令。读暂存指令,会从暂存器0 到9,一个一个字节读取,假如要停止的话,必须写下DS18B20 复位。 DSl8B20内部结构及工作原理

表4.5 DS18b20内部结构表

Ⅴ DS18B20 DQ 寄生电源电路 内部电源Ⅴ 操纵逻辑 GND 温度传感器 64位ROM和单线接口 高速暂报警上限寄存器 电源存储备 器 传感配置寄存器 Ⅴ 模块 报警下限寄存器 8位CRC发生器 单片机的复位时序如下:

1.单片机拉低总线480us~950us, 然后开释总线(拉高电平)。 2.这时DS18B20 会拉低信号,大约60~240us 表示应答。

3.DS18B20 拉低电平的60~240us 之间,单片机读取总线的电平。

ROM指令表

指令 约定代码 33H 读ROM 符合ROM 55H 功能 读DS18B20温度传感器ROM中的编码(即64位地址) 发出此命令后,接着发出64位ROM编码,访问单总线上与改编码相对应的DS18b20使之作出响应为下步对该DS18B20的读写做预备 用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址。为操作器件做好预备。 忽略64位ROM地址,直截了当向DS18B20发温度转换命令,使用于单片工作 执行后只有温度超过设定值上限或下限的片子作出响应 搜索ROM 0F0H 跃过ROM 0CCH 告警搜索命令 0ECH

4.5 ROM指令表

RAM指令表

指令 约定代码 温度变换 44H 读暂存器 0BEH 写暂存器 4EH 复制暂存48H 器 重调EEP0B8H ROM 读供电方0B4H 式 功能 启动DS18B20进行温度转换,12位转换时最长为750ms(9位为93.75ms).结果存入内部9字节中的第0、1字节RAM中 读内部RAM中9个字节的内容 发出向内部RAM的3(TH)、4(TL)字节写上下限温度数据命令,紧跟该命令后,是传送两字节的数据。 将RAM中第3、4字节的内容复制到EEPROM中 将EEPROM中内容复原到RAM中第3、4字节 读DS18B20的供电方式,寄生供电时DS18B20发送“0”,外接电源供电DS18B20发送‘1’。 4.6 RAM指令表

4.3 点阵显示屏的硬件原理图

系统的整体设计系统由单片机最小系统,74HC595、74HC138、DS18B20芯片组成,其中74HC595芯片采纳8级片连的方式实现了数据的重叠处理,74HC138作为行选芯片实现了整个显示屏系统的功能实现,如下图5.1确实是LED点阵显示屏的硬件结构原理图。

图5.1点阵显示屏硬件仿真图

4.4软件的设计思路

点阵的显示屏软件的要紧功能是在向屏体提供显示数据的同时产生一系列操纵信号,使屏幕按我们的要求显示。

我们依照软件分层次设计的原理能够把显示屏的软件系统分为两部分:第一部分是底层的显示驱动程序,第二部分是上层的系统主程序。其中显示驱动程序负责向屏体送显示数据,同时产生行扫描信号和其他操纵信号来完成配合LED显示屏的扫描显示工作。定时器T0的中断程序来实现显示驱动程序。主程序来实现系统应用程序,完成系统初始化以及显示成效处理等工作。 4.4.1 显示驱动程序

显示驱动程序第一对端口进行定义,然后按照取字模,进行延时,再对定时器进行模式选择和赋初值,再移位寄存,定时中断如此一个流程进行。

图4.1为显示驱动程序流程图。

定义端口 取字模 移位寄存器驱动器 定时器中断 图4.1显示驱动程序流程图

显示驱动程序见附录一。

系统软件能使系统在目测条件下 LED 显示屏各点亮度充足同时可显示图形和文字。图形或文字显示有滚动显示方式。

系统主程序开始,第一是启动定时器;然后通过读取行号并加1;接着送出新的行显示数据,然后以切换显示数据;送新行号并打开显示;最后退出。

4.4. 2 系统主程序

系统软件能使系统在目测条件下 LED 显示屏各点亮度充足同时可显示图形和文字。图形或文字显示有滚动显示方式。

系统主程序开始,第一是启动定时器;然后通过读取行号并加1;接着送出新的行显示数据,然后以切换显示数据;送新行号并打开显示;最后退出。

图4.2是系统主程序流程图。

开始 启动定时器 读取行号并加一 送新行显示数据 切换送新行号并开显示数据 退出 显示数据 图4.2系统主程序流程。

第5章 系统的调试与仿真

本系统的调试与仿真都在Proteus和Keil软件中运行,有相应的截图与程序文档。如下图是系统调试与仿确实成果展现。

图5.1 文字的滚动显示

图5.2 文字的滚动显示

图5.3 时刻的显示

5.4 时刻修改按键

时刻的修改时通过按下INTOSET进入时刻调整画面,INC单击一次加一,DEC单击一次加一,按下SELECT键选择要修改的项目。修改后时刻如下图5.5

5.5 修改后的时刻截图

温度显示截图如下:

5.6 温度显示截图

DS18B20温度设定值1

DS18B20温度设定值2

5.7 温度值修改后截图

5.8 整体显示文字截图

5.9 整体显示时刻截图

5.10 整体显示温度截图

第6章 终止语

本文设计的点阵电子显示屏,能够在肉眼目测条件下LED 显示屏各点亮度充足,可显示图形和文字。图形或文字显示具有滚动显示方式。

该点阵电子显示屏的系统具有硬件少,结构简单,容易达到要求,性能稳固可靠和成本低等特点。

在本次点阵电子显示屏的设计中取得以下工作成果:

1查阅了大量的电子资料,详细地了解了LED 的发光原理和LED 显示屏的原理,清晰地了解了LED 显示屏与其它显示屏相比较有那些优点,了解了 LED的现状,明确了研究的方向和目标。

2本次设计的LED 显示屏能够实现在目测条件下 LED显示屏各点亮度平均充足,可显示图形和文字。图形或文字显示有滚动显示方式。

3论文给出了具体的系统硬件设计方案,硬件结构电路图,软件程序的流程图和具体汇编语言程序设计与仿真结果等方面的内容。

4在这次毕业设计的过程中再次学习了 proteus 这一软件,熟练的把握proteus 对电子专业的同学来说是专门重要的。

5通过这次毕业设计,重新复习并进一步学习了MCS-51单片机。 6熟练把握了WORD软件的使用。

参考文献

[1] 郭建江.单片机技术与应用.东南大学出版社.

[2] 诸昌钤 编著 :《LED 显示屏系统原理及工程技术》.成都:电子科技大学出版社

[3] 张志良 主编 :《单片机原理及操纵技术》.北京:机械工业出版社,2005 [4] 李光飞 编著 :《单片机课程设计实例指导》.北京:北京航空航天出版社, [5] 吴金戍,沈庆阳,郭庭吉编著.8051单片机实践与应用.北京:清华大学出版社.

[6] 吉 雷 主编 :《proteus 从入门到熟知》. 西安:西安电子科技大学出版 社,2004.

[7] 侯丽玲:基于AT89S52单片机的LED点阵显示屏操纵系统的设计[J],漳州 职业技术学院学 报,2008年第3 期

答谢辞

本课题在选题及研究过程当中得到宋艳老师,安新艳老师,谢伟军老师,陈霞老师的尽心指导,专门是宋艳老师多次询问研究课题的研究进程,并为我指点迷津,关心我开拓研究思路、谆谆教诲、热忱鼓舞。从论文开题到论文资料收集,再到论文框架构建,再到论文软硬件设计都得到了老师们、同学们、学长们的热情关心,在这论文立即完成之际我要向关心过我的老师们、同学们、学长们表示我最诚挚的谢意!

关于论文模板(2010年版)格式的补充说明

(1)论文的一级标题统一为居中对齐;

(2)论文的一级标题和二级标题统一设置成段前0.5行距,段后0.5行距; (3)关于参考文献标点,统一采纳英文标点符号;

(4)关于摘要和名目,可单独设置页码,用罗马数字1,2。 (5)论文的新章节另起新页 (6)页码统一采纳小5号字体、居中标注,起始于正文的第一章首页,终止于“答

谢词”所在章节的最后一页。

(7)其它未尽事宜,参照教务处颁发的“毕业设计(论文)工作规范(2009年6

月)”执行。

毕业设计(论文)成绩评定表

一、指导教师评分表(总分为70分)

序 号 1 2 3 4 5 6 7 考 核 项 目 工作态度与纪律 调研论证 外文翻译 设计(论文)报告文字质量 技术水平与实际能力 基础理论、专业知识与成果价值 思想与方法创新 合计 指导教师综合评语: 指导教师签名: 年 月 日 满 分 10 10 5 10 15 15 5 70 评 分 二、答辩小组评分表(总分为30分)

序 号 1 2 3 4 5 考 核 项 目 技术水平与实际能力 基础理论、专业知识与成果价值 设计思想与实验方法创新 设计(论文)报告内容的讲述 回答问题的正确性 合计 答辩小组评判意见(建议等第): 答辩小组组长教师签名: 年 月 日 满 分 5 5 5 5 10 30 评 分 三、系答辩委员会审定表

1. 审定意见 2.审定成绩(等第)_____ ___ 系主任签字: 年 月 日 附录:

/*************16X64点阵显示屏设计***********/ #include #include

#define uchar unsigned char #define uint unsigned int #define INC 0x0e #define DEC 0x0d #define SELECT 0x0b #define EXIT 0x07 sbit DQ=P2^7; //定义DQ为可位寻址的变量,同时值为P1^1 uchar yid,h; //YID为移动计数器,h为行段计数器 uint zimuo; // 字模计数器 uchar code hanzi[]; // 汉字字模

uchar idata FF[10],time_count=0; // 缓存 void in_data(void); // 调整数据 void rxd_data(void); // 发送数据 void sbuf_out(); // 16段扫描 uchar dat[21]=\"1006043215a\"; uchar idata time_buf[4]; uchar idata time_h=23,time_m=15,time_s=0; uchar count=0; uchar buf[8]; uchar dp[20]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9}; uchar idata temp_buf[4]; bdata uchar dat_show; sbit dat_show0=dat_show^0; sbit dat_show7=dat_show^7; uchar code table[]={

0x10,0x02,0x10,0x04,0xD0,0x7F,0x08,0x00,0x08,0x00,0x8C,0x3F,0x0C,0x00,0x0A,0x00,

0x89,0x3F,0x08,0x00,0x08,0x00,0x88,0x3F,0x88,0x20,0x88,0x20,0x88,0x3F,0x88,0x20,/*\"信\0x80,0x00,0x40,0x00,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,

0xF8,0x0F,0x08,0x08,0x80,0x00,0x10,0x21,0x12,0x49,0x12,0x48,0xE1,0x0F,0x00,0x00,/*\"息\0x44,0x10,0x88,0x10,0x88,0x08,0x00,0x04,0xFE,0x7F,0x02,0x40,0x01,0x20,0xF8,0x07,

0x00,0x02,0x80,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*\"学\0x00,0x02,0x1E,0x04,0xD2,0x7F,0x4A,0x40,0x2A,0x20,0x86,0x1F,0x0A,0x00,0x12,0x00,

0xD2,0x7F,0x12,0x09,0x16,0x09,0x0A,0x09,0x82,0x48,0x82,0x48,0x42,0x70,0x22,0x00,/*\"院\

0x80,0x00,0x80,0x00,0xFE,0x3F,0xC0,0x01,0xA0,0x02,0x90,0x04,0x8C,0x18,0x83,0x60,

0xF0,0x07,0x00,0x02,0x00,0x01,0xFF,0x7F,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00,/*\"李\

0x10,0x04,0x10,0x04,0xFF,0x7F,0x10,0x04,0x50,0x04,0x40,0x00,0xFE,0x0F,0x40,0x08,

0x40,0x28,0x44,0x48,0x44,0x48,0x24,0x48,0x22,0x08,0x10,0x08,0x08,0x05,0x04,0x02,/*\"苏\

0x00,0x00,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x80,0x00,0x88,0x00,

0xF8,0x1F,0x84,0x00,0x82,0x00,0xF8,0x0F,0x80,0x00,0x80,0x00,0xFE,0x3F,0x00,0x00,/*\"星\0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x0F,0x30,0x18,0x18,0x30,0x0C,0x60,0x0C,0x60,

0x0C,0x60,0x0C,0x60,0x0C,0x60,0x18,0x30,0x30,0x18,0xC0,0x07,0x00,0x00,0x00,0x00,//\"0\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,

0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x1F,0x00,0x00,0x00,0x00,//\"1\

0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x18,0x38,0x04,0x30,0x0C,0x30,0x00,0x18,

0x00,0x04,0x00,0x03,0xC0,0x00,0x30,0x20,0x08,0x30,0xFC,0x1F,0x00,0x00,0x00,0x00,//\"2\

0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x0C,0x1C,0x0C,0x18,0x00,0x0C,0xC0,0x03,

0x00,0x1C,0x00,0x30,0x00,0x30,0x0C,0x30,0x0C,0x1C,0xF0,0x07,0x00,0x00,0x00,0x00,//\"3\

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x0F,0x80,0x0E,0x40,0x0E,0x20,0x0E,

0x18,0x0E,0x04,0x0E,0xFE,0x7F,0x00,0x0E,0x00,0x0E,0xC0,0x7F,0x00,0x00,0x00,0x00,//\"4\

0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x3F,0x10,0x00,0x10,0x00,0x08,0x00,0xE8,0x0F,

0x18,0x18,0x00,0x30,0x00,0x30,0x0C,0x30,0x04,0x1C,0xF8,0x07,0x00,0x00,0x00,0x00,//\"5\

0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0x70,0x30,0x18,0x00,0x08,0x00,0xCC,0x1F,

0x3C,0x30,0x0C,0x60,0x0C,0x60,0x18,0x60,0x30,0x30,0xE0,0x0F,0x00,0x00,0x00,0x00,//\"6\

0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0x0C,0x10,0x04,0x08,0x00,0x04,0x00,0x02,

0x00,0x01,0x80,0x00,0x80,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,//\"7\0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x1C,0x38,0x0C,0x30,0x1C,0x30,0x70,0x08,

0xB0,0x07,0x0C,0x1C,0x06,0x30,0x06,0x30,0x0C,0x18,0xF0,0x07,0x00,0x00,0x00,0x00,//\"8\0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x0C,0x1C,0x06,0x10,0x06,0x30,0x06,0x30,

0x0C,0x3C,0xF8,0x33,0x00,0x18,0x00,0x18,0x0C,0x0E,0xF8,0x03,0x00,0x00,0x00,0x00,//\"9\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,/*\":\0X00,0X00,0X00,0X00,0X00,0X00,0Xf0,0X00,0Xf0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0Xf0,0X00,0Xf0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0Xf0,0X00,0Xf0,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0Xf0,0X00,0Xf0,0X00,0X00,0X00,0X00,0Xcc,0X00,0Xcc, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0x06,0x00,0x89,0x2F,0x69,0x30,0x36,0x20,0x10,0x20,0x18,0x00,0x18,0x00,0x18,0x00,

0x18,0x00,0x18,0x00,0x18,0x00,0x10,0x00,0x30,0x20,0x60,0x10,0x80,0x0F,0x00,0x00,/*\"℃\0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00, }; // 汉字编码 uchar code small_table[]=

{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*\"0\0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*\"1\0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*\"2\0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*\"3\0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00,/*\"4\0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*\"5\0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*\"6\0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*\"7\0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*\"8\0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00,/*\"9\0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00};

void add_time(void) { uchar i; for(i=11;i<=12;i++) { if(i==11) { dat[i]=time_h/10+0x30; dat[i+1]=time_h%10+0x30; dat[i+2]='b'; } else if(i==12) { dat[i+2]=time_m/10+0x30; dat[i+3]=time_m%10+0x30; } } }

void change_temp(void); void add_temp(void) { uchar i,j; change_temp(); for(i=16,j=19;j>=16;i++,j--) dat[j]=temp_buf[i-16]+0x30; }

//**********定时器中断函数***************** void timer0_init(void) { TMOD=0x01; TH0=-50000/256;//50ms TL0=-50000%256; TR0=1; ET0=1; EA=1; }

void int0_init(void) { IT0=1; EX0=1; }

void time_bcd(void) { time_buf[0]=time_h/10; time_buf[1]=time_h%10; time_buf[2]=time_m/10; time_buf[3]=time_m%10; }

void rxd_in(uchar line,uchar show_bit,uchar t) { uchar i; time_bcd(); buf[0]=table[20*32+2*line]; buf[3]=table[2*line+17*32];

buf[4]=table[2*line+17*32+1]; buf[7]=table[20*32+2*line]; buf[1]=small_table[time_buf[0]*16+line]; buf[2]=small_table[time_buf[1]*16+line]; buf[5]=small_table[time_buf[2]*16+line]; buf[6]=small_table[time_buf[3]*16+line]; for(i=0;i<8;i++) { SBUF=buf[i]; while(!TI); TI=0; } }

void delay(uchar t) { uchar i; while(t--) { for(i=0;i<250;i++); } }

uchar getkey(void) { uchar key,t; if((key=P2&0x0f)==0x0f) return 0xff; for(t=0;t<5;t++) delay(5); if((key=P2&0x0f)==0x0f) return 0xff; return key; }

void rxd_out(uchar show_bit,uchar t) { uchar line;

for(line=0;line<16;line++) //16行扫描 {

// in_data(); //调整数据

// rxd_data(); //串口数据传送 rxd_in(line,show_bit,t); P1=0x7f; //关闭显示 // delay();

P1_7=1; //锁存为高 ,595锁存信号 P1=line; //送行选 } }

/************************** 功能:延时15us 入口参数:n 出口参数:无

**************************/ void delay15(uchar n) { do { _nop_();

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); n--; }while(n); }

/************************** 功能:初始化DS18B20 入口参数:无; 出口参数:无 **************************/ bit reset(void) { bit err; DQ=0; delay15(40); //延时600us,保证低电平连续600us( 对应于t0~t1) DQ=1; delay15(4);//让高电连续60us对应于t1~t2时刻 err=DQ; delay15(18);//延时150us对应于t2~t3时刻 return err; }

/****************************************** 功能:将数据写入 DS18B20 入口参数:无符号字符型d, 出口参数:无 ******************************************/ void wrbyte(uchar d) { uchar i; dat_show=d; for(i=0;i<8;i++) { DQ=0; delay15(1); DQ=dat_show0; // delay15(1); dat_show=dat_show>>1; delay15(1); DQ=1; //为下次发送数据做预备 } }

/***************************** 从DS18B20中读出数据 入口参数:无 出口参数:无符号字符型dat *****************************/ uchar rdbyte(void) { uchar i; dat_show=0; for(i=0;i<8;i++)

{ dat_show=dat_show>>1; DQ=0; _nop_(); DQ=1; delay15(1); dat_show7=DQ; delay15(4); } return(dat_show); }

/**************************************** 延时3ms 入口参数:无;出口参数:无

****************************************/ void late(void) { uchar i; for(i=0;i<200;i++) delay15(200); }

/**************************************** 从温度传感器读取数据,并入一个数组中 入口参数:无;出口参数:temp

****************************************/

int gettemp(void)//读温度函数,将读到的温度放到temp数组中 { uchar h,l; bit err; err=reset(); wrbyte(0xcc); wrbyte(0xbe); l=rdbyte(); h=rdbyte(); return h*256+l; }

/*****************************************/ void in_data(void) { char s,i; switch(count) { case 0: case 1: case 2: for(s=4;s>=0;s--) { FF[2*s+1]=table[zimuo+1+32*s+2*h]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[zimuo+32*s+2*h]; //把第一个字模的第二个字节放在BUFF1 } //把第二个字模的第二个字节放在BUFF3 break; case 3:

FF[9]=table[2*h+((dat[0]-0x30)+7)*32+1]; FF[8]=table[2*h+((dat[0]-0x30)+7)*32]; for(s=3;s>=0;s--) { FF[2*s+1]=table[zimuo+1+32*s+2*h]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[zimuo+32*s+2*h]; //把第一个字模的第二个字节放在BUFF1 } //把第二个字模的第二个字节放在BUFF3 break; case 4: FF[9]=table[2*h+((dat[1]-0x30)+7)*32+1]; FF[8]=table[2*h+((dat[1]-0x30)+7)*32]; FF[7]=table[2*h+((dat[0]-0x30)+7)*32+1]; FF[6]=table[2*h+((dat[0]-0x30)+7)*32]; for(s=2;s>=0;s--) { FF[2*s+1]=table[zimuo+1+32*s+2*h]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[zimuo+32*s+2*h]; //把第一个字模的第二个字节放在BUFF1 } //把第二个字模? break; case 5: FF[9]=table[2*h+((dat[2]-0x30)+7)*32+1]; FF[8]=table[2*h+((dat[2]-0x30)+7)*32]; FF[7]=table[2*h+((dat[1]-0x30)+7)*32+1]; FF[6]=table[2*h+((dat[1]-0x30)+7)*32]; FF[5]=table[2*h+((dat[0]-0x30)+7)*32+1]; FF[4]=table[2*h+((dat[0]-0x30)+7)*32]; for(s=1;s>=0;s--) { FF[2*s+1]=table[zimuo+1+32*s+2*h]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[zimuo+32*s+2*h]; //把第一个字模的第二个字节放在BUFF1 } //把第二个字 break; case 6: FF[9]=table[2*h+((dat[3]-0x30)+7)*32+1]; FF[8]=table[2*h+((dat[3]-0x30)+7)*32]; FF[7]=table[2*h+((dat[2]-0x30)+7)*32+1]; FF[6]=table[2*h+((dat[2]-0x30)+7)*32]; FF[5]=table[2*h+((dat[1]-0x30)+7)*32+1]; FF[4]=table[2*h+((dat[1]-0x30)+7)*32]; FF[3]=table[2*h+((dat[0]-0x30)+7)*32+1]; FF[2]=table[2*h+((dat[0]-0x30)+7)*32]; // 把第二个字模的第一个字节放在BUFF2 FF[2*0+1]=table[zimuo+2*h+1]; //把第一个字模的第二个字节放在BUFF1 FF[2*0]=table[zimuo+2*h]; //把第二个字 break; default: for(i=count-3,s=4;s>=0;s--,i--)

{ if((dat[i]-0x30>=0)&&(dat[i]-0x30<=9)) { FF[2*s+1]=table[2*h+((dat[i]-0x30)+7)*32+1]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[2*h+((dat[i]-0x30)+7)*32]; //把第一个字模的第二个字节放在BUFF1 } else if(dat[i]=='a') { FF[2*s+1]=table[2*h+20*32+1]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[2*h+20*32]; //把第一个字模的第二个字节放在BUFF1 } else if(dat[i]=='b') { FF[2*s+1]=table[2*h+17*32+1]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[2*h+17*32]; //把第一个字模的第二个字节放在BUFF1 } else if(dat[i]=='c') { FF[2*s+1]=table[2*h+18*32+1]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[2*h+18*32]; //把第一个字模的第二个字节放在BUFF1 } else if(dat[i]=='d') { FF[2*s+1]=table[2*h+22*32+1]; //把第一个字模的第一个字节放在BUFF0 // 把第二个字模的第一个字节放在BUFF2 FF[2*s]=table[2*h+22*32]; //把第一个字模的第二个字节放在BUFF1 } } } }

/**************16段扫描函数******************/ void sbuf_out() { for(h=0;h<16;h++) //16行扫描 {

in_data(); //调整数据

rxd_data(); //串口数据传送 P1=0x7f; //关闭显示 P1_7=1; //锁存为高 ,595锁存信号 P1=h; //送行选 } }

/*******************************/

void rxd_data(void) //串行发送数据 {

char s;

uchar inc,tempyid,temp;

if(yid<8) inc=0; else inc=1;

for(s=0+inc;s<8+inc;s++) // 发送2字节数据

{

if(yid<8) tempyid=yid; else

tempyid=yid-8;

temp=(FF[s]>>tempyid)|(FF[s+1]<<(8-tempyid));//h1左移tempyid位后与h2右移8-tempyid //后相或 ,取出移位后的数据 SBUF=temp; //把BUFF中的数据移位相或后发送输出 while(!TI); //那个地点使用了串口,串口的数据发送 //最低位在前 TI=0; //等待中断 } }

void change_temp(void) { int t; bit zf; t=gettemp(); zf=0; if(t<0) { zf=1; t=-t; } temp_buf[0]=dp[t&0x0f]; t=t>>4; temp_buf[3]=t/100; t=t%100; temp_buf[2]=t/10; temp_buf[1]=t%10; if(zf==1) { if(temp_buf[2]==0) { temp_buf[3]='a';// shut down temp_buf[2]='c';//negative } else temp_buf[3]='c';// shut down } else { if(temp_buf[3]==0) { if(temp_buf[2]==0) temp_buf[2]='a';

temp_buf[3]='a'; } } }

void inerrupt0(void) interrupt 0 { uchar key,i,location=0; TR0=0; while(1) { key=getkey(); for(i=0;i<7;i++) rxd_out(location,i); if(location==0) { if(key==INC) { time_h++; if(time_h==24) time_h=0; } else if(key==DEC) { time_h--; if(time_h==0) time_h=23; } } else if(location==1) { if(key==INC) { time_m++; if(time_m==60) { time_m=0; time_h++; } } else if(key==DEC) { time_m--; if(time_m==0) { time_m=59; time_h--; if(time_h==0) time_h=23; } } } if(key==SELECT) location=(location+1)%2; if(key==EXIT) break; }

TR0=1; }

void timer0_interrupt(void) interrupt 1 { TH0=-50000/256;//50ms TL0=-50000%256; time_count++; if(time_count==20) { time_count=0; time_s++; if(time_s==60) { time_s=0; time_m++; if(time_m==60) { time_m=0; time_h++; if(time_h==24) time_h=0; } } add_time(); } // change_temp(); // add_temp(); }

/**************主函数******************/ void main(void) { uchar i, d=1; timer0_init(); int0_init(); yid=0; zimuo=0; //SCON=0X00; add_time(); P2=P2|0x0f; dat[20]='d'; change_temp(); add_temp(); while(1) { while(yid<16) //数据移位 {

for(i=0;isbuf_out(); }

yid++; //移动一步 }

yid=0;

zimuo=zimuo+32; //后移一个字 count++;

if(zimuo>=760) //到最后从头开始,有字数决定 count= zimuo=0;

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igbc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务