基于Proteus的LED点阵显.docx
《基于Proteus的LED点阵显.docx》由会员分享,可在线阅读,更多相关《基于Proteus的LED点阵显.docx(11页珍藏版)》请在冰豆网上搜索。
基于Proteus的LED点阵显
单片机应用系统设计
课题:
基于Proteus的LED点阵显
示屏的设计与仿真
姓名:
班级:
学号:
指导老师:
日期:
1绪论.............................................................2
1.1课题研究的意义................................................2
2.2系统实现的基本原理............................................3
4.1.1主程序...................................................7
4.1.2定时器/计数器T0种地服务程序…………………………………….7
4.2仿真效果....................................................9
5设计总结...........................................................10
1绪论
1.1课题的背景及意义
随着信息产业的高速发展,LED显示屏作为信息传播的一种重要手成为现代信息化社会的一个闪亮标志。
近年LED显示屏已广泛应用于室内、外需要进行服务内容和服务宗旨宣传的公众场所如电信、邮政大厅、营业部、车站、机场、港口、体育场馆等信息的发布,政府机关政策,政令的发布,各类市场行情信息的发部和宣传等。
我的这个设计利用了单片机的内部定时器、两个8*8LED点阵,可以定时两位数的秒数进行定时,可用于交通灯、比赛等。
1.2点阵显示屏的发展史
随着计算机技术的快速发展,电子产品的技术发展也越来越快。
基于PC机控制的LED点阵式显示屏的发展技术也非常的快。
不仅点阵数高,同时可以显示很多的汉字或图形,而且清晰度非常高。
还有许多的其它附加功能,比如,可以动态显示,不断的更换颜色(特别醒目),可以翻转汉字或图形,还可以反色目前国内外还有更加先进的技术,就是利用液晶显示屏,则更加清晰,但成本比较高。
2系统总体设计
2.1系统设计硬件框图
单片机控制译码器译码,译码器给两个led点列扫描信号,单片机给两个LED行扫描信号。
硬件框图如图1所示:
图1
2.2系统实现的基本原理
AT89C51做控制芯片,利用内部定时器定/计数器资源,选择工作方式2(8位自动重置定时/计数)
利用8*8LED行、列扫描动态显示原理显示0-9数字。
由于AT89C51芯片的端口资源有限,所以利用了两个3-8译码器作为端口扩展。
8X8点阵LED工作原理说明:
8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:
•一根竖柱:
对应的列置1,而行则采用扫描的方法来实现。
•一根横柱:
对应的行置0,而列则采用扫描的方法来实现。
内部原理图如图2所示:
图2
3硬件系统设计
3.1系统的硬件模块
系统的硬件主要包括单片机芯片、8*8led点阵、3-8译码器等电路。
片机采用应用广泛的AT89C51,
本设计采用的单片机芯片是AT89C51,本芯片是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
本设计点阵显示模块采用MATRIX-8*8的(红色)列输入线接至内部LED的阴极端,行输入线接至内部LED的阳极端(若阳极端输入为高电平,极端输入低电平,则该LED点亮)。
3线-8线译码器74L138功能表如表1所示:
表1
3.2系统详细的硬件原理图
系统的硬件主要包括单片机芯片、8*8led点阵、3-8译码器
P0.0-P0.2和P0.4-P0.6分别给两个8*8LED列扫描口信号,P2口和P3口分别给两个8*8LED点阵行扫描信号,系统时钟频率采用默认的12MHz。
系统详细的硬件详细的连接电路图如图3所示:
图3
4系统软件设计
4.1系统完成的功能设计
LED点阵倒计时牌的系统软件由主程序和中断服务程序组成,主程序包含定时器初始化参数设置,调用子程序模块。
由于定时器/计数器采用中断处理方式处理,因此还要编写定时器/计数器中断服务程序,在定时器/计数器中对led点阵进行控制。
4.1.1主程序
主程序对现实单元和定时器/计数器初始化,然后等待中断发生,调用中断服务程序,则转入相应的功能程序。
选择定时/计数器T0工作方式2,可自动装载初值,产生周期为250微秒的定时,然后对250微秒计数4000次。
方式控制字为00000010(02H)。
系统时钟为12MHz,定时250微秒,计数初值N为250,初值X=2最大计数值M-计数值N=256-250=6,则TH0=TL0=06H。
主程序流程图如图4所示:
图4
4.1.2定时器/计数器T0种地服务程序
定时器/计数器T0用于定时,选择方式2(16位自动重置定时),定时时间设为250微妙,定时时间到则中断,对第一行、第一列列进行0扫描,行、列各加1,在中端程序中用一个计数器对250微妙计数,计4000次则为1秒,扫描的个位数字加1,个位等于9时,十位加1,同时计数器清零。
定时器/计数器中断服务程序如图5所示:
图5
4.2仿真效果
倒计时到88秒效果图如图6所示:
图6
5设计总结
通过本次课程设计,我加深了对单片机课程的理解,并培养自己对单片机课程的兴趣。
锻炼自己发现问题并能够及时地解决问题的能力。
在设计开发中我遇到了如下的问题:
首先是8*8LED点阵描字的问题。
先用一个辅助软件描的。
但发现显示的是乱码。
原来这和点阵的接口以及点阵的方向有关。
最后只能根据自己的所设计的电路图描了数字0-9。
这需要掌握点阵的显示原理,只有理解了才能描出来。
建立字库时先用了一维数组,比较烦。
后来经过思考、不断的调试,改用了而为数组,简单了很多。
其次是在连接两个8*8LED点阵时发现需要32个引脚,AT89C51总共才有32个引脚,所以考虑使用译码器扩展。
选中了3-8译码器,正好能提供列扫描信号。
最后就是LED点阵显示遇到的问题。
LED点阵显示是利用人的视觉暂留原理,要想看见显示结果必须在每一行每一列扫描后加上延时程序,这样一来加上单片机的定时1s,每次显示的时间大于1s了。
还有就是不能使十位上的数暂停在点阵上。
所以不能利用每次中断1s后才显示一个数字。
我采用的是单片机定时方式2,每次定时250微妙,产生1s的定时需要4000次。
每定时250微妙后即对行列进行一次扫描,总共8行8列,所以显示一个数字每行每列扫描了500次,由于扫描频率很高,刷新的很快,人眼感觉不到行列扫描的过程,数字在平稳的过渡。
并且十位上的数能稳定的显示在点阵上。
附录1
C语言源代码如下:
#include
unsignedchartab[8]={0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00};//行选
unsignedchartabx[10][8]={
{0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38},//选列"0"
{0x00,0x38,0x30,0x30,0x30,0x30,0x30,0x78},//"1"
{0x00,0x38,0x44,0x40,0x40,0x3c,0x04,0x7c},//"2"
{0x00,0x3c,0x62,0x60,0x3c,0x60,0x62,0x3c},//"3"
{0x00,0x20,0x30,0x28,0x24,0x7c,0x20,0x20},//"4"
{0x00,0x7c,0x04,0x3c,0x40,0x40,0x44,0x38},//"5"
{0x00,0x38,0x44,0x04,0x3c,0x44,0x44,0x38},//"6"
{0x00,0x3e,0x20,0x20,0x10,0x10,0x10,0x10},//"7"
{0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38},//"8"
{0x00,0x38,0x44,0x44,0x78,0x40,0x40,0x38}//"9"
};
unsignedintN;//计数
unsignedchari=0;
unsignedcharj=0;
unsignedchark=0;
unsignedcharx=0;
voidmain(void)
{
TMOD=0x02;//定时器方式2,定时250微秒
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while
(1)
{;
}
}
voidtime0(void)interrupt1//中断服务程序
{
P0=tab[i];//列扫描
P3=tabx[9-j][i];//个位行扫描
P2=tabx[9-k][i];//十位行扫描
i++;
if(i==8)//八列扫描完
{
i=0;
}
N++;
if(N==4000)//定时1s
{
N=0;
j++;//定时1s,扫描的数字加1
x++;
k=x/10;//十位
if(k==10)
{
k=0;
x=0;
}
if(j==10)
{
j=0;
}
}
}