基于C51单片机的LED点阵显示屏的设计Word格式.docx
《基于C51单片机的LED点阵显示屏的设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于C51单片机的LED点阵显示屏的设计Word格式.docx(30页珍藏版)》请在冰豆网上搜索。
其中图文屏可以显示单色或者彩色的简单图形、文字,广泛应用在医院、火车站、学校教学楼、小型门店等场所;
视频显示屏通过上位机控制,能实时的显示视频、实况转播等,多用在足球场、大型会客厅等场所。
而且,不同尺寸规格和亮度的LED为室内和室外信息显示提供了多种选择。
LED之所以收到广泛的欢迎和应用,跟它的多项优点是分不开的。
其概括起来主要是:
成本低、体积小、亮度高、设计简单、需要电压低、功耗小、耐冲击、稳定、寿命长。
现在LED正在向着更小体积、更大点阵密度、更多色彩和更小成本发展。
由于LED技术的快速发展,有很多已经超出在校生所接触到的知识范围,所以本设计旨在利用最简单主要的单色屏显示演示LED屏的工作过程和原理,并实现其显示内容的滚动效果。
可以通过更改程序中的点阵字库来改变所需要显示的内容。
且该设计具有较好的扩展性,要使其能同时显示更多的内容,只需要再接通上相应数量的点阵屏模块即可。
还可以通过修改烧录在单片机ROM的程序内容来实现更多的动态效果如缩放、文字切入等。
1.2LED的现状和发展趋势
自从1907年H·
j·
Round发现了金刚砂通电之后可以出现发光的现象[1],并继此由后人发明了发光二极管,已经过去了一个多世纪。
一个多世纪以来,LED技术得到了很大的发展。
早先的LED是单个的发光管,结构比较简单。
通过单向导电的方式点亮发光。
它由阳极脚
(1)、阴极脚
(2)、内部芯片(3)和环氧树脂保护外壳组成。
外壳不仅可以起到保护芯片的作用,还可以透光聚光,使LED显示效果更强。
早期LED外形如图1.1所示。
图1.1发光二极管(LED)外形图
随着科技的发展,人们已经不能满足于只能简单用作电源通断指示、普通照明用的发光二极管。
随着要求的不断升高,更直接更方便的LED显示期间应运而生。
如共阴极数码管、电平管、字符管等的外形虽然各不相同,他们的根本原理是相同的,即通过排列不同形状不同颜色的LED,用电路控制不同的点亮方式显示内容。
从此,LED产品的应用更加广泛。
不论是出租车计价器,投票计数牌、昂贵仪器的显示面板,都可以看到它们的身影。
LED点阵通过将一定数量的发光二极管通过矩阵的形式排列在一起,用类似我们现在的液晶显示器的显示方式显示一定像素内字符或图片。
常见的点阵数量有5×
7、4×
4、8×
8、16×
16等,可以通过排列组成更大的点阵。
因为采用不同颜色的外壳和制作材料,LED点阵可以显示多种颜色,常见的有红色、蓝色、绿色。
通过不同颜色的通断、灰度搭配,可以显示几乎所有我们常见的颜色。
这也是近些年来LED被广泛运用的原因之一。
相信在未来,LED照明和现实技术将会得到更大的进步和发展,继而有取代常规大功耗室外现实设备的趋势。
2硬件总体设计
2.1主要设计框图及思路
本设计主要硬件电路框图如图2.1所示。
图2.1硬件电路框图
电路主要可以分为通信、电源、驱动、控制四个部分。
其中通信口负责从上位机与单片机进行数据传输;
电源负责给整个电路供电;
驱动分为行驱动和列驱动,LED点阵的每一个同名行都有一个行驱动电路,通过逐行扫描的方式动态产生低电平,行驱动芯片一般由译码器担当;
列驱动电路通过对字库数据进行锁存、在需要燃亮的列上产生一个高电平,与行驱动产生的低电平形成一个电流通路,使LED发光。
2.2所需要芯片及各芯片功能介绍
现将实现本电路所需要的主要芯片及起到作用列举,如表2-1所示:
表2.1电路中所需要的芯片
器件名称
在电路中起到的作用
所需要的数量
STC89C51
主要器件,控制整个电路
1
红色Φ3mmLED点阵
显示模块
8
74LS154
行驱动芯片
74HC595
列驱动芯片
4
MAX232
通信控制
24C256
数据存储
2.2.1各主要芯片简单介绍
①STC89C52[2]
89C52单片机提供以下标准功能:
内部8KB的闪存空间,256字节的内部RAM,32
个输入输出口,3个16位定时计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
其芯片结构如图2.2所示:
图2.289C52的引脚图
②LED点阵
本设计采用的是红色Φ3mmLED8×
8点阵,其内部原理是64个红色发光二极管8行8列分布,并将同名行的行引脚和同名列的列引脚依次相连(如图2.3-a所示),通过在行脚加上一个低电压、列脚接入一个+5V电压而引燃交叉点上的LED(如图2.3-b所示)。
ab
图2.3LED点阵内部构造及点亮原理
以单色8×
8LED点阵为例,背面16条引脚的排列顺序是如图2.3-b所示的。
其中引脚上字母a-h依次表示8行的行引脚,引脚上数字1-8依次表示的是从右往左数的8列的列引脚。
在使用之前,需要用万用表提前测试好引脚的行列分布。
若想自行扩充LED点阵的数量,只需准备若干个相同点阵屏,将所有屏的同名行依次连接、所有同名列依次连接。
连接方法如图2.4所示(注:
在此处为了连接方便,定义图中LED点阵的左手边引脚从上往下依次是1-8行,右手边引脚从上往下依次是1-8列):
图2.4扩展LED数量的接法
③74LS154
74LS154是4线-12线译码器,其引脚图如图2.5所示:
图2.574LS154的引脚图
当其选通端G1和G2均为低电平的时候,可以将地址端A、B、C、D数据的二进制编码在某一个输出端以低电平译出。
如:
当G1和G2均为低电平,A、B、C、D口的二进制编码为0101(译为十进制为5)时,输出口5将为低电平,其他输出口为高。
④75HC595
74HC595是8位串行输入、并行输出或并行输出移位寄存器,具有高阻态、关断状态。
其中,脚QA-QH为八位并行输出端,可以将芯片寄存器中的数据并行输出,用来控制数码管的8个端口;
QH'
为级联输出端,用来接下一个595芯片的输入;
SI是串行数据输入段,用来接收串行数据;
/SRCLR的作用是低电平时清空移位寄存器的数据,一般接VCC;
SRCK脚在上升沿的时候将数据寄存器中的数据移位,可以用来实现LED显示内容的滚动;
RCK脚为上升沿时将移位寄存器的数据给数据存储寄存器,可以用来更新需要显示的数据。
595芯片的引脚图如图2.6所示:
图2.674HC595的引脚图
⑤MAX232
MAX232是通信电路的主要部分。
其芯片主要分为三部分,第一部分是电荷泵电路,有1-6脚和4只电路组成。
其功能是产生+12V和-12V两个电源,提供给串口电平;
第二部分是数据转换,由7-13脚构成两个数据通道。
其中11-14脚为第一数据通道,7-10脚为第二数据通道,TTL/CMOS数据从T1IN、T2IN输入转换成RS232数据从T1OUT、T2OUT送到DB9插头,DB9插头的RS232数据从R1IN、R2IN转换成TTL/CMOS数据后从R1OUT、R2OUT输出;
第三部分是由15-16脚组成的供电部分。
其引脚图如图2.7所示:
图2.7MAX232引脚图
⑥24C256
24C256为EEPROM串行CMOS芯片。
其A0、A1、A2口为器件选择地址,SDA口为串行数据地址,SCL口为串行时钟地址,WP为写保护。
单片机89C51通过读SDA和SCL脚读取24C256中的内容,并将其显示于LED显示屏上。
也可以通过PC机将编辑好的数据内容下载到24C256芯片内。
其引脚图如图2.8所示:
图2.824C256引脚图
2.3各模块电路图设计及原理
此设计的电路图可以分为LED驱动电路、通信电路和数据存储电路。
其中,行驱动电路如图2.9-a所示,通过单片机的P20-P23口输出递增数据,对74LS154进行控制,使其16个输出口可以依次输出低电平,对连接的LED进行逐行扫描。
154的使能端之一G1接单片机的P2.7,如果需要对显示进行“消隐”只需拉高P2.7即可,可以防止LED点阵在显示的时候出现“鬼影”现象。
列驱动电路如图2.9-b所示,74HC595的串行数据输入端(SI)接单片机的RXD,数据移位端(SRCK)接单片机的TXD口,当单片机串口以方式0输出时,可以将数据输入到595芯片的锁存器中。
其主要流程是:
首先将为数据送到单片机的RXD,在TXD上产生一个上升沿,595中原有的数据进行移位,高位依次左移,并空出寄存器的最低位并接收RXD上的为数据。
595的RCK接单片机的P1.6口,当需要将595中的数据锁存显示的时候,只需要将P1.6拉高。
图2.9驱动电路
通信电路由MAX232组成,单片机的串口通过MAX232将TTL电平转换成EAI适合的电平[3],实现了单片机和PC机之间的通信。
其原理图如图2.10所示:
图2.10MAX232组成的通信电路
存储电路主要由24C256组成,可以用SDA口进行双向数据传送,可以传送、接受地址和所有数据。
单片机89C51通过读SDA和SCL脚读取24C256中的内容,并将其传送给列驱动的锁存器,继而显示于LED显示屏上。
其原理图如图2.11所示:
图2.11数据存储电路
2.4系统的软件设计
2.4.1Keil·
uVERSION、protues介绍
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统[4],配合英国Labcenterelectronics公司出版的Proteus,它们可以帮助人们实时的仿真一些以前需要通过硬件才能实现的程序和电路,大大方便了开发者的工作。
在proteus里,可以通过添加硬件芯片和对其引脚进行连线来制作仿真电路,而且它与现实中制作的电路有相同的仿真效果,通过一些仪表、屏幕,可以直观的观察到电路运行结果。
从事单片机系统开发者还可以在keil中新建工程编制程序,用它将程序编译成机器语言,配合proteus实现更多的工作和更好的效果。
2.4.2动态扫描及取字库原理
在该设计中,采用了动态行扫描的方式来点亮LED点阵。
LED点阵并不能同时点亮多行,但是为了显示出同时点亮一整个屏幕的效果,我们就需要对其进行“扫描”。
我们以“赵”字为例,当154选通点阵的第一行的时候,4块8×
8点阵中左上角块第一行只有第三个点是燃亮的(从右往左),那么这一行的行数据就是“00100000”,转换成十六进制就是08H;
右上角的点阵第一行没有亮点,即行数据为“00000000”,转换成十六进制为00H。
在显示这一行的时候,单片机同时向595芯片的数据寄存器中输送串行数据以节省时间。
然后154的G1脚拉高进行消隐,即熄灭所有的LED。
完成消隐之后595芯片数据寄存器中的数据移入输出寄存器,同时154的G1口拉底、输出变为第二行,燃亮LED点阵第二行的数据。
同上可以得到,“赵”字第二行的数据为08H,08H。
当十六行全部扫描完毕,“赵”字的第一帧也显示完。
这整个过程耗时很少,由于人眼睛视觉暂留的现象,会感到“赵”字的每一行是同时点亮的。
同时我们可以通过上述方法得到“赵”字字库的所有数据即:
08H,00H,08H,08H,08H,88H,7EH,88H,08H,50H,0AH,50H,FFH,20H,08H,20H,
28H,50H,2EH,48H,28H,8CH,39H,04H,48H,00H,44H,06H,83H,FCH,00H,00H
此整个显示流程用框图表示如图2.12所示:
图2.12程序流程图
3详细设计
3.1电路详细设计
该设计的详细电路图如图3.1所示。
其中,部分1为单片机最小系统,部分2为行驱动电路,部分3为列驱动电路,部分4为LED显示模块。
图3.1详细电路设计
①单片机最小系统
单片机最小系统由复位电路、晶振电路以及I/O接口电路组成。
其中,复位通常有两种方式实现:
开机上电复位和手动复位。
本设计采用的是开机上电复位。
手动复位设计有一个复位按键,其原理图如图3.2所示:
图3.2单片机手动复位电路
STC89C52的工作电压时+5V,其EA引脚需要接通Vcc。
5V供电电路图如图3.3所示:
图3.3单片机5V电源接线图
②行驱动电路详细介绍。
在实际的电路焊接中,跟用软件仿真其实是有一定的差别的。
在仿真中,定义好了引脚的电平高低,输出就一定是稳定的+5V或者是0V。
但是在实际的电路中,会存在导线电阻、电压不稳定等等一系列的不确定因素,所以在电路的设计和焊接过程中就需要注意这些问题。
比如74LS154芯片的输出,即使译出之后的结果是只有一个引脚是0V,其他的是Vcc,但也总会出现本该是Vcc的引脚却是有2.3V左右的电压的情况。
这种情况将导致在高电平的引脚仍会跟列线产生一个电压差,虽然这个电压压降不足5V,但是也足以点亮交叉点上的LED,产生“灰度”点亮的状况。
在实际应用中非常影响设计结果的美观性。
所以就要在每一行引脚后面加一个NPN的三极管起到放大和稳定电压的作用。
也且,不管行引脚和列引脚,都要增加限流电阻以保证电路的安全稳定。
实际电路中的行驱动如图3.4所示:
图3.4实际电路图中的行驱动
③列驱动电路
同行驱动电路一样,列驱动电路在实际中也是需要加限流电阻来保证稳定的。
其电路如图3.5所示:
图3.5列驱动电路的限流电阻
④、LED点阵显示模块
在本论文的第二部分已经简单介绍过LED动态扫描的原理。
LED点阵扫描的方式有两种:
(1)竖直方向扫描,即如第二部分所描述的那样,用一个P口输出的低电平的行码决定哪一行能亮,另一个P口则负责输出高电平的行码。
能点亮的行从上到下扫描完16行,显示完一个完整的图像或字符。
(2)水平方向扫描,即逐列扫描方式,与竖直方向扫描相反,由一个P口输出高电平的列码决定哪一列可以点亮,然后由另一个P口输出低电平的行码用以点亮该列的相应点。
逐一扫描完16列,显示完整内容。
不论哪一种扫描方式,其主要原理都是相同的:
即一个负责一次选择点亮行(列),另一个输入此行(列)的字库数据。
以列扫描方式为例,完整扫描一个字的过程如图3.6所示:
图3.6点阵列扫描示例
由这个原理可以知道,无论是需要显示何种文字或者图形,只要是在点阵的像素之内都是可以实现的。
如果字模完全是由人工计算的话是一个很浩大的工程。
那么了解了显示原理之后如何简单得到汉字的字模信息呢?
现在有很多现成的字模提取软件,可以免费从网上下载使用。
如图3.7所示就是一款多功能的字模生成软件,打开软件之后直接输入汉字,选择好扫描方式和汉字显示方向、字体之后,点击“检取”就可以得到字模数据,把我们需要的数据复制到代码中即可。
图3.7检取字模用的软件
4程序实现
4.1主要显示程序原理及实现
4.1.1动态行扫描程序框图
本设计采用动态行扫描的方式,通过74LS154进行行数据的输送,74HC595进行列数据(即字库数据)的并行输出。
其主要原理图如图4.1所示:
图4.1动态行扫描框图
动态行扫描代码分析:
MOVR5,#16;
//一共需要扫描16行
MOVOFFSET,#00H;
//数据指针偏移量清0
MA1:
CALLTAKE;
//调用子程序,用来取数
SETBEN;
//拉高G1口,关显示
DECp1;
//将行值自加一
CLRRCK;
SETBRCK;
//将595寄存器内容给锁存器
CLREN;
//开显示
DJNZR5,MA1;
//如果没有显示完16行,则继续显示
DJNZSPEED,MAIN
TAKE子程序分析
MOVR7,#9;
//取出半角字数据的个数
MOVR0,#D_F;
//数据缓冲区首地址存入R0
PUSHDPH
PUSHDPL;
//数据保护
MOVA,OFFSET;
//将查表偏移给寄存器A
QUSH1:
ADDA,DPL
MOVDPL,A
MOVA,DPH
ADDCA,#00H
MOVDPH,A
CLRA
MOVCA,@A+DPTR;
//查表取数
MOV@R0,A;
//存储数据
INCR0;
//修改地址指针
MOVA,#16;
//修改查表偏移量
DJNZR7,QUSH1;
//数据未取完继续
POPDPL
POPDPH
INCOFFSET;
查表偏移量+1
4.1.2实现显示内容的左滚动原理
由于屏幕尺寸的限制,此屏幕能够同时显示的内容十分有限。
要使其在有限的屏幕内显示更多的信息,就需要信息的滚动显示。
该设计实用的是内容左滚动方式。
其实现原理框图如图4.2所示:
图4.2显示内容左移程序实现
显示内容左移程序的原理是:
设定程序的起始地址是00H,并定义F初始值为0,以准备选择点阵扫描出口。
定义了查表偏移量A,设为00H的初始位置,再下面的74LS154扫描指针的初值设为00H,从第1个拐角开始扫描,即第0行。
从M3开始程序的循环,因为F的初值是0,所以先从P1口输出扫描信号。
扫描信号输出后,取码指针先去的第一个码送到点阵的上半部分,打开上部分点阵的74LS595锁存器关闭下面部分74LS595锁存器,使点阵的上半部分点亮。
然后指针自加一,将上下点阵开关轮换,即打开下面的595锁存器,关闭上面的595锁存器。
取相邻的码送到点阵的下半部分,紧挨着的延时程序是设定每列扫描的时间:
MOVR3,#50;
DJNZR3,$;
延时时间为:
1+(2*50)=101us≈0.1ms
再下面的一行代码:
“DJNZR6,M3;
”由此循环可以计算出显示一个一整屏的时间为:
0.1ms*16=1.1ms,再下面的“DJNZR1,M2;
”规定了每个屏幕的停留时间也即字符间隔多长时间向左移动一列,由此循环可以计算出此时间为:
0.1ms*16*65=104ms=0.1s。
每当显示内容向左移动一位,取字库的指针自动加2去找寻下一段字库代码,。
最后的部分代码:
XRLA,#128;
NZM1;
CPLF0;
JMPSTART;
此段代码的意思是:
在所有的显示内容全部左移完毕之后,再从第一个显示内容开始重新移动。
在此设计中用到了4个全角字符,一共128个字库段,查表偏移量从0开始,每次加2,到128时循环结束,改变F的状态,跳到程序的最上面开始部分,重新移动自负。
在本论文的之前已经提到过,本设计具有可扩展性。
可以增加代码中的字库数量来增加需要显示的内容,需要的只是将字库内容拷贝到本程序的字库表中,并改变程序中相应字库数量的变量和较少其他内容。
此程序最终的显示效果应该是:
开始停0.1秒,从右边进入汉字,并缓缓向左移动,移动的速度为每0.1秒一下。
在主程序的开始的延时作为一次移动的末尾时到开始下一次重复移动开始之间的停顿,和字符移动的时间间隔相同,保持了移动的平稳连贯性。
依此循环
4.1.3单片机延时子程序
延时程序在单片机中的应用十分广泛且至关重要。
本程序中用到了延时子程序。
在弄清楚延时程序的用法之前需要了解其原理,以及机器周期和指令周期的区别、联系等。
(1)机器周期是指的单片机完成一个基本的操作所需要的时间,一般用微妙级来计算。
52单片机的一个机器周期包括了12个时钟振荡周期,也就是说如果52单片机采用的是12MHz的晶振,那么执行一个机器周期就需要1uS;
如果采用的是24MHz的晶振,那么执行一个机器周期就需要0.5uS。
(2)指令周期指的是单片机执行一条指令所需要的时间,一般知道一条指令需要多少个机器周期之后利用机器周期来计算指令周期。
在52单片机中有单周期指令(即执行这条指令需要一个机器周期)、双周期指令(即执行这条指令需要两个机器周期)、四周期指令等。
除了乘法和除法两条指令为4周期指令之外,其他的一般都为单周期或双周期指令。
也就是说,如果52单片机采用的是12MHz的晶振,那么它执行一条指令一般就需要1~2微妙的时间。
(3)时钟周期也叫震荡周期,指的是晶振震荡一次所需要的时间,此时间是晶振参数的倒数。
单片机中并没有严格意义上真正的延时指令。
从上面所介绍的可以知道,单片机每执行一个指令就需要一定的时间。
所以想要达到延时的效果,只需要让单片机不断执行一些没有实际意义的指令就可