1616点阵显示屏的设计.docx
《1616点阵显示屏的设计.docx》由会员分享,可在线阅读,更多相关《1616点阵显示屏的设计.docx(18页珍藏版)》请在冰豆网上搜索。
1616点阵显示屏的设计
河南理工大学
《单片机应用与仿真训练》设计报告
题目LED点阵显示屏设计
摘要
本设计使用简单单片机AT98S52作为主控制模块,利用简单的外围电路来驱动16×16的点阵LED显示屏。
在本设计中主要用2个74HC574驱动16×16点阵显示屏的列,用两个74HC574来驱动16×16点阵显示屏的行,可以最终实现——“河南理工大学电气学院”十个汉字的自动上移。
文章给出了一种基于MCS-51单片机的16×16点阵LED显示屏的设计方案。
包括系统具体的硬件设计方案,软件流程图和部分C语言程序等方面。
在负载范围内,只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。
关键词:
单片机点阵显示
目录
摘要2
1概述4
1.1LED及LED显示屏简述4
1.2设计要求5
1.3设计方案5
2系统总体方案及硬件设计7
2.1显示屏总体设计方案7
2.2驱动电路设计7
2.3单片机系统及外围电路7
3软件设计9
3.1显示驱动程序8
3.2系统主程序9
4Proteus软件仿真11
4.1Proteus软件简介11
4.1proteus仿真过程11
5课程设计体会12
参考文献13
附1源程序代码14
附2系统仿真图21
1概述
1.1LED及LED显示屏简述
LED显示屏显示画面色彩鲜艳,立体感强,静如油画,动如电影,广泛应用于车站、码头、机场、商场、医院、宾馆、银行、证券市场、建筑市场、拍卖行、工业企业管理和其它公共场所。
其特色之一是节能(直接功耗,间接耗能),二是基本无电离辐射,三提高空间利用率。
而这些特色又恰好解决了上述的三种问题。
然而LED点阵显示屏的特点不仅仅于此LED点阵显示屏用的是数码管,而数码管具有实用,便宜等优点。
做出来的LED点阵显示很耐用。
LED点阵显示屏之所以受到广泛重视而得到迅速发展,是与LED显示屏本身所具有的优点分不开的。
LED点阵显示屏的发展前景极为广阔,目前正朝着更高亮度、更高耐气候性、更高的发光密度、更高的发光均匀性,可靠性、全色化方向发展。
在实际应用中的显示屏由于成本和可靠性的因素常采用一种称为动态扫描的显示方法。
LED就是LightEmittingDiode(发光二极管)的缩写。
在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。
PN结加反向电压,少数载流子难以注入,故不发光。
这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。
LED显示屏是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。
LED显示屏分为图文显示屏和视频显示屏,均由LED矩阵块组成。
图文显示屏可与计算机同步显示汉字、英文文本和图形;视频显示屏采用微型计算机进行控制,图文、图像并茂,以实时、同步、清晰的信息传播方式播放各种信息,还可显示二维、三维动画、录像、电视、VCD节目以及现场实况。
点阵显示器有单色和双色两类,可显示红,黄,绿,橙等。
LED点阵有4×4、4×8、5×7、5×8、8×8、16×16、24×24、40×40等多种;根据图素的数目分为等,双原色、三原色等,根据图素顏色的不同所显示的文字、图像等内容的顏色也不同,单原色点阵只能显示固定色彩如红、绿、黄等单色,双原色和三原色点阵显示内容的顏色由图素内不同顏色发光二极体点亮组合方式决定,如红绿都亮时可显示黄色,如果按照脉冲方式控制二极体的点亮时间,则可实现256或更高级灰度显示,即可实现真彩色显示。
几种LED点阵显示器的内部电路结构和外型规格,其他型号点阵的结构与引脚可试验获得,LED点阵显示器单块使用时,既可代替数码管显示数位,也可显示各种中西文字及符号,如5x7点阵显示器用于显示西文字母,5×8点阵显示器用于显示中西文,8x8点阵用于显示中文文字,也可用于图形显示。
用多块点阵显示器组合则可构成大屏幕显示器,但这类实用装置常通过微机或单片机控制驱动。
由LED点阵显示器的内部结构可知,器件宜采用动态扫描驱动方式工作,由于LED管芯大多为高亮度型,因此某行或某列的单体LED驱动电流可选用窄脉冲,但其平均电流应限制在20mA内,多数点阵显示器的单体LED的正向压降约在2V左右,但大亮点∮10的点阵显示器单体LED的正向压降约为6V。
1.2设计要求
设计一个室内用16×16点阵LED图文显示屏,要求在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形或文字应稳定、清晰无串扰,图形或文字显示有静止、移入移出等显示方式。
1.3设计方案
16×16的点阵显示屏共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,16×16的点阵需要256/8=32个锁存器。
这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大的多,这样在锁存器上花的成本将是一个很庞大的数字。
因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。
动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如16行)的同名列共用一套列驱动器。
具体就16×16的点阵来说,我们把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起(共阳的接法),先送出对应第一行发光管亮灭的数据并锁存,然后选通第一行使其燃亮一定的时间,然后熄灭;再送出第二行的数据并锁存,然后选通第二行使其燃亮相同的时间,然后熄灭;……第十六行之后又重新燃亮第一行,这样反复轮回。
当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,我们就能看到显示屏上稳定的图形了。
采用串行传输的方法,控制电路可以只用一根信号线,将列数据一位一位传往列驱动器,在硬件方面无疑是十分经济的。
但是,串行传输过程较长,数据按顺序一位一位地输出给列驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。
这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两个部分。
对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下,留给行显示的时间就太少了,以至影响到LED的亮度。
解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。
即在显示本行各列数据的同时,传送下一行的列数据。
为了达到重叠处理的目的,列数据的显示就需要具有锁存功能。
经过上述分析,可以归纳出列驱动器电路应具备的主要功能。
对于列数据准备来说,它应能实现串入并出的移位功能;对于列数据显示来说,应具有并行锁存的功能。
这样,本行已准备好的数据打入并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。
2系统总体方案及硬件设计
2.1显示屏总体设计方案
2.2驱动电路设计
驱动电路有集成电路74HC574构成。
它是八路D型触发器,上升沿触发,三态。
而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行列数据的同时,传送下一行的列数据,既达到重叠处理的目的。
74HC574的外形及内部结构如图所示。
它的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。
引脚OE是串行数据的输入端。
引脚CP是移位寄存器的移位时钟脉冲,在其上升沿发生移位。
移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。
由于OE和CP两个信号是互相独立的,所以能够做到输入串行移位与输出锁存互不干扰。
芯片的输入端是D0~D7,输出端为Q0~Q7。
74HC574的引脚
2.3单片机系统及外围电路
单片机采用AT89S52,采用频率晶振12MHZ,以获得较高的刷新频率,时期显示更稳定。
单片机的串口与列驱动器相连,用来显示数据。
P2口8位与行驱动器和列驱动器相连,送出行和列选信号;P3口则用来发送控制信号。
P0口和P1口空着,在有必要的时候可以扩展系统的ROM和RAM。
3软件设计
3.1显示驱动程序
显示驱动程序在进入中断后首先要对定时器T0重新赋初值,以保证显示屏刷新率的稳定,1/16扫描显示屏的刷新率(帧频)计算公式如下:
刷频率(帧频)=1/16×T0溢出率
=1/16×f/12(65536-t)
其中f位晶振频率,t为定时器T0初值(工作在16位定时器模式)。
然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。
为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打入输出锁存器并锁存,然后再输出新的行号,重新打开显示。
图3-1为显示驱动程序(显示屏扫描函数)流程图。
3.2系统主程序
本文设计的系统软件能使系统在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形和文字应稳定、清晰无串扰。
图形或文字显示有静止、移入移出等显示方式。
系统主程序开始以后,首先是对系统环境初始化,包括设置串口、定时器、中断和端口;然后以“卷帘出”效果显示图形,停留约3s;接着向上滚动显示“河南理工大学电气学院”这10个汉字及一个图形,然后以“卷帘入”效果隐去图形。
由于单片机没有停机指令,所以可以设置系统程序不断的循环执行上述显示效果。
单元显示屏可以接收来自控制器(主控制电路板)或上一级显示单元模块传输下来的数据信息和命令信息,并可将这些数据信息和命令信息不经任何变化地再传送到下一级显示模块单元中,因此显示板可扩展至更多的显示单元,用于显示更多的显示内容
4Proteus软件仿真
4.1Proteus软件简介
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
使用Proteus软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;在单片机课程设计和全国大学生电子设计竞赛中,我们使用Proteus开发环境对学生进行培训,在不需要硬件投入的条件下,学生普遍反映,对单片机的学习比单纯学习书本知识更容易接受,更容易提高。
实践证明,在使用Proteus进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。
因此,Proteus有较高的推广利用价值。
4.2proteus仿真过程
5课程设计体会
在这次课程设计的过程中我和我的队友通过查阅大量的相关资料,详细了解了LED的发光原理和LED显示屏的原理,了解了LED的现状,清楚地了解了LED显示屏与其它显示屏相比较有那些优点,明确了研究目标。
在一定程度上为将来从事该行业奠定了基础。
在设计过程中,得到了指导老师大量的无私的指导,熟练掌握了proteus仿真软件的基本使用,与此同时也感到proteus仿真软件对我们电气专业的同学来说是一门相当有用的课程。
不仅如此,通过这次课程设计,我重新复习并进一步学习了MCS-51;熟练掌握了WORD软件的使用。
在以后的学习和工作中要不断学习新知识,运用新知识,做一名合格的电气工程技术人员。
参考文献
[1]何立民.MCS-51系列单片机应用系统设计与接口技术.北京:
北京航空航天大学出版社,1990.23-25
[2]何立民.单片机应用技术选编.北京:
北京航空航天大学出版社,2000.30-33
[3]邬宽明.单片机外围器件实用手册.北京:
北京航空航天大学出版社,1998.70-73
[4]张毅刚等.MCS-51单片机应用设计.哈尔滨:
哈尔滨工业电子出版社,1996.55-56
[5]张新成,杨志邦.c语言程序设计.郑州:
河南科学技术出版社,2009.55-65
[6]余发山,王福忠.单片机原理及应用技术.徐州:
中国矿大出版社,2004.34-36
附1源程序代码
#include"reg51.h"
#defineWrite_DateP2//写数据脚
sbitWrite_OE1=P3^0;//列1
sbitWrite_clk1=P3^1;
sbitWrite_OE3=P3^2;//行1
sbitWrite_clk3=P3^3;
sbitWrite_OE2=P3^4;//列2
sbitWrite_clk2=P3^5;
sbitWrite_OE4=P3^6;//行2
sbitWrite_clk4=P3^7;
unsignedcharcodeChinese[]={
0x20,0x00,0x17,0xFE,0x10,0x08,0x00,0x08,0x88,0x08,0x4B,0xC8,0x52,0x48,0x12,0x48,
0x22,0x48,0x23,0xC8,0xE2,0x48,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x28,0x20,0x10,/*"河",0*/
0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x00,0x3F,0xFC,0x24,0x24,0x22,0x44,
0x2F,0xF4,0x21,0x04,0x3F,0xFC,0x21,0x04,0x21,0x04,0x21,0x14,0x21,0x08,0x00,0x00,/*"南",1*/
0x00,0x00,0x03,0xFC,0xFA,0x44,0x22,0x44,0x23,0xFC,0x22,0x44,0xFA,0x44,0x23,0xFC,
0x22,0x44,0x20,0x40,0x23,0xFC,0x38,0x40,0xC0,0x40,0x00,0x40,0x0F,0xFE,0x00,0x00,/*"理",2*/
0x00,0x00,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,/*"工",3*/
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x02,0x80,
0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20,0x08,0x10,0x10,0x18,0x20,0x0E,0x40,0x04,/*"大",4*/
0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,
0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00,/*"学",5*/
0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,
0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x01,0x02,0x01,0x02,0x00,0xFE,0x00,0x00,/*"电",6*/
0x08,0x00,0x08,0x00,0x1F,0xFE,0x10,0x00,0x20,0x00,0x4F,0xF8,0x00,0x00,0x1F,0xF0,
0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0A,0x00,0x0A,0x00,0x06,0x00,0x02,/*"气",7*/
0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,
0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00,/*"学",8*/
0x00,0x80,0xF8,0x40,0x8F,0xFE,0x94,0x04,0xA0,0x00,0xA3,0xF8,0x90,0x00,0x88,0x00,
0x8F,0xFE,0xA9,0x20,0x91,0x20,0x81,0x20,0x82,0x22,0x82,0x22,0x84,0x22,0x88,0x1E,/*"院",9*/
};
voidWrite_Chinese(unsignedcharrow);
voidDisplay_Chinese(unsignedcharlen);
voidDelay(unsignedinttim);
voidmain(void)
{
while
(1)
{
Display_Chinese(11);
}
}
//******************************************************************************
//函数名字;voidWrite_Chinese(unsignedcharlen,unsignedintmove)
//
//输入参数;unsignedintmove:
移位导通脚
//
//输出参数;无
//
//功能描述;显示一个汉字
//*****************************************************************************
voidWrite_Chinese(unsignedcharrow)
{
unsignedchari,k;
unsignedintmove=1;
k=row*2;
for(i=0;i<16;i++)
{
Write_OE1=1;
Write_Date=Chinese[k+i*2];
Write_clk1=0;
Write_clk1=1;
Write_OE1=0;
Write_OE2=1;
Write_Date=Chinese[k+1+i*2];
Write_clk2=0;
Write_clk2=1;
Write_OE2=0;
Write_OE3=1;
Write_Date=~move;
Write_clk3=0;
Write_clk3=1;
Write_OE3=0;
Write_OE4=1;
Write_Date=~(move>>8);
Write_clk4=0;
Write_clk4=1;
Write_OE4=0;
move<<=1;
Delay(10);
}
Delay(100);
}
voidDisplay_Chinese(unsignedcharlen)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<100;j++)
Write_Chinese(i);
//Delay(100);
}
}
//******************************************************************************
//函数名字;voidDelay(unsignedinttim)
//
//输入参数;unsignedinttim:
计数值
//
//输出参数;无
//
//功能描述;延时
//*****************************************************************************
voidDelay(unsignedinttim)
{
while(tim)
tim--;
}
附2系统仿真图
........忽略此处.......