单片机课程设计之LED点阵电子显示屏设计.docx
《单片机课程设计之LED点阵电子显示屏设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之LED点阵电子显示屏设计.docx(13页珍藏版)》请在冰点文库上搜索。
![单片机课程设计之LED点阵电子显示屏设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/21/dc24744d-3c26-4204-b3f3-0b7bd7a5b17b/dc24744d-3c26-4204-b3f3-0b7bd7a5b17b1.gif)
单片机课程设计之LED点阵电子显示屏设计
LED点阵电子显示屏的设计
一、选用器材
AT89C52单片机1个,74LS138型号3线-8线译码器1个,74LS373三态输出的八D透明锁存器型号,+5V电源1个,Led8*8点阵屏绿色5个,tPdPD5个,带公共端的8电阻排(排阻)1个,电容30pF3个,电阻10K欧1个,按钮6个,石英晶振1MHz1个
二、设计方案
1、实验功能
本实验要实现的功能就是,显示时分秒,年月日,且可修改。
实现实时时间的显示,显示屏数字显示,时:
分:
秒;星期的显示;年月日的显示。
显示屏通过按键切换显示星期,年月日,时间。
2、总体方案
(1)工作原理
用单片机AT89S52控制,写入程序,将数据传输到显示模块,即点阵LED电子显示屏显示器,实现日历的显示。
(2)总体设计
电路图
LED和52单片机配合实现时间显示功能。
显示模块为点阵LED电子显示屏显示器,把单片机中的数据显示出来。
该电路是通过按键来切换各种显示要求。
3、方案论证
(1)显示部分:
显示部分是本次设计最核心的部分,对于LED8*8点阵显示有以下两种方案:
静态显示,即将每个二极管的状态分别用1和0表示,0则无电流,为暗,1则有电流,为亮。
若给每个二极管一个驱动电路,一个图像输入后,所有LED的状态保持到下一个图像。
对于静态显示方式,所需的译码驱动装置很多,引线多而负责,成本高,可靠性也低。
动态显示,即对每一个LED屏进行分割,对组成图像的各个部分分别显示,这样利用人眼的暂留效应和发光二极管发光时间的长短,也同样可以实现显示功能,这样就可以避免静态显示出现的问题。
但是,设计上如果处理不当,容易造成图像闪烁的问题,因此合理的涉及要保证驱动电路容易实现而且保证图像稳定补闪烁。
(2)数字时钟
本实验采用软件实现数字时钟。
原理为:
在单片机内部存储器分别存放时钟的年、月、日、时、分、秒、星期的信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则清零且相应的分值加1;若分值达到60,则清零且相应的时值加1;若相应的时值达到24,则清零且相应的日值加1;若相应的日值分别达到29,30,31时,根据判断来增加月值;若相应的月值达到12时,清零且年值加1。
(3)显示接口芯片的选择
采用串口输入,使用少量I/O口,但传输速度稍微慢了一些,但是不影响显示质量。
于是我们采用TI公司的DMOS器件TPIC6B595,其最大特点是驱动功率大,可直接做LED的驱动。
4、元件介绍
(1)AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
AT89S52单片机引脚图
(2)74LS373
74LS373为三态输出的八D透明锁存器。
它的输出端O0~O7可直接与总线相连。
当三态允许控制端OE为低电平时,O0~O7为正常逻辑状态,可用来驱动负载或总线。
当OE为高电平时,O0~O7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。
当锁存允许端LE为高电平时,O随数据D而变。
当LE为低电平时,O被锁存在已建立的数据电平。
74LS373引脚图
(3)74LS138
71LS138有三个附加的控制端、和。
当、时,输出为高电平(S=1),译码器处于工作状态。
否则,译码器被禁止,所有的输出端被封锁在高电平,如表3.3.5所示。
这三个控制端也叫做“片选”输入端,利用片选的作用可以将多篇连接起来以扩展译码器的功能。
带控制输入端的译码器又是一个完整的数据分配器。
在图3.3.8电路中如果把作为“数据”输入端(在同一个时间),而将作为“地址”输入端,那么从送来的数据只能通过所指定的一根输出线送出去。
这就不难理解为什么把叫做地址输入了。
例如当=101时,门的输入端除了接至输出端的一个以外全是高电平,因此的数据以反码的形式从输出,而不会被送到其他任何一个输出端上。
74LS138引脚图
(4)LED8*8点阵屏
双基色8*8点阵严格有共阴型和共阳型之分的,一个双基色LED(一个发亮点)阴极接在一起就是共阴、否则反之为共阳。
我们使用的就是共阳型的LED双基色8*8点阵屏。
三、结论与总结
本电路的设计原理比较复杂,而焊接电路的难度更加之高,由于线路的复杂性,使得焊接时很容易出现错误,以致于一步失误全盘皆输。
通过实验对单片机有了进一步的了解,也加强了动手焊接的能力。
所以,通过此实验认识了很多新问题,以及培养了解决问题的能力。
四、参考文献
[1]李朝青.单片机原理及接口技术[M].北京航空航天大学出版社,2005.
附:
a电路设计实物图
正面
反面
b实验程序
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
#definetrue1
#definefaluse1
sbitset_key=P3^0;
sbitup_key=P3^1;
sbitdown_key=P3^2;
sbitsign=P3^3;
sbitselect_key=P3^4;
sbitset_ring_key=P3^5;
uintsec;
uintmin=23;
uinthour=12;
uintday=10;
uintmonth=10;
uintyearl=7;
uintyearh=20;
uinttcnt;
uintcnt=0;
uintcursor=0;
uintsjsz=0;
uchara=0xff;
ucharcodeSeg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
voiddelay(uintt)
{
uinti;
while(t--)
{for(i=0;i<125;i++);}
}
voidKdelay()
{
uchari,j;
for(i=100;i>0;i--)
for(j=248;j>0;j--);
}
voiddisplay(ucharL1,ucharL2,ucharL3,ucharL4,ucharL5,ucharL6,ucharL7,ucharL8,ucharL9,ucharL10,ucharL11,ucharL12,ucharL13,ucharL14)
{
if(cnt==1){
if(cursor==6){P2=0x7F|a;P0=L1;delay
(1);}else{P2=0x7F;P0=L1;delay
(1);}//yearh
if(cursor==6){P2=0xBF|a;P0=L2;delay
(1);}else{P2=0xBF;P0=L2;delay
(1);}//yearh
if(cursor==6){P2=0xDF|a;P0=L3;delay
(1);}else{P2=0xDF;P0=L3;delay
(1);}//yearl
if(cursor==6){P2=0xEF|a;P0=L4;delay
(1);}else{P2=0xEF;P0=L4;delay
(1);}//yearl
if(cursor==5){P2=0xF7|a;P0=L5;delay
(1);}else{P2=0xF7;P0=L5;delay
(1);}//month
if(cursor==5){P2=0xFB|a;P0=L6;delay
(1);}else{P2=0xFB;P0=L6;delay
(1);}//month
if(cursor==4){P2=0xFD|a;P0=L7;delay
(1);}else{P2=0xFD;P0=L7;delay
(1);}//day
if(cursor==4){P2=0xFE|a;P0=L8;delay
(1);}else{P2=0xFE;P0=L8;delay
(1);}//day
P2=0xFF;}
else{
if(cursor==3){P2=0x7F|a;P0=L9;delay
(1);}else{P2=0x7F;P0=L9;delay
(1);}//hour
if(cursor==3){P2=0xBF|a;P0=L10;delay
(1);}else{P2=0xBF;P0=L10;delay
(1);}//hour
if(cnt!
=1){P2=0xDF;P0=0X40;delay
(1);}
if(cursor==2){P2=0xEF|a;P0=L11;delay
(1);}else{P2=0xEF;P0=L11;delay
(1);}//min
if(cursor==2){P2=0xF7|a;P0=L12;delay
(1);}else{P2=0xF7;P0=L12;delay
(1);}//min
if(cnt!
=1){P2=0xFB;P0=0X40;delay
(1);}
if(cursor==1){P2=0xFD|a;P0=L13;delay
(1);}else{P2=0xFD;P0=L13;delay
(1);}//sec
if(cursor==1){P2=0xFE|a;P0=L14;delay
(1);}else{P2=0xFE;P0=L14;delay
(1);}//sec
P1=0xFF;
}}
main()
{
TMOD=0x02;//设置模式为定时器T0的模式2断的产生中断去执行中断函数本次定时时间为64ms
TH0=0x06;//设置计数器初值,靠TH0存储重装的计数值X0=256-250=6
TL0=0x06;
TR0=1;//启动T0
ET0=1;//开启定时器T0中断允许
EA=1;//开启中断总控制
while
(1)
{
if(set_key==0)
{
Kdelay();
if(set_key==0)
{
cursor++;
if(cursor>=7){cursor=0;}//在选择到调整年时又返回秒设置,当CURSOR=7时不选中
}
}
if(up_key==0)
{
Kdelay();
if(up_key==0)
{//加部分
if(cursor==1){sec++;if(sec==60)sec=0;}
if(cursor==2){min++;if(min==60)min=0;}
if(cursor==3){hour++;if(hour==24)hour=0;}
if(cursor==4){day++;if(day==31)day=1;}
if(cursor==5){month++;if(month==13)month=1;}
if(cursor==6){yearl++;if(yearl==100)yearl=0;}
if(cursor==7){yearh++;if(yearh==30)yearh=20;}
}
}
if(down_key==0)
{
Kdelay();
if(down_key==0)
{//减部分
if(cursor==1){sec--;if(sec==00)sec=59;}
if(cursor==2){min--;if(min==0)min=59;}
if(cursor==3){hour--;if(hour==0)hour=23;}
if(cursor==4){day--;if(day==0)day=31;}
if(cursor==5){month--;if(month==0)month=12;}
if(cursor==6){yearl--;if(yearl==0)yearl=99;}
if(cursor==7){yearh--;if(yearh==20)yearh=30;}
}
}
if(select_key==0)
{
Kdelay();
if(select_key==0){
cnt++;if(cnt>=2)cnt=0;}}
display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10]);
}
}
voidt0(void)interrupt1using0//t0的中断程序
{
tcnt++;
if(tcnt==4000)//定时器的定时计数,4000次250us为1秒,中断4000次后才执行刷新,期间照上面的语句显示
{
tcnt=0;
sign=~sign;
a=~a;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
day++;
if(month==2&&((yearl==0&&yearh%4==0)||(yearl!
=0&&yearl%4==0))&&day==30)day=1;
elseif(month==2&&day==29)day=1;
elseif((month==4||month==6||month==9||month==11)&&day==31)day=1;
elseif(day==32)day=1;
if(day==1)
{
month++;
if(month==13)
{
month=1;
yearl++;
if(yearl==100)
{
yearl=0;
yearh++;
if(yearh==100)
{
yearh=20;
}
}
}
}
}
}
}
}
}