项目2点阵LED电子显示屏的设计2教材.docx
- 文档编号:11355975
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:34
- 大小:692.84KB
项目2点阵LED电子显示屏的设计2教材.docx
《项目2点阵LED电子显示屏的设计2教材.docx》由会员分享,可在线阅读,更多相关《项目2点阵LED电子显示屏的设计2教材.docx(34页珍藏版)》请在冰点文库上搜索。
项目2点阵LED电子显示屏的设计2教材
项目2点阵LED电子显示屏的设计
2.1项目描述
本模块的主要内容是:
运用汉字点阵显示技术、LED点阵显示器件等设计出一个具有一定实用价值的32*16点LED电子显示屏。
该系统可实中英文字符信息显示,可用在公共场合做流动信息显示。
该系统应用了点阵扫描显示的原理,以美国ATMEL公司AT89S51单片机为控制芯片,采用“Proteus+KeilC”对LED电子显示屏进行了仿真,仿真结果表明:
该系统能达到预期的性能要求,证明采用软硬件结合,利用单片机设计LED电子显示屏的方法是可行的。
通过该项目的学习与实践,可以让读者获得如下知识和技能:
学习LED点阵器件接口技术;
学习汉字点阵字模提取技术;
学习LED点阵扫描显示工作原理和应用方法;
培养学生运用C51编写显示屏动态显示的能力;
2.2知识准备
要完成出以上要求的LED点阵显示屏的设计,需要具备以下一些相关的知识和技能,下面进行阐述。
2.2.1单片机输入输出端口
单片机对数据有着灵活、强大的运算处理能力,但有些数据需要从外部输入进来,并且有一些数据处理好之后,要送到外部控制相应器件动作。
例如,按键与指示电路,没键按下时是高电平,当有键按下时,会向单片机发出低电平信号,单片机接收到之后,向指示电路发出亮灯电平。
这样,单片机就用到了对外的基本接口,也就是单片机输入输出(I/O)口。
1、I/O端口硬件结构
AT89S51单片机有四组I/O口,每组为8位,即一个字节,它们分别是P0,P1,P2,P3口。
由于精简单片机的引脚,P0,P2,P3的引脚为功能复用或第二功能引脚。
各接口的配置情况如图2.1所示。
(a)P0端口中的一位(b)P1端口中的一位
(c)P2端口中的一位(d)P3端口中的一位
图2.1单片机端口内电路
上图中可以看出,四个I/O都是双向口,既可以做输出,又可以做输入。
其中,P1、P2、P3口有内部上拉,做为输入输出时可以直接使用。
P0和P2可以通过内部控制信号去转换开关,使P0和P2切换成地址/数据的访问外部空间模式。
P0做普通I/O口使用时,为漏极开路输出,需在外部接上拉电路以便产生高电平。
P0口做数据/地址功能使用时,为推挽式输出。
P0在输出地址时间段里,输出的是低8位地址,高8位地址由P2口输出。
如果P3口内的锁存器已经写入‘1’,那么P3还可启用复用功能。
P3的复用功能如表3.1所示。
表2.1P3口复用功能
端口引脚
复用功能
(串行接收接口)
(串行发送接口)
(外部中断0)
(外部中断1)
(定时/计数器0外部输入口)
(定时/计数器1外部输入口)
(访问外部空间时写信号)
(访问外部空间时读信号)
2、各I/O端口的访问
P0~P3口在芯片内的地址处于内部特殊寄存器段中,其具体地址如分别为80h,90h,a0h,b0h。
(1)基本输入输出
各端口做普通I/O进行数据输入,需先给相应的I/O端口写入数据“1”,然后才能正常读取外线路引进的电平。
对于P0口,还需要接外部上拉。
否则,有可能读不到正确的电平信号。
例如,将P2.0的引脚电平读到位变量x0中
bitx0;//定义一个位变量
P2=P2|1;//将P2.0置1,其它位数据不变
x0=0;//假设P2.0的电平为低电平,x0记为0
if(P2&1)//读P2口,并判断P2.0是否为1
x0=1;//P2.0是高电平,x0记为1
各I/O口作为普通I/O口的数据输出时,即时给I/O赋值即可。
例,P1=0xa0;//给P1对外输出数值0xa0。
不管是进行输入还是输出操作,在对I/O口进行编程时,既可以使用字节操作方式,也可以进行位操作方式。
(2)功能复用
当有复用功能或第二功能要使用I/O口时,相应的I/O引脚就不能做普通I/O使用,否则会造成数据混乱。
如P3.6、P3.7,在对外部RAM访问时,P3.6与P3.7是写、读控制线,这时就不能做普通I/O使用。
P0口、P2口做为地址/数据功能使用时,可访问外部程序存储器或外部RAM存储器。
在访问外部空间时,在地址输出阶段,P0送出地址的低8位,P2送出地址的高8位,然后单片机产生ALE(地址锁存)信号控制单片机外部的地址锁存器存入地址值。
由于在整个操作周期内P2的地址信号一直有效,一般不对P2的地址信号锁存。
在数据阶段,P0输出或输入数据。
3、I/O口的应用
实例1:
按键状态指示灯控制。
P1口的P1.0到P1.3接有四个按键,P1.4到P1.7有四个LED发光二极管,当P1.0按下时,P1.4所接的发光二极管点亮。
P1.1的键对应P1.5的LED,其它的以此类推。
实现方法:
P1口做为普通I/O使用时,有内部上拉,可以将按键一端接地,另一端直接引脚上。
而发光二极管的发光,可以利用P1口的低电平驱动电流足够大的特性,来进行驱动。
电路设计如下:
图2.2按键状态指示灯控制电路图
程序设计如下:
//实例1:
按键的状态指示灯控制。
#include
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitkey3=P1^3;
sbitled0=P1^4;
sbitled1=P1^5;
sbitled2=P1^6;
sbitled3=P1^7;
voidmain(void)
{
while
(1)
{
led0=key0;//key按下为低电平,led为低电平亮
led1=key1;//
led2=key2;//
led3=key3;//
}
}
实例2:
RAM扩展。
在单片机外部扩展32K字节RAM,并编写程对其进行检查。
实现方法:
P0、P1做地址/数据功能使用。
对RAM逐个字节写入数值0xaa,然后读出是否为0xaa,不相等即为RAM错误。
电路设计如下:
图2.3RAM扩展电路图
程序设计如下:
//实例2:
RAM扩展。
#include
#defineXBYTE((unsignedcharvolatilexdata*)0)
voiderror(void)
{
//ram出错处理程序,自行填写
}
voidmain(void)
{
unsignedintadd;
for(add=0;add<0x8000;add++)
{
XBYTE[add]=0xaa;//写入0xaa
if(XBYTE[add]!
=0xaa)//读出判断是否等于0xaa
error();//不相等,RAM出错处理
}
}
2.2.2LED点阵显示模块
用作图形或字符显示的器件最常用有LCD液晶显示屏,阴极射线管显示屏,LED点阵显示屏等,种类繁多。
在信息量不大,像素点不高的场合,一般可采用小型的LCD液晶显示屏和LED点阵显示屏两种,而这两种屏也便于使用单片机系统进行控制。
LED点阵显示屏还可以做成大尺寸,安装在公共场合进行信息发布与显示,例如火车站的用于售票信息的显示,目前常用的显示屏就是LED点阵显示屏。
1、LED点阵器件结构
LED点阵显示器件,它主要由多个发光二极管阵列组成,然后进行封装固定成型。
常见的单块LED点阵器件有5*7、8*8、16*16等阵列,即发光二极管按5列7行,8列8行,16列16行的方式进行排列。
如图3.4所示为5*7的LED点阵器件图,图中,LED点阵器件的正面有7行5列的小窗口,每一个小窗口里面有一个LED发光二极管。
LED点阵器件的背面有电气连接的金属引出脚。
图2.4LED点阵外观图2.5LED共阴共阳原理
LED点阵显示器件按能显示颜色分类,可以单色和彩色显示器件。
单色LED点阵显示器件,每一个窗口内只有一只或一种单色发光二极管,整个器件内的发光二极管只能发出一种色光。
彩色的LED点显示器件的每个窗口内有两种或以上的可发出不同颜色光的发光二极管。
LED点阵显示器件按公共端的连接方式分类,可共阴极和共阳极两种结构。
如图3.5所示,两个图形均为5*7的LED单色点阵显示器件。
其中,左边图为共阴极结构。
即把7个发光二极管阴极连在一起,作为一列,共5列。
这时如果需要点亮其中的一个LED,则需要在对应的行输入高电平,列输入低电平,否则不能点亮。
比如我们现在要点亮第4行,第2只LED,则要在点阵块的9脚加高电平,3脚加低电平,这时才能发光。
当然还在2脚或3脚串入限流电阻,以控制LED的亮度。
右边图为共阳极结构。
和共阴极不同的是,对需要点亮的LED所在行需加低电平,所在列加高电平。
2、字符点阵显示与字模提取
一个字符若在点阵屏上显示出来,那么它就不可能像我们手写字一样是连续的一笔一画了,而是由一个点挨一点表示出来,比如在8*8的点阵屏上,点亮显示出字符‘A’,那么显示方式可以如图2.6所示。
图2.6字母‘A’点阵图形图2.7汉字‘中’点阵图形
在图中,用实心圈表示点亮,用空心表示不亮,这样形成了‘A’的点阵图形。
如果用1表示亮,0表示不亮,那么这个8*8的点阵来显示‘A’时的数据,可以这样取出。
第一行是“00001000”,刚好一个字节,用十六进制表示为0x08。
第二行是0x14,后面的按顺序为0x22,0x22,0x3E,0x22,0x22,0x22。
这一组8个字节的信息就表示字符‘A’的点阵图形,这样的一组信息也称之为字模。
当然还有一种取法就是按列来,第一列为0x00,后面依次为0x00,0x3F,0x48,0x88,0x48,0x3F,0x00。
可见,按列得到的数据与按行的方式是不同的。
这两种取显示数据均为常用方式,具体使用哪一种要根据设计出的电路与控制软件的要求来决定。
一个点阵显示屏为了能显示一屏足够清晰完整的信息,那么就会对显示屏的点数提出具体要求。
如刚才的例子,显示屏显示字符‘A’用的是8*8点阵器件,其实用5*7的点阵也能达到人能识别出字符‘A’的目的。
为了明了的显示一个汉字,我们需要用16*16或更多点数的点阵来完成单个汉字的显示,如图2.7所示,就是用16*16点数的点阵来显示汉字“中”的示意图。
当我们以横向取字模的方式来获得数据时,第一行的数据为“0000000100000000”,用两个字节来表示其十六进制值为0x01,0x00,其它15行数据可依此类推。
这样不同的字,就有不同的显示点阵信息,也就有不同的字模,在使用时需加以区分。
为了得到不同的字符或汉字的字模,一般常用的方法有两种,一是使用字模提取软件,二是使用集成了常用字符、汉字字模的字库芯片。
字模提取软件,网上有很多,使用者可以根据自己的需要下载。
使用比较好的字模提取软件时,有一些参数可以根据自己的需求进行设置改动。
其中有单个字符点数,有5*7、16*16、32*32等一些选项;字型设置,可设置成宋体、楷体等;设置取模方式,如横向、竖向;数据信息格式,如C语言格式,汇编语言格式等,以及一些其设置。
常用的集成字模芯片,有GT21/23系列的字库芯片,如GT21L16S2。
3、点阵扫描显示与接口电路
为了在LED点阵器件上看到完整正确的信息,那么LED点阵需在相应的位置点亮LED,而LED点阵器件的结构决定了不能将各行或各列同时点亮,需要采用扫描方式来实现。
扫描方式显示就将LED屏上的信息,分成一行一行或一列一列轮流点亮。
由于人眼的惰性,扫描整屏所用的时间要少于或等于20ms,就察觉不出LED点阵是一行一行轮流点亮出来,而是整屏同时点亮。
也就是说每秒钟扫描整屏次数要大于等于50次。
如图3.8,将“A”的显示过程分解的表示出来了。
图2.8逐列扫描点阵显示
根据这个过程,我们可以得到图3.9所示的扫描信号与每行数据配合显示的过程。
图2.9扫描显示时行列信息
假设点阵器件为共阴极方式的,这个显示过程分成8步走。
第一步是给器件的列引脚送入扫描码01111111,使第一行LED进入有效状态。
同时,行引脚送入第一列的显示数据0x00,由于这一组数据内没有‘1’,所以整屏没有一只LED点亮。
否则在第一列的LED中,所对应的行引脚为‘1’的就会发光。
第二步是在第一步显示一段时间后,先撤掉行引脚数据,再将列引脚送入扫描信号10111111,改行引脚信息为第二列显示数据0x00,进行第二列的显示,同样没有一只LED点亮。
第三步时,显示数据为0x3f,第三列将有6个LED点亮。
后面六步显示过程中行列信息如图所示。
八步完成后,再从头循环,以得到整屏效果。
于是,根据这一过程,我们可以得出相应硬件驱动电路,如图2.10所示。
图中,行显示信号由单片机P1口通过三极管直接提供,行扫描信号由单片机P2口经过缓冲器接到行引脚。
单片机的软件控制P1、P2口的输出配合工作完成上述过程。
图2.108*8点阵驱动电路图
从上面设计可知,一块8*8的LED点阵显示器需单独占用16根端口线,也就是说需要占用单片机的2个字节并行端口。
这样相对MCS—51单片机而言,端口资源是比较少的。
在显示信息需要同时使用多块LED点阵器件时,需要采用并联或串联锁存芯片进行扩展。
(a)74ls373(b)74ls595
图2.11并行、串行锁存器
图3.11为常用的并行、串行锁存器。
(a)图为8位并联数据锁存器芯片,型号为74LS373。
当74LS373的C端有效时,从输入端来的数据将锁存到74LS373,当OC端有效时,锁存的信息并行输出。
B图为8位数据串行锁存器芯片74LS595,它为两级锁存芯片。
通过数据串行移位时钟SRCK,将SER引脚的数据串行移位存入第一级锁存器。
RCK有效时(高电平),将第一级锁存器的数据复制到第二级锁存器,G门控信号有效时(低电平),数据并行输出。
4、LED点阵显示器件接口实例
实例3:
用5*7的LED点阵器件显示数字“6”
本例用5*7的LED点阵器件显示数字“6”,接口电路如图3.5所示(采用共阳极LED点阵器件)。
实现方法:
图2.12中LED点阵的列信息由单片机P0引脚提供做扫描信号,扫描信号低电平时LED被点亮,然后由P1口输出电平控制显示的内容,数字”6”的字模信息如表6所示。
表3.2.15*7点阵显示数字‘6’信息表
列行
1
2
3
4
5
1
0
0
1
1
0
2
0
1
0
0
0
3
1
0
0
0
0
4
1
1
1
1
0
5
1
0
0
0
1
6
1
0
0
0
1
7
0
1
1
1
0
字模信息只有七位,不足的一位,在高位补0,用十六进制方法表示为:
0x1e,0x29,0x49,0x49,0x06。
由于LED点阵器件是共阳的方式的,当列引脚接扫描信号时,是高电平有效,行引脚接显示数据,为低电平点亮。
表2.2.1信息表使用高电平点亮,为正确显示出来,需要对的数据先进行取反操作再输出显示。
电路设计如下:
图2.125*7LED点阵与单片机的接口电路
程序设计如下:
//实例3:
用5*7的LED点阵器件显示数字“6”
#include
#include
#defineled_CP0
#defineled_RP2
#defineLED_OFF0
#defineLED_ON1
sbitled_C0=led_C^0;
sbitled_C1=led_C^1;
sbitled_C2=led_C^2;
sbitled_C3=led_C^3;
sbitled_C4=led_C^4;
unsignedcharcodetab[]={0x1e,0x29,0x49,0x49,0x06};
voiddelay(unsignedchartm)
{
unsignedchari;
for(;tm>0;tm--)
for(i=240;i>0;i--);
}
voidmain(void)
{
//初始化
led_C=LED_OFF;//关闭所有扫描,即关闭显示
while
(1)
{
//显示第一列
led_C=LED_OFF;//关闭所有扫描,即关闭显示
led_R=~tab[0];
led_C0=LED_ON;//第一列有效
delay(8);//延时大约4ms
//显示第二列
led_C=LED_OFF;//关闭所有扫描
led_R=~tab[1];
led_C1=LED_ON;//第二列有效
delay(8);//延时大约4ms
//显示第三列
led_C=LED_OFF;//关闭所有扫描
led_R=~tab[2];
led_C2=LED_ON;
delay(8);//延时大约4ms
//显示第四列
led_C=LED_OFF;//关闭所有扫描
led_R=~tab[3];
led_C3=LED_ON;
delay(8);//延时大约4ms
//显示第五列
led_C=LED_OFF;//关闭所有扫描
led_R=~tab[4];
led_C4=LED_ON;
delay(8);//延时大约4ms
}
}
实例4:
用8*8LED点阵器件显示数字“678”
实现方法:
图3.13为单片机驱动三块8*8的共阴极LED点阵器件显示数字“678”的电路。
电路图中,仍采用单片机P0口做列扫描信号,三块LED点阵的行信号分别接P1、P2、P3口,由P1口来提供第一块LED的显示数据内容,P2口提供第二块LED的数据,P3口对接第三块。
因此,三块LED点阵所使用列扫描信号虽然是相同的,但显示的内容却是不同。
但这种方式由于过多地占用了单片机端口资源,在实际应用中,远远不只三块8*8的LED点字,所以不实用,而是采用扩展I/O口的方式实现。
电路设计如下:
图2.133块8*8LED点阵显示电路
程序设计如下:
//实例4:
用8*8LED点阵器件显示数字“678”
#include
#include
#defineled_CP0
#defineled_RB0P2
#defineled_RB1P3
#defineled_RB2P1
#defineLED_OFF0
#defineLED_ON1
unsignedcharcodetab[3][8]={
{0xFF,0xC7,0xAB,0xAB,0xAB,0xAB,0xDF,0xFF},/*"6",0*/
{0xFF,0xF3,0xFB,0x8B,0xEB,0xF3,0xFB,0xFF},/*"7",1*/
{0xFF,0xD3,0xAB,0xAB,0xAB,0xAB,0xD3,0xFF},/*"8",2*/
};//共阳极字模,取阳码
voiddelay(unsignedchartm)
{//一个延时单位大约0.5ms,12M晶振
unsignedchari;
for(;tm>0;tm--)
for(i=240;i>0;i--);
}
voidmain(void)
{
unsignedchari,j;
led_C=LED_OFF;//关闭所有扫描
while
(1)
{
j=0x01;
for(i=0;i<8;i++)
{
led_C=LED_OFF;//关闭所有扫描
led_RB0=tab[0][i];
led_RB1=tab[1][i];
led_RB2=tab[2][i];
led_C=j;
j=j<<1;
delay(4);//延时大约2ms
}
}
}
实例5:
用四块8*8的LED点阵显示“1234”
实现方法:
上例虽然实现显示不同数字的功能,但浪费端口资源严重,故在实现显示内容点数多、LED点阵块多的情况采用扩展I/O的方式进行显示。
如图3.14所示的电路,使用了四74ls373锁存器的方式来扩展I/O口,以解决单片机I/O端口资源少的问题。
电路设计如下:
图2.14锁存器扩展LED点阵显示电路
程序设计如下:
//实例5:
用四块8*8的LED点阵显示“1234”
#include
#include
#defineled_CP0
#defineled_RP2
#defineled_LEP3
#defineLED_OFF0
#defineLED_ON1
#defineLS373_OFF0
#defineLS373_ON1
sbitled_LE0=led_LE^0;
sbitled_LE1=led_LE^1;
sbitled_LE2=led_LE^2;
sbitled_LE3=led_LE^3;
unsignedcharcodetab[4][8]={
{0xFF,0xB7,0xB7,0x83,0xBF,0xBF,0xFF,0xFF},/*"1",0*/
{0xFF,0xB7,0x9B,0x9B,0x9B,0xAB,0x93,0xFF},/*"2",1*/
{0xFF,0xD7,0xBB,0xB3,0xB3,0xAB,0xCB,0xFF},/*"3",2*/
{0xFF,0xEF,0xD7,0xDB,0x9B,0x81,0xFF,0xFF},/*"4",3*/
};//共阳极字模,取阳码
voiddelay(unsignedchartm)
{//一个延时单位大约0.5ms,12M晶振
unsignedchari;
for(;tm>0;tm--)
for(i=240;i>0;i--);
}
voidmain(void)
{
unsignedchari,j;
led_C=LED_OFF;//关闭所有扫描
led_LE=LS373_OFF;
while
(1)
{
j=0x01;
for(i=0;i<8;i++)
{
led_C=LED_OFF;//关闭所有扫描
led_R=tab[0][i];
led_LE0=LS373_ON;
led_LE0=LS373_OFF;
led_R=tab[1][i];
led_LE1=LS373_ON;
led_LE1=LS373_OFF;
led_R=tab[2][i];
led_LE2=LS373_ON;
led_LE2=LS373_OFF;
led_R=tab[3][i];
led_LE3=LS373_ON;
led_LE3=LS373_OFF;
led_C=j;
j=j<<1;
delay(4);//延时大约2ms
}
}
}
2.3任务实现
2.3.1系统方案设计
由8片8*8的LED点阵显示器件组成显示屏,形成32列16行的排布,由单片机控制其显示“学习单片机。
”。
每个汉字字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 项目2 点阵LED电子显示屏的设计2教材 项目 点阵 LED 电子显示屏 设计 教材