单片机课程设计基于at89c52单片机的led点阵显示电子钟设计毕业论文设计Word格式文档下载.docx
《单片机课程设计基于at89c52单片机的led点阵显示电子钟设计毕业论文设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计基于at89c52单片机的led点阵显示电子钟设计毕业论文设计Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
![单片机课程设计基于at89c52单片机的led点阵显示电子钟设计毕业论文设计Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/29/cd6cc532-b022-430c-9cbc-d345a5bb2cc5/cd6cc532-b022-430c-9cbc-d345a5bb2cc51.gif)
)、(分十位)、(分个位)(:
)(秒十位)、(秒个位)。
设计一种基于AT89C52单片机的LED点阵显示时钟,基本设计要求如下:
(1)电子钟的基本功能,也就是计时的功能,要保证电子钟的正常工作,正常计时。
(2)时钟的显示由LED点阵构成,格式为XX:
XX:
XX(时:
分:
秒),点阵为8×
8点阵显示屏。
(3)能正确显示时间,上电显示为当前时间。
2总体方案设计及论证
在本章节中将对总体的方案进行阐述,同时将对可能用到的元器件进行详细介绍,以便接下来的设计工作能顺利,有效的进行打下结实的基础。
2.1系统方案
因为是应用AT89C52单片机来实现控制,所以系统总的方案集中在两个部分,一个是硬件结构的设计,一个是控制的总体思想。
在本小节中将对这两部分内容进行简单的叙述。
2.1.1硬件结构
根据项目的功能和要求,可采用AT89C52单片机作为核心控制器。
LED点阵电子钟系统组成包括:
晶振电路模块、显示电路模块、显示行驱动电路模块、电源模块。
2.1.2控制思想
LED点阵电子钟程序主要功能是屏幕显示时间稳定,精确。
所以按照分块设计的方法可以把程序分为主程序、显示程序、计时程序。
主程序主要是用来初始化系统和控制各个子程序之间执行的顺序。
显示程序用来完成数字在LED点阵上的显示,时钟的显示是使用16块8×
计时程序用来完成计时,数时功能。
2.2设计方案论证
由时钟电路经转换子程序转换成适应LED点阵显示屏显示的数据,并通过单片机的输出功能输入到LED点阵显示屏,再通过显示扫描程序,显示出时钟的走时时间。
用计时程序来完成计时,数时功能,再通过单片机综合控制将数字显示出来。
由此可见,通过AT89C52单片机的控制功能,完全可以实现LED点阵显示电子钟。
2.3主要元器件选择
主要用到的硬件有:
AT89C52单片机,8×
8点阵屏,74HC245总线收发器,DS1302实时时钟电路,74HC154译码器,12MHz晶振。
2.3.18×
8点阵显示屏
图2.2为8×
8点阵LED外观及引脚图,其等效电路如图2.3所示,只要其对应的DC、DR轴顺向偏压,即可使LED发亮。
例如如果想使图2.3左上角LED点亮,则DC8=1,DR1=0即可。
应用时限流电阻可以放在DC轴或DR轴。
8×
8点阵LED外观及引脚如图2.2[4]。
图2.2
图2.3为8×
8点阵LED等效电路,由此可以看出点阵是用64个LED组成的。
点阵LED扫描法介绍:
从图2.3中可以看出,8×
8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮。
频率必须大于128赫兹,周期小于7.8毫秒即可符合视觉暂留要求。
此外一次驱动一列或一行(8盏LED)时需外加驱动电路提高电流,否则LED亮度会不足。
图2.3
2.3.274HC245总线收发器
总线收发器(bustransceiver),典型的CMOS型三态缓冲门电路。
由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。
第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。
第2~9脚“A”信号输入输出端,A0=B0、、、、、、A7=B7,A0与B0是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。
如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。
第11~18脚“B”信号输入输出端,功能与“A”端一样,不再描述。
第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。
第10脚GND,电源地。
第20脚VCC,电源正极。
2.3.3DS1302实时时钟电路
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据传送的方法。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>
2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK为时钟输入端。
下图为DS1302的引脚功能:
小时寄存器D7位为12小时/24小时制的选择位,当为1时选12小时制,当为0时选24小时制。
当为1时钟暂停,为0时钟开启。
写保护寄存器的WP为写保护位,当WP=1,写保护,当WP=0未写保护,当对日历、时钟寄存器或片内RAM进行写时WP应清零,当对日历、时钟寄存器或片内RAM进行读时WP一般置1.
2.3.474HC154译码器
74HC154是一款高速CMOS器件,74HC154引脚兼容低功耗肖特基TTL(LSTTL)系列。
74HC154译码器可接受4位高有效二进制地址输入,并提供16个互斥的低有效输出。
74HC154的两个输入使能门电路可用于译码器选通,以消除输出端上的通常译码“假信号”,也可用于译码器扩展。
该使能门电路包含两个“逻辑与”输入,必须置为低以便使能输出端。
任选一个使能输入端作为数据输入,74HC154可充当一个1-16的多路分配器。
当其余的使能输入端置低时,地址输出将会跟随应用的状态。
引脚说明
1-1113-17:
输出端。
(outputs(activeLOW))
12:
Gnd电源地(ground(0V))
18-19:
使能输入端、低电平有效(enableinputs(activeLOW))
20-23:
地址输入端(addressinputs)
24:
VCC电源正(positivesupplyvoltage)
2.3.5AT89C52单片机
微处理器采用AT89C52系列单片机,AT89C52单片机是这几年在我国非常流行的单片机,是一种带8K字节闪存器的高性能单片机,可擦除存储器可以反复擦除100次,具有低功耗,高性能的特点,并且可与工业标准的MSC-51指令集和输出管脚相兼容,对于本设计需要实现的功能,完全可胜任[7]
3硬件电路设计
元器件表
元件名称型号个数用途
单片机AT89C521控制核心
LED点阵8×
816显示电路
总线收发器74HC2454信号功率放大
实时时钟电路DS13021记时
集成块74HC1544行扫描
排阻10K*81上拉电阻
4软件部分设计
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineset_out(X)X=1
#defineclr_out(X)X=0
sbite0=P3^0;
sbite1=P3^1;
sbite2=P3^2;
sbite3=P3^3;
sbitds1302_RST=P3^5;
sbitds1302_IO=P3^7;
//定义DS1302引脚
sbitds1302_SCLK=P3^6;
sbitACC0=ACC^0;
sbitACC7=ACC^7;
chardone,count,temp,flag,up_flag,down_flag,count;
idatauintm,z,l,d;
idatauintc0,c1,c2,c3,c4,c5,c6,c7;
ucharread_Byte();
ucharread_data_ds1302(uchartaddr);
voidwrite_Byte(uchartdata);
voidwrite_data_ds1302(uchartaddr,uchartdata);
voidset_ds1302(uchar*P1302);
voidget_ds1302();
voidinit_ds1302();
ucharinitial_time[]={0x30,0x57,0x17,0x18,0x05,0x01,0x11}
//秒分时日月周年
uchardatanow_time[7];
/*字模0-9*/
ucharcodeled[11][16]={
/*0CHAR_30*/
{0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x18,0x30,0x08,0x20,0x18,0x30,0xF0,0x1F,0xE0,0x0F},
/*1CHAR_31*/
{0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00},
/*2CHAR_32*/
{0x00,0x00,0x70,0x30,0x78,0x38,0x08,0x2C,0x08,0x26,0x88,0x23,0xF8,0x31,0x70,0x30},
/*3CHAR_33*/
{0x00,0x00,0x30,0x18,0x38,0x38,0x88,0x20,0x88,0x20,0xC8,0x31,0x78,0x1F,0x30,0x0E},
/*4CHAR_34*/
{0x00,0x00,0x00,0x07,0xC0,0x07,0xE0,0x24,0x30,0x24,0xF8,0x3F,0xF8,0x3F,0x00,0x24},
/*5CHAR_35*/
{0x00,0x00,0xF8,0x19,0xF8,0x39,0x88,0x21,0x88,0x20,0x88,0x31,0x08,0x1F,0x08,0x0E},
/*6CHAR_36*/
{0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x98,0x31,0x88,0x20,0x98,0x31,0x18,0x1F,0x00,0x0E},
/*7CHAR_37*/
{0x00,0x00,0x38,0x00,0x38,0x00,0x08,0x3F,0xC8,0x3F,0xF8,0x00,0x38,0x00,0x08,0x00},
/*8CHAR_38*/
{0x00,0x00,0x70,0x1C,0xF8,0x3E,0x88,0x23,0x08,0x21,0x88,0x23,0xF8,0x3E,0x70,0x1C},
/*9CHAR_39*/
{0x00,0x00,0xE0,0x00,0xF0,0x31,0x18,0x33,0x08,0x22,0x18,0x33,0xF0,0x1F,0xE0,0x0F},
/*:
CHAR_3A*/
{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00}
};
/*ds1302模块部分*/
ucharread_Byte()//从1302中读出一字节数据
{
uchari;
for(i=8;
i>
0;
i--)
{
ACC=ACC>
>
1;
ACC7=ds1302_IO;
//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿
ds1302_SCLK=1;
ds1302_SCLK=0;
//产生下降沿输出一位数据
}
return(ACC);
}
voidwrite_Byte(uchartdata)//向1302中写入一字节数据
ACC=tdata;
ds1302_IO=ACC0;
//产生上升沿输入数据
voidwrite_data_ds1302(uchartaddr,uchartdata)//向1302中写入地址为taddr的空间写入数据tdata
ds1302_RST=0;
ds1302_RST=1;
write_Byte(taddr);
write_Byte(tdata);
ucharread_data_ds1302(uchartaddr)//从1302中读出地址为taddr的空间数据
{
uchartdata;
tdata=read_Byte();
return(tdata);
voidset_ds1302(uchar*P1302)//
uchartaddr=0x80;
write_data_ds1302(0x8e,0x00);
/*控制命令,WP=0,写操作*/
for(i=7;
i>
i--)
{
write_data_ds1302(taddr,*P1302);
/*秒分时日月星期年*/
P1302++;
taddr+=2;
write_data_ds1302(0x8e,0x80);
/*控制命令,WP=1,写保护*/
voidget_ds1302()
uchark;
uchartaddr=0x81;
for(k=0;
k<
7;
k++)
now_time[k]=read_data_ds1302(taddr);
/*格式为:
秒分时日月星期年*/
taddr+=2;
voiddelay(uintz)
uintx,y;
for(x=z;
z>
z--)
for(y=20;
y>
y--);
}
voiddisplay()
c0=now_time[2]/16;
//显示时十
c1=now_time[2]%16;
c2=10;
c3=now_time[1]/16;
//显示分十
c4=now_time[1]%16;
//显示分
c5=10;
c6=now_time[0]/16;
//显示秒十
c7=now_time[0]%16;
//显示秒
e0=0;
e1=1;
e2=1;
e3=1;
for(m=0;
m<
8;
m++)
P0=P2=0x00;
P1=0xff;
P1=m;
P0=led[c0][2*m];
P2=led[c0][2*m+1];
delay
(1);
for(m=8;
16;
P0=led[c1][2*(m-8)];
P2=led[c1][2*(m-8)+1];
}
e0=1;
e1=0;
e2=1;
for(z=0;
z<
z++)
P1=z;
P0=led[c2][2*z];
P2=led[c2][2*z+1];
}
for(z=8;
P0=led[c3][2*(z-8)];
P2=led[c3][2*(z-8)+1];
e0=1;
e1=1;
e2=0;
for(l=0;
l<
l++)
P1=l;
P0=led[c4][2*l];
P2=led[c4][2*l+1];
for(l=8;
P0=led[c5][2*(l-8)];
P2=led[c5][2*(l-8)+1];
e3=0;
for(d=0;
d<
d++)
P1=d;
P0=led[c6][2*d];
P2=led[c6][2*d+1];
for(d=8;
P0=led[c7][2*(d-8)];
P2=led[c7][2*(d-8)+1];
}
voidmain()
set_ds1302(initial_time);
while
(1)
get_ds1302();
display();
5系统仿真
根据设计要求时钟的显示由LED点阵构成,格式为XX:
XX:
8点阵显示屏能正确显示时间,仿真电路开机画面如下图所示。
从图中可以看出显示的时间为23点1分34秒。
结束语
本次课程设计到现在已经有几个月,回顾其中学到了很多东西。
本设计是一个基于AT89C52的LED点阵显示电子钟,是将电子钟的数字显示用LED点阵的方式来实现的。
本系统硬件少,结构简单,容易实现,性能稳定,成本低。
总结本文的研究工作,主要做了一下几点工作:
通过阅读大量的相关资料,详细了解LED发光原理和LED点阵显示原理,了解LED现状,清楚的了解LED与其他显示器的区别。
并且通过多单片机资料的查阅,更进一步增加了对单片机只是的理解和运用能力。
在本次设计中学会了PROTEUS和KEIL的基本使用,感到PROTUES在电子制图,仿真上的重要性和KEIL作为编程软件的实用性。
课程设计任务书
专业电子信息工程姓名学号
开题日期:
2013年3月1日完成日期:
2012年6月15日
题目单片机LED点阵显示电子钟
一、设计的目的
设计一部基于AT89C52单片机的LED点阵显示电子钟,熟练的运用单片机知识
二、设计的内容及要求
●各部分硬件及其概念
●对应的程序
●Protues仿真
三、指导教师评语
四、成绩
指导教师(签章)
年月日