根据单片机的电子时钟6位LED数码管显示.docx

上传人:b****8 文档编号:9544857 上传时间:2023-02-05 格式:DOCX 页数:14 大小:54.01KB
下载 相关 举报
根据单片机的电子时钟6位LED数码管显示.docx_第1页
第1页 / 共14页
根据单片机的电子时钟6位LED数码管显示.docx_第2页
第2页 / 共14页
根据单片机的电子时钟6位LED数码管显示.docx_第3页
第3页 / 共14页
根据单片机的电子时钟6位LED数码管显示.docx_第4页
第4页 / 共14页
根据单片机的电子时钟6位LED数码管显示.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

根据单片机的电子时钟6位LED数码管显示.docx

《根据单片机的电子时钟6位LED数码管显示.docx》由会员分享,可在线阅读,更多相关《根据单片机的电子时钟6位LED数码管显示.docx(14页珍藏版)》请在冰豆网上搜索。

根据单片机的电子时钟6位LED数码管显示.docx

根据单片机的电子时钟6位LED数码管显示

数码管显示电子时钟设计

一.功能要求

1.数字电子时钟最主要是LED数码管显示功能,以24小时为一个周期,显示时

间时、分、秒。

2.具有校时功能,可以对时、进行单独校对,使其校正到标准时间。

二.方案论证

1.数字时钟方案

数字时钟是本设计的最主要的部分。

根据需要,可利用两种方案实现。

方案一:

本方案采用Dallas公司的专用时钟芯片DS12887A。

该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。

为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。

当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。

而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

方案二:

本方案完全用软件实现数字时钟。

原理为:

在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。

利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。

该方案具有硬件电路简单的特点。

但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。

而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。

基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。

2.数码管显示方案

方案一:

静态显示。

所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。

该方式每一位都需要一个8位输出口控制。

静态显示时较小的电流能获得较高的亮度,且字符不闪烁。

但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。

方案二:

动态显示。

所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。

利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。

显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。

调整参数可以实现较高稳定度的显示。

动态显示节省了I/O口,降低了能耗。

从节省I/O口和降低能耗出发,本设计采用方案二。

3.计时方案

利用AT89S51单片机内部的定时/计数器进行中断时,配合软件延时实现时、分、秒的计时。

该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。

4.控制方案

AT89S51的P0口和P2口外接由八个LED数码管(LED8~LED1)构成的显示器,用P0口作LED的段码输出口,P2口作八个LED数码管的位控输出线,P1口外接四个按键A、B、C构成键盘电路。

AT89S51是一种低功耗,高性能的CMOS8位微型计算机。

它带有8KFlash可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片内Flash集成在一个芯片上,可用与解决复杂的问题,且成本较低。

简易电子钟的功能不复杂,采用其现有的I/O便可完成,所以本设计中采用此的设计方案。

三.系统硬件电路的设计

根据以上的电子时钟的设计要求可以分为以下的几个硬件电路模块:

单片机模块、数码显示模块与按键模块,模块之间的关系图如下面得方框电路图1所示

图1硬件电路方框图

1.单片机模块设计

1.1芯片分析

AT89C51单片机引脚图如下:

图2AT89C51引脚图

MCS-51单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下:

VCC:

+5V电源。

VSS:

接地。

RST:

复位信号。

当输入的复位信号延续两个机器周期以上的高电平时即为有效,用完成单片机的复位初始化操作。

XTAL1和XTAL2:

外接晶体引线端。

当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。

P0口:

P0口为一个8位漏极开路双向I/O口,当作输出口使用时,必须接上拉电阻才能有高电平输出;当作输入口使用时,必须先向电路中的锁存器写入“1”,使FET截止,以避免锁存器为“0”状态时对引脚读入的干扰。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,它不再需要多路转接电路MUX;因此它作为输出口使用时,无需再外接上拉电阻,当作为输入口使用时,同样也需先向其锁存器写“1”,使输出驱动电路的FET截止。

P2口:

P2口电路比P1口电路多了一个多路转接电路MUX,这又正好与P0口一样。

P2口可以作为通用的I/O口使用,这时多路转接电路开关倒向锁丰存器Q端。

P3口:

P3口特点在于,为适应引脚信号第二功能的需要,增加了第二功能控制逻辑。

当作为I/O口使用时,第二功能信号引线应保持高电平,与非门开通,以维持从锁存器到输出端数据输出通路的畅通。

当输出第二功能信号时,该位应应置“1”,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出。

MCS-51单片机共有4个双向的8位并行I/O端口(Port),分别记作P0-P3,共有32根口线,各口的每一位均由锁存器、输出驱动器和输入缓冲器所组成。

实际上P0-P3已被归入特殊功能寄存器之列。

这四个口除了按字节寻址以外,还可以按位寻址。

由于它们在结构上有一些差异,故各口的性质和功能有一些差异。

P0口是双向8位三态I/O口,此口为地址总线(低8位)及数据总线分时复用口,可驱动8个LS型TTL负载。

P1口是8位准双向I/O口,可驱动4个LS型负载。

P2口是8位准双向I/O口,与地址总线(高8位)复用,可驱动4个LS型TTL负载。

P3口是8位准双向I/O口,是双功能复用口,可驱动4个LS型TTL负载。

P1口、P2口、P3口各I/O口线片内均有固定的上拉电阻,当这3个准双向I/O口做输入口使用时,要向该口先写“1”,另外准双向I/O口无高阻的“浮空”状态,故称为双向三态I/O口。

时钟电路用于产生MCS-51单片机工作时所必需的时钟信号。

MCS-51单片机本身就是一个复杂的同步时序电路,为保证同步工作方式的实现,MCS-51单片机应在唯一的时钟信号控制下,严格地按时序执行进行工作,而时序所研究的是指令执行中各个信号的关系。

在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定的操作。

CPU发出的时序信号有两类,一类用于片内对各个功能部件的控制,这列信号很多。

另一类用于片外存储器或I/O端口的控制,这部分时序对于分析、设计硬件接口电路至关重要。

这也是单片机应用系统设计者普遍关心的问题。

1.2数码显示模块设计

系统采用动态显示方式,用P0口来控制LED数码管的段控线,而用P2口来控制其位控线。

动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。

图3数码显示电路

1.3按键模块

下图为按键模块电路原理图,A为复位键,B为时钟调控键,C为分钟调控键。

图4按键模块电路原理图

四.系统程序的设计

软件设计分析

显示的效果为动态显示,利用CPU控制数码管显示的选通和停止,通过定时器中断不断扫描,从而实现数据的动态显示。

在编程上,首先进行了初始化,定义程序的的入口地址以及中断的入口地址,在主程序开始定义了一组固定单元用来储存计数的时.分.秒,在显示初值之后,进入主循环。

在主程序中,对不同的按键进行扫描,实现秒表,时间调整,复位清零等功能,系统总流程图如下图5:

图5系统总体流程图

五.调试及性能分析

电子时钟主要的设计要求是能够实现时钟的一般功能,以及包括时间的调整功能,这个基于单片机的电子时钟基本上实现了上述功能,能够通过时间调整电路对时间进行调整以及复位。

下述为18:

30:

30的仿真图:

 

首先确保各器件的完好性,其次检测各芯片的电源线和地线是否接触良好,然后焊接器件,接好电源用万用表检测各电源端、地端的状态是否正常。

检查无误后插上AT89S51并烧写一简易的程序,观察电路是否能协同工作。

最后烧写工作程序,根据显示现象调试程序直至成功。

上电运行时,数码管开始显示00:

00:

00,时钟开始走时。

程序的编写和调试是一个比较复杂的过程。

由于对C语言知识的薄弱,所以在编译过程中总是有很多语法上的错误,但是在和同学一起讨论研究后,程序是编写出来了,但结合到硬件调试中又出现各种问题。

在调试过程中出现了很多问题,在第一次把程序烧到单片机里,通电运行时,虽然控制时、分、秒的按钮能够对数码管显示进行调整,但是数码管全亮,不能通过按键变化显示,更改程序中的问题,但是调时设置又没有用了。

经过检查及修改,

终于完成了所做的设计,不容易啊。

六.控制源程序清单

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

/*七段共阴管显示定义*/

ucharcodedispcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,

0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};

/*定义并初始化变量*/

ucharseconde=0;

ucharminite=0;

ucharhour=12;

ucharmstcnt=0;

sbitP1_0=P1^0;//second调整定义

sbitP1_1=P1^1;//minite调整定义

sbitP1_2=P1^2;//hour调整定义

/*函数声明*/

voiddelay(uchark);//延时子程序

voidtime_pro();//时间处理子程序

voiddisplay();//显示子程序

voidkeyscan();//键盘扫描子程序

/*****************************/

/*延时子程序*/

/****************************/

voiddelay(uchark)

{

ucharj;

while((k--)!

=0)

{

for(j=0;j<125;j++)

{;}

}

}

/**************************/

/*时间处理子程序*/

/**************************/

voidtime_pro(void)

{

if(seconde==60)//秒钟设为60进制

{seconde=0;

minite++;

if(minite==60)//分钟设为60进制

{minite=0;

hour++;

if(hour==24)//时钟设为24进制

{hour=0;}

}

}

}

/*****************************/

/*显示子程序*/

/*****************************/

voiddisplay(void)

{

P2=0xfe;

P0=dispcode[hour/10];//显示小时的十位

delay(4);

P2=0xfd;

P0=(dispcode[(hour%10)])|0X80;//显示小时的个位

delay(4);

P2=0xfb;

P0=dispcode[minite/10];//显示分的十位

delay(4);

P2=0xf7;

P0=(dispcode[minite%10])|0X80;//显示分的个位

delay(4);

P2=0xef;

P0=dispcode[seconde/10];//显示秒的十位

delay(4);

P2=0xdf;

P0=dispcode[seconde%10];//显示秒的个位

delay(4);

}

/*******************************/

/*键盘扫描子程序*/

/*******************************/

voidkeyscan(void)

{

if(P1_0==0)//按键1秒的调整

{

delay(30);

if(P1_0==0)

{

seconde++;

if(seconde==60)

{seconde=0;}

}

}

if(P1_1==0)//按键2分的调整

{

delay(30);

if(P1_1==0)

{

minite++;

if(minite==60)

{minite=0;}

}

}

if(P1_2==0)//按键3小时的调整

{

delay(30);

if(P1_2==0)

{

hour++;

if(hour==24)

{hour=0;}

}

}

}

voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次

{

TH0=0x3c;

TMOD=0x11;

mstcnt++;

if(mstcnt==20)

{

seconde++;

mstcnt=0;//注意点。

对计数单元的清零十分的重要,本次调试中就是

}//因为忽略了这一点,给我早成了很大的被动。

}

/**************************/

/*主函数*/

/**************************/

voidmain(void)

{P1=0xff;//初始化p1口,全设为1

TMOD=0x11;//time0为定时器,方式1

TH0=0x3c;//预置计数初值

TL0=0xb0;

EA=1;

ET0=1;

TR0=1;

while

(1)

{

keyscan();//按键扫描

time_pro();//时间处理

display();//显示时间

}

}

 

附录.元器件清单

序号

元件名称

规格型号/参数

数量(个)

备注

1

单片机

AT89S52

1

2

显示驱动三极管

A1013

6

3

电容

30pF

2

4

电容

22μF

1

5

按键

BUTTON

3

6

排阻

RESPACK-8/10K

1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1