分类号 TP273 单位代码 10642
密 级 公 开 学 号201108051018
学士学位论文
论文题目:基于单片机的LED点阵显示屏设计
论 文 作 者:付文星 指 导 教 师:杨宝亮(讲师) 专 业:电子信息科学与技术 提交论文日期:2015年5月11日 论文答辩日期:2015年5月17日 学位授予单位:重庆文理学院
中 国 ? 重 庆 2015年5月
Graduation Thesis of Chongqing University of Arts and Sciences
Design of LED Matrix Screen based on MCU
Candidate: Fu Wen Xing
Supervisor: Yang Bao Liang(lecturer)
Major: Electronic information Science Technology
College of Electron and Electrical Engineering Chongqing University of Arts and Sciences
05,2015
and 中文摘要
摘 要
此课题设计的是基于单片机的LED显示屏,以STC12C5A60S2单片机为整个系统的控制核心,由时钟芯片DS1302、温度传感器DS18B20和点阵显示屏驱动器构成整个系统。点阵显示屏采用16块8×8的LED点阵焊接成16×64点阵显示屏,能够实现显示时间、温度、简单的图像等。显示方式采用动态显示,文字、数字能够实现静止、滚动显示方式。单片机STC12C5A60S2控制程序采用C语言进行编程,通过程序控制各显示单元对应LED点阵屏的阳极和阴极端的高低电平,准确的控制没一个LED灯的亮灭。所需要显示文字、数字、符号的点阵数据使用字模提取软件获取。基于单片机的LED点阵屏便于信息更改、亮度高、能耗低、显示内容丰富,在广告宣传和实验教学中有着广泛的应用。
关键词:单片机;LED点阵屏;STC12C5A60S2;DS1302
I
英文摘要
Abstract
Design of the subject is the LED display based on single chip microcomputer, STC12C5A60S2 microcontroller as the control core of the whole system, by the clock chip DS1302, temperature sensor DS18B20 and dot matrix display screen drive the whole system.Dot matrix display screen with 16 pieces of 8 x 8 of 16 * 64 dot matrix display screen, LED lattice welding into can achieve display time, temperature, simple image and so on.Display dynamic display, text, Numbers, can achieve static, scrolling display mode.SCM STC12C5A60S2 control program using C language programming, through the program control and display unit corresponding to the LED lattice screen anode and the cathode side of high and low level, the accurate control did not destroy the light of an LED lamp.The need to display text, Numbers, symbols of lattice software for extracting data using a font.Based on single chip microcomputer of LED dot matrix screen to facilitate information changes, high brightness, low energy consumption, shows rich content, in advertising and has been widely used in the experiment teaching.
Key words: MCU; LED matrix screen; STC12C5A60S2;DS1302
II
目录
目录
1 引言 ....................................................................................................................................................... 1 2 系统总体设计 ....................................................................................................................................... 1 3 系统硬件电路设计 ............................................................................................................................... 1
3.1 主控模块 ................................................................................................................................. 1 3.2 单片机时钟电路和复位电路 .................................................................................................. 2 3.3 时钟模块 ................................................................................................................................. 3 3.4 温度模块 ................................................................................................................................. 3 3.5 按键模块 ................................................................................................................................. 4 3.6 点阵屏驱动芯片........................................................................................................................ 4
3.6.1 74HC138芯片简介 .......................................................................................................... 4 3.6.2 74HC595 芯片简介 ......................................................................................................... 5 3.6.3 74HC245 芯片简介 ......................................................................................................... 5 3.6.4 74HC4953芯片简介 ........................................................................................................ 6 3.7 点阵显示屏模块 ...................................................................................................................... 6
3.7.1点阵显示原理 ................................................................................................................... 6 3.7.2驱动电路设计 ................................................................................................................... 8
4 系统总体设计 ....................................................................................................................................... 9 5 系统调试 ............................................................................................................................................. 11
5.1 硬件调试 ............................................................................................................................... 11 5.2 软件调试 ............................................................................................................................... 11 6 结语 ..................................................................................................................................................... 13 致谢 ......................................................................................................................................................... 14 参考文献 ................................................................................................................................................. 15 附录 ......................................................................................................................................................... 16 系统整体原理图 ..................................................................................................................................... 16 程序源代码 ............................................................................................................................................. 17
2015届电子信息科学与技术专业学士学位毕业论文(设计)
1 引言
随着当今社会科技的迅猛发展,LED点阵显示器件作为当下我们获得信息的重要媒体,在
众多领域中有着广泛应用。所以LED点阵显示屏在21世纪初飞速发展,成为光电子行业的新兴产业。LED显示屏拥有外形美观大方,能显示大量信息,显示类容便于更改著称。主要应用在广告宣传、信息公布、等众多领域。在公共场所,我们基本都能看到各式各样LED显示屏,在不知不觉的LED显示屏成为我们生活中获取信息很重要的一个渠道。本设计广泛涉及到了单片机技术、硬件接口和驱动技术、C语言编程等许多专业知识。随着时间的推移我们获取信息的渠道、方式发生了巨大变化,生活中我们从LED显示平台获取的信息越来越多, LED显示屏显示信息量大、寿命长、稳定性能高,便于维护和操作安装等特点,在我们生活中承担着无比重要的任务。本设计能满足应用需求。
2 系统总体设计
本系统主要由单片机最小系统模块、时钟模块、温度模块、点阵显示屏模块组成,总体设计框图图1所示的是。本次设计是完成一个能够静态和左移动显示显示时间、温度的LED点阵显示屏。单片机通过与时钟芯片DS1302、温度传感器DS18B20通信获取时间和温度信息。单片机对LED点阵显示屏行列驱动器精确的控制来控制每一个LED,达到显示静态时间、温度,向左移动显示日期时间及许多文字信息。如果只能够实现静态显示通过,那么一个16*64LED 显示屏能够显示的内容是非常有限的。因此可以用滚动显示来提高能显示内容的容量,如果只用滚动显示很可能我们有时不能及时从显示屏中获得我们所需要的信息,所以我们本设计采用滚动显示加静态显示,将大部分时间用静态显示重要的信息,小部分时间用于显示一些其他信息,然后以这样的周期循环显示。设置功能按键和加减功能按键可以对显示内容中年、月、日以及时、分、秒进行调整。
列 驱 动 器 单 片 机 按键 按键电路 行驱动器 DS18B20 DS1302 图1 总体设计框图
3 系统硬件电路设计
3.1 主控模块
主控模块在整个系统里起着统领全局的重任。STC12C5A60S2单片机首先要检测键盘触发,当有按键触发时,单片机会处理指令,将指令反馈到整个系统当中。其次要与时钟芯片DS1302和温度传感器DS18B20通信,采集时间信息、日期信息和温度信息。所以本设计选用速度更快,功能更强的STC12C5A60S2单片机作为主控芯片。
1
姓名:付文星 论文题目:基于单片机的LED点阵显示屏设计
51系列单片机是基于8031单片机发展而来,最早是由Intel 公司推出的。后来Atmel、Philip、Siemens等几大单片机生产商也相继推出了51 系列的单片机。这几大电子生产商推出的单片机具有内部结构与51单片机相同的优势,且指令是兼容51单片机的,这就使得编程过程变得更加高效,更加容易地应用在科学研究和工业测控领域。
主控模块中的STC12C5A60S2单片机是新一代的51单片机,是51单片机的升级版本,该单片机秉承了传统8051的优势的基础上,还具有功耗更低、速度更快、抗扰能力更强、指令代码完全兼容等众多优点。STC12C5A60S2单片机共40个引脚,且内部集成MAX810专用复位电路和1280字节RAM,该单片机有4个16为定时器/计数器,2个时钟输出,7路外部中断I/O口,8路高速A/D转换。本设计采用STC12C5A60S2单片机来控制整个系统,负责检测按键触发、与时钟芯片和温度传感器通信及LED点阵显示屏的控制。图2是STC12C5A60S2单片机结构图。
XTAL2时钟电路XTAL1RAM128BSFR 21个定时个/计数器2VccCPUROM/EPROM/Flash 4KB总线控制中断系统5个中断源2个优先级串行口全双工1个4个并行口VssRSTEAPSENALEP0P1P2P3
图2 STC12C5A60S2单片机结构图
3.2 单片机时钟电路和复位电路
为了保证驱动点阵显示屏没有明显的频闪,本设计采用在单片机XTAL1和XTAL2接外部振荡电路,单片机的时钟信号由外部生成。在18和19引脚上外接晶振X1,单片机内部产生自激振荡。系统采用的定时元件为石英晶体和电容组成的并联谐振回路。X1频率为22.1148MHZ,两个振荡电容各取30pF,电容起的作用是对频率进行微调。
图3 晶振电路、复位电路
2
2015届电子信息科学与技术专业学士学位毕业论文(设计)
单片机有多种复位电路,本设计采用自动复位。当上电时,电容充电,电源经过电容器加到9号RST引脚,进行复位。时钟和复位电路如图3所示: 3.3 时钟模块
S1302是DALLAS公司推出的高性能、低功耗时钟芯片,它包含一个实时时钟、日历和31字节静态RAM。通过串行接口与单片机进行串行通信。实时时钟和日历电路可以提供秒、分、时、日、月、年等时间信息,可以自动纠正每月的天数和闰年的天数,可以通过AM/PM指示来确定时钟芯片采用24或者12小时格式。DS1302与单片机之间通信仅需用到3 个I/O:RST(复位)、I/O(数据线)、SCLK(串行时钟)。RAM的读/写数据可以是多达31个字节的字符组也可以是一个字节。DS1302工作时能耗低,保持正常工作的功率小于1mW,当为时钟芯片加上备用电源后,在不需要使用显示屏时可以断掉电源且不会影响正常计时,在下次启用时不需要重新调整时间。芯片的1引脚和8引脚为供电接口, 1脚接5V电,8引脚接3V的备用电源。复位引脚、数据口和时钟线接单片机就可以实现通讯,2和3引脚接32768Hz晶振。
图3 时钟芯片DS1302的电路图
3.4 温度模块
DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20内部包含有一个温度传感器和模数转换电路,不需要其他多余的外围电路,与STC12C5A60S2通信只需要一条数据线。温度传感器中有用保存温度值的两个8位RAM。 其中一个保存温度的符号,如果温度为负(℃),那么这么这个RAM每一位都为1,否则全是0。另一个用于保存采集到的温度数值。此传感器测量范围-55℃~+125℃,在-10~+85℃内误差在0.5℃以内。电路原理图如图2-4所示。
3
姓名:付文星 论文题目:基于单片机的LED点阵显示屏设计
图4 温度传感器DS18B20原理图
3.5 按键模块
本设计共4个独立按键,每个独立按键的一端接一个I/O口,另外一端接地,在没有按下按键的时候,单片机始终检测到的是高电平,即识别为按键没有按下,因此不做任何应答。当按键按下时,此时I/O短接地,单片机检测到按键所对应到的I/O此时由高电平改变为低电平,就可以判断此时触发的是哪一个按键。4个按键的功能分别是:第一按键为设置按键,正常显示时,按一下进入设置日期的年,在按设置键分别是设置月、日、时、分、秒;第二个按键为用于调整时间的递增按键,第三个按键为用于调整时间的递减按键,第四个按键为返回按键,用于退出设置界面,返回到正常显示。
图5键盘模块电路图
3.6 点阵屏驱动芯片
本设计中需要控制的led灯数量大,因此不能用单片机的一个i/O驱动一个led的方式,采用扫描驱动的方式。本设计的屏幕,由于需要的驱动芯片,驱动电路较为复杂,工作量大,本设计集成了驱动的单元板,这样设计可以降低成本,增加产品的观赏性。这里简单介绍各个驱动芯片。
3.6.1 74HC138芯片简介 74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。
74HC138与单片机连接的数据引脚一共有三个,分别为A0, A1、A2。并且当138使能时,138的输出Y0-Y7输出是相互排斥的,Y0-Y7输出自有一个是低电平其余为高电平。74HC138总共有3个使能输入端,要保证138的正常工作,必须正确的配置这三个使能引脚。他的使引脚中两个低有效(E1和E2)和一个高电平有效(E3)。因为74HC138有这些特定的性能,因
4
2015届电子信息科学与技术专业学士学位毕业论文(设计)
此只要2块74HC138就可以搭建一个4-16译码器。图6 为74HC138的引脚图。 ①第 4,5 脚. /(E1)、/(E2) 选通端; ②第 6 脚. E3 选通端; ③第 8 脚. GND 地;
④第 7,9~15 脚. Y7~Y0 译码输出端; ⑤第 16 脚. Vcc 电源
图6 74HC138引脚图
3.6.2 74HC595 芯片简介
74HC595内部含有一个8位移位寄存器还包含有存储器,它的I/O具有三态输出功能。 移位寄存器和存储器它们的时钟电路是分开的互不影响。当我们想通过595向外输出数据时,数据首先在SH_cp的上升沿的时候保存到移位寄存器,数据在ST_cp的上升沿保存到存储寄存器。其输入与CMOS 输出兼容,有一个端口可以对移位存器清零和复位可以控制输出部分。74HC595最大的好处是包含有数据存储寄存器,移位的时候输出端的数据不会改变,这对于显示屏的驱动有极为重要的作用。其引脚说明如下,真值表见图7。
① Q0…Q7 8位并行数据输出; ② GND 第8脚 地;
③ Q7’ 第9脚 串行数据输出; ④ MR 第10脚 主复位(低电平); ⑤ SHCP 第11脚 移位寄存器时钟输入;
⑥STCP 第12脚 存储寄存器时钟输入; ⑦OE 第13脚 输出有效(低电平); ⑧DS 第14脚 串行数据输入; ⑨VCC 第16脚 电源;
图7 74HC595真值表
3.6.3 74HC245 芯片简介 由于单片机i/O的驱动能力非常的有限,通常需要在单片机和另外的模块中加驱动。245是可以控制上行还是下行八路缓冲器,常常用于数据总线的双向异步通信。在将245数据输入
5
姓名:付文星 论文题目:基于单片机的LED点阵显示屏设计
引脚接到单片机上,不仅可以消除上下行数据的相互影响,而且可以保证芯片的不被损坏。当cpu与受控器件之间想要双向异步通信, 245就是最好的选择。通常在同并口液晶屏、、并口传感器或通讯模块的接口上我们可以见到。图 8 为74HC245的引脚图。
图8 74HC245引脚图
3.6.4 74HC4953芯片简介
4953作用:行驱动管;功率管。我们常常在LED点阵显示屏的驱动电路中能够发现。点阵显示屏的每一行常常有许许多多的led灯,想要它们都正常工作,每一行的电流就会特别大这时就需要使用行驱动管。一片4953内部有两个行驱动管,可以驱动两行。1、3脚VCC;2、4脚控制脚;2脚控制7、8脚的输出;4脚控制5、6脚的输出;只有当2脚为“0”时;7、8才会输出否则这个端口为高阻态,与之对应的另外一组行驱动管也有相同的特性。图9为74HC4953的引脚图和内部结构图。
图9 74HC4953引脚图和内部结构图
3.7 点阵显示屏模块
3.7.1点阵显示原理
8*8LED点阵由64发光二级管构成。每一行的LED是共阴极,每一列的LED是共阳极。如果只需要左上角的灯亮就需要第一行为低电平,第一列为高电平。如果想要点阵显示一个字符,就需要利用像流水灯一样的多太显示,当刷新速度大于人眼视觉暂留性时间。
6
2015届电子信息科学与技术专业学士学位毕业论文(设计)
图10 8×8共阴点阵原理图
本设计需要显示的信息量大,因此必须用到动态显示。动态显示是指将一个需要显示的字符分割为一行一行的,然后快速的显示完16行,并重复许多次。但是如果驱动电路和驱动程序设计不够好,容易造成亮度低,闪烁等问题。事实上利用动态显示并不是让需要亮的灯常亮,而是因为发光二极管的余晖效应和人眼的视觉暂留,让我们感觉到他们是常亮的。
最关键的的是如何恰当的提取每个字符的字模。目前有许许多多可以完成取模的软件,本次设计采用的是pc2002取模软件。打开软件后首先要最取模的参数进行详细的设置,规避取模参数与程序不相符造成乱码的现象。这里我采用的取模参数为宋体、粗体、左移一位,取模方式:逐行式逆向阳码,汉子需要的点阵大小为16*16。当为数字或者英文取模时这款软件能自动将字符的宽度减少一半。设置好取模参数后,在文字输入框内输入“电”后在上面的预览框内能看到字符的效果然后点生成字模。最后把下面的字模复制到程序中的相应位置。
图11 字模选项设置
7
姓名:付文星 论文题目:基于单片机的LED点阵显示屏设计
图12 软件提取字符字模
3.7.2驱动电路设计
行驱动我采用2块74ls138级联组成一个4-16译码器。本设计显示屏每行有64个led灯,每行的显示电流较大,138的驱动能力有限,因此在138译出引脚后连接P_MOS管4953,4953为行驱动管,每片4953分别可以帮助我们驱动两行。8个4953的每一个输出引脚加起来一共有 16个输出引脚,每个输出引脚分别分别接led显示屏一个行且接一个33K的电阻电阻的另一端接地。由于单片机芯片很脆弱,为了保证产品长时间无故障运行,所以在74LS138的数据选择端接到一个74hc245的数据引脚。74HC245是八路缓冲器,可以实现数据的双向异步通信。在将245数据输入引脚接到单片机上,不仅可以消除上下行数据的相互影响,而且可以保证芯片的不被损坏。整体驱动原理框图如图13所示,电路图如图14所示。
图13 驱动电路原理图
8
2015届电子信息科学与技术专业学士学位毕业论文(设计)
图14 行驱动器电路图
列的驱动我用8片74LS595级联,应为595可以无限级联,因此很节省数据口。总共只需3个数据引脚,分别为串行数据引脚、时钟引脚和锁存引脚。8片74LS595共用CLK(时钟引脚)、RCLK(锁存引脚)。第一块595的SER接到单片机的列驱动数据引脚,后面的每块595的SER引脚接前面的QH1引脚。74LS595的1 0脚接电源,13脚使能引脚接地,图15为列驱动器原理图。
图15 列驱动器
4 系统总体设计
本设计主要是为了使LED点阵显示屏能够显示静态显示字符,和动态显示字符,为了使显示的内容变得丰富,添加可以实时显示时间、日期和温度。源程序采用Keil uVision4编写的C程序,实现了用LED点阵显示屏显示相关字符,实现了从向左流动显示以及静态显示文字、时间、设置、温度,还实现了时间的向上翻页显示。采用了模块化编程思想,源程序主要包含主程序、延时程序、设置程序、时钟翻页显示程序、静态显示程序、动态显示程序、时间日期采集程序以及温度采集调整程序和字符的字模数据库。本系统采用一个STC12C5A60S2、一个时钟芯片DS18B20、一个温度芯片DS18B20、4个按键及一个使用标准08接口的16*64显示屏。16*64的显示屏采用了两个74LS138、2个74HC245、8个74LS595、8个P_MOS管4953、16个8×8LED点阵显示屏组成的点阵单元板。DS1302,DS18B20官方都有驱动程序,可以找到相关的
9
姓名:付文星 论文题目:基于单片机的LED点阵显示屏设计
头文件,因此工作重心在主函数的编写。主函数的编辑有三个重要的部分:其一是如何驱动显示屏静态显示、向左移动显示以及时钟的翻页显示;其二是怎么把如何采集时钟芯片和温度传感器的数据以及如何把采集到的数据和显示程序有机的结合;其三是按键程序以及相应的调整时间程序。程序主要由开始、各个模块的初始化程序、显示程序、按键程序等构成。
当接通电源是,单片机开始工作。首先各个模块的初始化,先是P0和P3口的初始化,然后是时钟芯片进行初始化,接着是从时钟芯片中读取所有的信息,接着是读取温度信息,最后是定时器和中断的初始化。初始化完成后进入正常工作的系统循环读。首先是向左流动显示20**年*月*日星期* 时间**:**:**。流动显示完后静态显示时间,静态显示时间时,秒采用向上翻页显示。静态显示时间一段时间后,向左移显示温度,当温度显示左移动到相应位置是静态显示温度4S。然后继续左移显示“电信一班毕业设计”。以上为整个程序的循环。按键调用中断判断程序,进入设置日期时间由设置键对应的中断决定,当进入设置后在加、减和返回功能键的按键操作才为有效操作,分别调用自己的子程序。图16为系统整体流程图。
开始 初始化 读取时间温度 设置时间 设置日期和时间 左移显示年月日星期时静态显示时分向上翻页左移显示温度 图16 系统整体流程 10
2015届电子信息科学与技术专业学士学位毕业论文(设计)
5 系统调试
5.1 硬件调试
本系统的电路比较复杂,涉及的模块比较多,其中包括时钟模块,温度模块,单片机最小系统模块,LED点阵显示屏模块,因此对于焊接也有着较高的要求,整个电路系统中只要有一处出现错误,就会对整个系统造成很大的影响。轻则显示乱码,严重的话会造成器件的损坏,甚至导致整个电路短路。
在制作硬件电路之前,首先要在PROTEL里面画出每个小系统的硬件模块的原理图,便于焊接和编程时查找接口和调试纠错。确定整个系统原理图无误后开始进行焊接,每一步的元器件的焊接都要按照顺序逐步的进行,一定要保证完全正确的前提下再进行下一步的操作,就能够将错误几率控制到最低避免焊好后有许多问题,甚至调试时烧坏元器件。
如图 5 所示,这里测试控制板是否能够正常的驱动本系统中的16*64点阵显示屏,为全部点亮的情况,可以看到 LED 屏幕的显示效果,并且测试出LED点阵完好无坏点,所有的led灯均能正常发光,结果表明显示屏电路运行正常、可靠,控制板焊接正确能正常的驱动显示屏。
图17 LED点阵全屏点亮
5.2 软件调试
本系统的程序编写相当复杂而繁琐,在编写程序的时候遇到了很多的问题,在调试时也多次修改程序,直到程序能够正常写入并运行。为了得到更好的测试效果,首先编写全屏点亮和全屏关闭程序,然后是静态显示文字程序,然后在编写静态显示加移动显示和向上翻页显示程序,最后在加时钟温度。最后经过很多次修改,尤其是针对静态显示程序和移动显示程序,一字一句的修改,一点一滴的整合程序,才逐步解决了在程序上出现的问题。
在调试程序时,采取分模块调试,首先是调试能否正常显示文字、英文之母、简单的图片以及数字。确定静态显示模块、左移显示模块、上移显示模块、时间显示模块没有问题后开始,将各个模块有机的融合到一起。在调试程序的时候出现了许许多多各种各样的问题,进过不断的改进,最终调试成功。
11
姓名:付文星 论文题目:基于单片机的LED点阵显示屏设计
图18 各模块程序显示效果
以下将总结两个在程序调试过程中出现的问题和解决方案:
出现的主要的问题是:写入程序后,LED点阵显示屏无法正常显示花屏。
解决方案是:通过修改显示程序,修改字模,调整延时可以解决该问题。因为动态扫描的周期长、速度慢,扫描频率太慢无法看上去频闪,或无法正常显示。
出现的主要的问题是:按下按键后,单片机无法识别按键和按键不灵。
解决方案是:按键的功能和程序里定义功能的接口不匹配,可以在程序里调整相关接口定义。按键不灵,加入按键防抖。
下图为调试完成后的实际显示效果图,由于拍摄设备比较简陋,移动显示稍显模糊,实物显示效果很好,不频闪,不花屏。
12
2015届电子信息科学与技术专业学士学位毕业论文(设计)
6 结语
通过本次毕业设计,我收获了很多元器件的相关知识,也学习了很多科学研究思路,对STC12C5A60S2芯片、8*8的LED点阵模块, 74HC595, 4953, 74HC245, 74HC138等芯片有了更进一步的了解。同时对keil uvision4、Protel99、Proteus等软件的操作也更加熟练,弥补了很多软件操作方面的理论知识的不足。通过此次理论结合实际的过程的训练,我提高了理论结合实际的能力。总之,通过这次动手设计与操作,找到了自己在实践方面的不足,也学到了很多理论结合实际的知识,提高了自己动手编程的能力,焊接技术也得到了提升,同时提升自己解决实际问题的能力。
13
姓名:付文星 论文题目:基于单片机的LED点阵显示屏设计
致谢
经过几个月的努力学习,认真钻研和坚持不懈下,我的毕业论文已经到了收尾阶段。在完成毕业设计的过程中,我认为自己还缺乏实践经验,理论融合实际的能力也有所欠缺。在杨宝亮师的细心指导下,一点一点的完成了整个毕业设计。同时也对帮助过我的各位同学表示感谢,在这次的设计中我们互相鼓励,共同探讨和解决设计中遇到的问题,不但相互得到了提高,也增强了我们的团队意识。在老师指导毕业设计的过程中,我提高了理论联系实际的能力,感受到了严谨的学风和工作作风,学会了理论结合实践方法,让我受益匪浅。 感谢为评阅本文付出辛勤劳动的所有老师评委! 最后,再一次衷心感谢所有关心和帮助过我的人们。
14
2015届电子信息科学与技术专业学士学位毕业论文(设计)
参考文献
[1] 李秀忠.大屏幕LED显示屏控制系统设计[J].现代电子技术, 2012, 35(19): 135-138. [2] 吴光.LED显示屏电路技术概况 [J]. 现代显示, 2010( 1): 41- 46.
[3] 韩团军.基于单片机的 LED 点阵显示控制的设计[J].电子设计工程,2011,19(5):180-182. [4] 冯月芹.基才P89V51RD2单片机LED点阵显示屏的实现[J].电子设计工程,2012,20 (6):143-145.
[5] 郑宝华等.LED图文显示屏的设计与实现[J].吉林:吉林化工学院学报,2001,18(3).44-45 [6] 沙占友.大屏幕智能显示屏概述[M].电测与仪表,1991,(5)
[7] 陈建军.LED大屏幕显示系统的VGA同步技术[M].电子技术应用,1997,(11):29-32 [8] 刘曙光.LED电子显示屏真彩显示的几种关键技术[J].北京:国外电子测量技术,2001,6.27-31
[9] 李径达.基于锁存方式LED显示屏的软件设计[J].沈阳:计算机应用研究,1999(5).56-57 [10] 刘传清,张蕴玉,胡修林.LED彩色屏数字视频信号的数据重构与存储技术[J].江西:电子与自动化,1999,28(1).15-17
[11] Neiesonl,Lee JD. Conversation with Graphics:Implicatinons for the Design of Natural Language/Graphics Interfaces[M].Int.J.Human_ComputerStudies,1994(3).126-127 [12] Dai Yisong,ZhaoJiyin.The Recursive Realization of WINNER Filter for AR(P) Models[J].the AMSE International 1990 Chengdu Conference,8-10,1999.22-25. [13] S.M.Wu,Impact of 100 In-Process Control(spc)in Automobile Body Assembly[J].Science Magine,1999.26-29
[14] 程立敏.VB编程基础与串口通信技术[M].吉林:吉林化工院,2004,04.20-85
[15] 于国庆,高俊岭,朱英杰.ZX-1型大屏幕LED智能显示系统的设计[M].电子技术应用,1995 [16] 靳桅.基于51系列单片机的LED显示屏开发技术. 北京:北京航空航天出版社 [17] 诸昌钤.LED显示屏系统原理及工程技术. 成都:电子科技大学出版社,2000 [18] 季晓芳.双汉字16×16LED点阵广告屏的制作[J].安徽水利水电职业技术学院报, 2010(10):60-61.
[19] Electrical-capacitance tomography[J].Meas.Sci.technol, 1999(10):1065-1069.
15
2015届电子信息科学与技术专业学士学位毕业论文(设计)
附录
系统整体原理图
16
2015届电子信息科学与技术专业学士学位毕业论文(设计)
程序源代码
#include \#include \#include \#include \#include \
#define H_PORT P0 //ABCD P0 点阵显示屏接口定义
sbit RData = P0^4; sbit OE=P0^5; sbit L_STB = P0^6; sbit L_CLK= P0^7; sbit GData= P3^4;
sbit key_adj=P3^0; sbit key_add=P3^1; sbit key_dec=P3^6; sbit key_esc=P3^7; #define KEY_VAL 5 //定义按键手感 #define set_row(row) {H_PORT=(row&0x0f);} SYSTEMTIME CurrentTime; unsigned char status=0; //按键状态 unsigned char disp_mode=0; //显示状态 unsigned char offset=0; //移动显示用的变量 unsigned char disrow=0; //当前扫描行 unsigned char k=0; //往buff中填的字 unsigned int t_counter=0,stop_counter=0,stop_time=0; unsigned char f1=18,f2=18,f3=18,f4=18,f5=18,f6=18;
bit switch_flag=0, stop_bit=0; bit one_sec_flag=0, half_sec_flag; bit nongli_flag=0,nongli_change_flag=0,festival_flag=0; unsigned char temp_time[6]; //翻页钟用到 unsigned char color = 0; unsigned int count_move; //颜色 移动速度
bit add_flag=0; bit dec_flag=0; bit adj_flag=0; bit esc_flag=0; //加、减、调整、返回标志 unsigned char ka=0,kb=0,kc=0,kd=0; //按键用 unsigned char date[]={
10,10,10,10,10,10,10,10, 2,0, 1,2, 49,50, 0,1, 51,52, 0,1, 53,54, 10, 55,56,57,58, 53,54, 10,0,0, 11, 0,0, 11, 0,0, 10,10,10,10,12,10,13,14, 10,10,10,10,10,10,10,10, }; unsigned char code mode[4]={0,1,7,8}; //几种显示模式的排列, unsigned char code moon_date[48]={
10,10,10,10,10,10,10,10,10,10,10,10,49,50,10,10,10,10,51,52,10,10,10,10,10,10,10,10,10,10,10,10, 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, }; unsigned char code init_date[]={
10,10,10,10,10,10,10,10, 2,0, 1,2, 49,50, 0,1, 51,52, 0,1, 53,54, 10, 55,56,57,58, 53,54, 10, 0,0, 11, 0,0, 11, 0,0, 10, 10,10,10,12,10,13,14,10,10,10,10,10,10,10,10, }; unsigned char code week_data[]={0,25,27,29,31,33,35,53}; //一二三四五六日 void delay_nms(unsigned int count);
void Timer_init(void); void time_to_buff_all(void); void update_buff(void);
void key_scan(void); void display(unsigned char mode); void shutter_clock(void); void io_init() {P0M0 = 0xff; // 推挽输出 P0M1 = 0x00; P3M0 = P3M0|0x38; //0011 1000 推挽输出 } void main(void)
17
2015届电子信息科学与技术专业学士学位毕业论文(设计)
{ io_init(); Initial_DS1302(); //初始化 time_to_buff_all(); //读取全部时间 ReadTemperature(&date,39); //读取温度 Timer_init(); while(1){
update_buff(); for(disrow=0;disrow<16;disrow++) //disrow,当前扫描的行 { display(disp_mode); OE=1; //关显示屏 L_STB=1; L_STB=0; set_row(disrow);//行138的输出.依次点亮1~16行. OE=0; //开显示屏 delay_nms(30); } if(stop_counter>stop_time) {disp_mode=0; offset++;stop_counter=0; stop_bit=0;} if(stop_bit==0) offset++; if(disp_mode==1) { if(f1<200) f1++; if(f2<200) f2++; if(f3<200) f3++;
if(f4<200) f4++; if(f5<200) f5++; if(f6<200) f6++; }
if(nongli_flag==0) key_scan(); } }
void Timer_init(void) { EA=0; ET0=1; //开定时器中断 TMOD=0x01; //定时器0模式1 TL0 = 0x00; TH0 = 0x4C; //设置定时初值 //25MS 22.1184M TR0=1; //开定时器运行 EA=1; }
void T0_ISR(void) interrupt 1 using 3 //定时器中断 { TL0 = 0x00; //设置定时初值 //25MS 22.1184M TH0 = 0x4C; //设置定时初值 t_counter++; if(t_counter==20) half_sec_flag=1;
if(t_counter==40) {t_counter=0;one_sec_flag=1;} if(stop_bit==1) stop_counter++;
if(ka!=0) { ka--;if(ka==0 && key_add==0) add_flag=1; }else if(key_add==0)ka=KEY_VAL; if(kb!=0) { kb--; if(kb==0 && key_dec==0) dec_flag=1; }else if(key_dec==0)kb=KEY_VAL; if(kc!=0) {kc--; if(kc==0 && key_adj==0) adj_flag=1; } else if(key_adj==0)kc=KEY_VAL; if(kd!=0) {kd--; if(kd==0 && key_esc==0) esc_flag=1; } else if(key_esc==0)kd=KEY_VAL; }
void update_buff(void){ unsigned char i; if(nongli_change_flag==1) { if(nongli_flag==1)
{ for(i=0;i<46;i++) date[i]=moon_date[i]; DS1302_GetTime_ALL(&CurrentTime); date[8]= 59; date[9]= 60; date[10]=61; date[11]=62; //电信 date[12]=63; date[13]=64; date[14]=65; date[15]=66;//一班 date[16]=10; //空格 date[17]=67;date[18]=68; date[19]=69; date[20]=70; date[21]=71; date[22]=72; //付文星 date[23]=10; //空格 date[24]=73; date[25]=74; date[26]=75; date[27]=76; //毕业 date[28]=77; date[29]=78; date[30]=79; date[31]=80; //设计}
18
2015届电子信息科学与技术专业学士学位毕业论文(设计)
else { for(i=0;i<48;i++) date[i]=init_date[i]; time_to_buff_all(); } } if(half_sec_flag==1) { half_sec_flag=0; time_to_buff_all(); switch(status){ case 0: break; case 1: date[10]=15,date[11]=15; break; case 2: date[14]=15,date[15]=15; break; case 3: date[18]=15,date[19]=15; break; case 4: date[27]=15,date[28]=15; break; case 5: date[30]=15,date[31]=15; break; case 6: date[33]=15,date[34]=15; break; case 7: date[36]=15,date[37]=15; break; default: break; } } if(one_sec_flag==1) {one_sec_flag=0; if(disp_mode==8||k==0) ReadTemperature(&date,39); date[32]=11; date[35]=11; time_to_buff_all(); } }
void display(unsigned char mode) { unsigned char i; //送显示数据 switch(mode) { case 0:if(switch_flag==1) {k=0;switch_flag=0;} //流动暂停显示 for(i=0;i<8;i++)SendByte(a[date[k+i]][disrow]); Send2Byte(a[date[k+8]][disrow],offset); if(offset==8) { offset=0;k++; if(k==30&&nongli_flag==0) {stop_bit=1,stop_time=900,disp_mode=1;} if(k==39&&nongli_flag==0) {stop_bit=1,stop_time=120;} //温度停一下。 if(k>45&&nongli_flag==0) {k=0; nongli_flag=~nongli_flag; nongli_change_flag=1; } if(k>24&&festival_flag==0&&nongli_flag==1)
{ k=0; nongli_flag=~nongli_flag; nongli_change_flag=1; } else if(k>30&&festival_flag==1&&nongli_flag==1) { k=0; nongli_flag=~nongli_flag; nongli_change_flag=1; } } break;
case 7: //全部流动显示 if(switch_flag==1) {k=0;switch_flag=0;} for(i=0;i<8;i++)SendByte(a[date[k+i]][disrow]); Send2Byte(a[date[k+8]][disrow],offset); if(offset==8) { offset=0;k++; if(nongli_flag==0&&k>45) {k=0; nongli_flag=~nongli_flag; nongli_change_flag=1; } if(k>24&&festival_flag==0&&nongli_flag==1)
{ k=0; nongli_flag=~nongli_flag; nongli_change_flag=1; } else if(k>30&&festival_flag==1&&nongli_flag==1) { k=0; nongli_flag=~nongli_flag; nongli_change_flag=1; } } break;
case 8: //固定显示温度
for(i=0;i<8;i++) SendByte(a[date[39+i]][disrow]); break; case 1: shutter_clock(); break; //翻页钟显示 case 2: //显示时间 if(switch_flag==1) {/*k=23;*/switch_flag=0;} if(k<30){for(i=0;i<8;i++) //送往8个4094的数据. SendByte(a[date[k+i]][disrow]); Send2Byte(a[date[k+8]][disrow],offset); if(offset==8) {offset=0;k++;} } if(k==30) {for(i=0;i<8;i++) SendByte(a[date[30+i]][disrow]); } break;
19
2015届电子信息科学与技术专业学士学位毕业论文(设计)
case 3: //显示年 if(switch_flag==1) {k=0;switch_flag=0;} if(k<10) {for(i=0;i<8;i++) //送往8个4094的数据. SendByte(a[date[k+i]][disrow]); Send2Byte(a[date[k+8]][disrow],offset); if(offset==8) {offset=0;k++;} } if(k==10) { for(i=0;i<8;i++) SendByte(a[date[10+i]][disrow]); } break; case 4: //显示月 if(switch_flag==1) {k=10;switch_flag=0;} if(k<14) {for(i=0;i<8;i++) //送往8个4094的数据. SendByte(a[date[k+i]][disrow]); Send2Byte(a[date[k+8]][disrow],offset); if(offset==8) {offset=0;k++;} } if(k==14) {for(i=0;i<8;i++) SendByte(a[date[14+i]][disrow]); } break; case 5: //显示日 if(switch_flag==1) {k=14;switch_flag=0;} if(k<18) {for(i=0;i<8;i++)SendByte(a[date[k+i]][disrow]);Send2Byte(a[date[k+8]][disrow],offset); if(offset==8) {offset=0;k++;} } if(k==18) {for(i=0;i<8;i++) SendByte(a[date[18+i]][disrow]); }break; case 6: //显示星期 if(switch_flag==1) {k=18;switch_flag=0;} if(k<23) {for(i=0;i<8;i++)SendByte(a[date[k+i]][disrow]); Send2Byte(a[date[k+8]][disrow],offset); if(offset==8) {offset=0;k++;} } if(k==23) {for(i=0;i<8;i++)SendByte(a[date[23+i]][disrow]); }break; default: break; } }
void shutter_clock(void) { if(date[30]!=temp_time[0]) f1=0; //时十位 if(f1<17) { if(date[30]==0) SendByte(a[17][disrow+f1]); else SendByte(a[date[30]-1][disrow+f1]); } else SendByte(a[date[30]][disrow]); if(date[31]!=temp_time[1]) f2=0; //时个位 if(f2<17) { if(date[31]==0) SendByte(a[19][disrow+f2]); else SendByte(a[date[31]-1][disrow+f2]); } else SendByte(a[date[31]][disrow]); SendByte(a[date[32]][disrow]); //冒号 if(date[33]!=temp_time[2]) f3=0; //分十位 if(f3<17) { if(date[33]==0) SendByte(a[21][disrow+f3]); else SendByte(a[date[33]-1][disrow+f3]); } else SendByte(a[date[33]][disrow]); if(date[34]!=temp_time[3]) f4=0; //分个位 if(f4<17) { if(date[34]==0) SendByte(a[23][disrow+f4]); else SendByte(a[date[34]-1][disrow+f4]); }
20
2015届电子信息科学与技术专业学士学位毕业论文(设计)
else SendByte(a[date[34]][disrow]); SendByte(a[date[35]][disrow]); //冒号 if(date[36]!=temp_time[4]) f5=0; //秒十位 if(f5<17) { if(date[36]==0) SendByte(a[21][disrow+f5]); else SendByte(a[date[36]-1][disrow+f5]); } else SendByte(a[date[36]][disrow]); if(date[37]!=temp_time[5]) f6=0; //秒个位 if(f6<17) { if(date[37]==0) SendByte(a[23][disrow+f6]); else SendByte(a[date[37]-1][disrow+f6]); } else SendByte(a[date[37]][disrow]); }
void delay_nms(unsigned int count){ //软件延时 unsigned int i,j; for(i=0;i void time_to_buff_all(void) { DS1302_GetTime_ALL(&CurrentTime); //读取全部时间 temp_time[0]=date[30]; temp_time[1]=date[31]; temp_time[2]=date[33]; temp_time[3]=date[34]; temp_time[4]=date[36]; temp_time[5]=date[37]; date[30]=CurrentTime.Hour/10; date[31]=CurrentTime.Hour; //小时 date[33]=CurrentTime.Minute/10; date[34]=CurrentTime.Minute; //分钟 date[36]=CurrentTime.Second/10; date[37]=CurrentTime.Second; //秒 date[10]=CurrentTime.Year/10; date[11]=CurrentTime.Year; //年 date[14]=CurrentTime.Month/10; date[15]=CurrentTime.Month; //月 date[18]=CurrentTime.Day/10; date[19]=CurrentTime.Day; //日 date[27]=week_data[CurrentTime.Week];date[28]=week_data[CurrentTime.Week]+1;//星期 } void key_scan(void) { //扫描按键 static unsigned char mode_counter=0; if(adj_flag==1) { adj_flag=0; stop_bit=0; offset=0; switch_flag=1; status++; if(status>7) status=1; time_to_buff_all(); } if(esc_flag==1) { esc_flag=0; stop_bit=0; disp_mode=0; //退出时方式为流动显示 k=0; offset=0; status=0; time_to_buff_all(); } switch(status) { case 0: //显示模式调整 if(add_flag==1) { add_flag=0; stop_bit=0; offset=0; switch_flag=1; mode_counter++; if(mode_counter>3) mode_counter=0; disp_mode=mode[mode_counter]; }break; case 1: //年调整 disp_mode=3; if(add_flag==1) { add_flag=0; CurrentTime.Year++; if(CurrentTime.Year>99) CurrentTime.Year=0; DS1302_SetTime(DS1302_YEAR,(CurrentTime.Year)); } if(dec_flag==1) { dec_flag=0; if(CurrentTime.Year>0) CurrentTime.Year--; if(CurrentTime.Year==0) CurrentTime.Year=99; DS1302_SetTime(DS1302_YEAR,(CurrentTime.Year)); }break; case 2: //月调整 disp_mode=4; if(add_flag==1) { add_flag=0; CurrentTime.Month++; if(CurrentTime.Month>12) CurrentTime.Month=1; DS1302_SetTime(DS1302_MONTH,(CurrentTime.Month)); } 21 2015届电子信息科学与技术专业学士学位毕业论文(设计) if(dec_flag==1) { dec_flag=0; if(CurrentTime.Month>0) CurrentTime.Month--; if(CurrentTime.Month==0) CurrentTime.Month=12; DS1302_SetTime(DS1302_MONTH,(CurrentTime.Month)); } break; case 3: //日调整 disp_mode=5; if(add_flag==1) {add_flag=0; CurrentTime.Day++; if(CurrentTime.Day>31) CurrentTime.Day=1; DS1302_SetTime(DS1302_DAY,(CurrentTime.Day)); } if(dec_flag==1) { dec_flag=0; if(CurrentTime.Day>0) CurrentTime.Day--; if(CurrentTime.Day==0) CurrentTime.Day=31; DS1302_SetTime(DS1302_DAY,(CurrentTime.Day)); } break; case 4: //星期调整 disp_mode=6; if(add_flag==1){add_flag=0; CurrentTime.Week++; if(CurrentTime.Week>7) CurrentTime.Week=1; DS1302_SetTime(DS1302_WEEK,(CurrentTime.Week)); } if(dec_flag==1) {dec_flag=0; if(CurrentTime.Week>1) CurrentTime.Week--; if(CurrentTime.Week==1) CurrentTime.Week=7; DS1302_SetTime(DS1302_WEEK,(CurrentTime.Week)); } break; case 5: //小时调整 disp_mode=2; if(add_flag==1) {add_flag=0; CurrentTime.Hour++; if(CurrentTime.Hour>23)CurrentTime.Hour=0; DS1302_SetTime(DS1302_HOUR,(CurrentTime.Hour));} if(dec_flag==1) { dec_flag=0; if(CurrentTime.Hour>0) CurrentTime.Hour--; if(CurrentTime.Hour==0) CurrentTime.Hour=23; DS1302_SetTime(DS1302_HOUR,(CurrentTime.Hour)); } break; case 6: //分钟调整 disp_mode=2; if(add_flag==1) {add_flag=0; CurrentTime.Minute++;if(CurrentTime.Minute>59) CurrentTime.Minute=0; DS1302_SetTime(DS1302_MINUTE,(CurrentTime.Minute)); } if(dec_flag==1) { dec_flag=0; if(CurrentTime.Minute>0) CurrentTime.Minute--; if(CurrentTime.Minute==0) CurrentTime.Minute=59; DS1302_SetTime(DS1302_MINUTE,(CurrentTime.Minute)); } break; case 7: //秒调整 disp_mode=2; if(add_flag==1){ add_flag=0;CurrentTime.Second++;if(CurrentTime.Second>59)CurrentTime.Second=0; DS1302_SetTime(DS1302_SECOND,(CurrentTime.Second)); } if(dec_flag==1){ dec_flag=0; if(CurrentTime.Second>0) CurrentTime.Second--; if(CurrentTime.Second==0) CurrentTime.Second=59; DS1302_SetTime(DS1302_SECOND,(CurrentTime.Second)); }break; default: break; } } 22