电子日历时钟.docx

上传人:b****9 文档编号:25286003 上传时间:2023-06-07 格式:DOCX 页数:33 大小:396.54KB
下载 相关 举报
电子日历时钟.docx_第1页
第1页 / 共33页
电子日历时钟.docx_第2页
第2页 / 共33页
电子日历时钟.docx_第3页
第3页 / 共33页
电子日历时钟.docx_第4页
第4页 / 共33页
电子日历时钟.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

电子日历时钟.docx

《电子日历时钟.docx》由会员分享,可在线阅读,更多相关《电子日历时钟.docx(33页珍藏版)》请在冰豆网上搜索。

电子日历时钟.docx

电子日历时钟

课程设计任务书

学院

信息科学与工程学院

专业

计算机科学与技术

学生姓名

朱伟杰

班级学号

1203050116

课程设计题目

电子日历时钟显示器设计

实践教学要求与任务:

1.学习Proteus仿真系统下的原理图设计方法和系统仿真调试方法;

2.掌握简单的51单片机应用系统的软硬件设计方法;

3.学习KeilC51集成开发环境的使用和程序调试方法。

具体任务如下:

(1)通过检索、查资料和研究学习,设计单片机应用系统原理图;

(2)在Keil51集成开发环境下编写应用系统程序;

(3)在Proteus仿真环境下进行软硬件系统调试,实现应用系统设计目标;

(4)写出课程设计报告。

 

工作计划与进度安排:

第16—19周:

布置课程设计任务;

查阅资料;

分组设计原理图;

编写程序代码。

第20周:

系统仿真调试,验收,答辩,编写课程设计报告。

指导教师:

马秀丽刘猛

2014年12月7日

专业负责人:

2014年12月8日

学院教学副院长:

2014年12月8日

成绩评定表

学生姓名

朱伟杰

班级学号

1203050116

专业

计算机科学与技术

课程设计题目

电子日历时钟显示器设计

 

 

组长签字:

成绩

 

日期

年月日

1.设计目的与要求

1.1课程设计目的

1.培养学生文献检索的能力,如何利用Internet检索需要的文献资料。

2.培养学生综合分析问题、发现问题和解决问题的能力。

3.培养学生综合运用知识的能力和工程设计的能力。

4.培养学生理论联系实际的能力。

5.提高学生课程设计报告撰写水平。

1.2设计内容、技术条件和要求

1.2.1设计内容

电子日历时钟系统主要功能为实时时间的显示,以AT89C51单片机为核心芯片,通过DS1302时钟芯片的功能扩展;在共阴极LED数码管上或LM1602液晶显示屏上显示出来。

(1)时钟芯片选用DS1302;

(2)数码管选用4位共阴极动态显示的数码管;

(3)能实时显示年、月、日和时、分、秒,用数码管显示时,要求年、月、日与时、分、秒交替显示,间隔1秒;

(4)可通过按键调节、设置当前时间。

1.2.2设计要求

DS1302时钟芯片的控制设计。

时间调节按键的电路设计。

绘制实现本设计内容的硬件电路(原理图),系统的组成框图。

相应的控制状态表;

编写本课程设计内容的软件设计(包含程序流程图和对程序注释)。

硬件实验部分可选用实验箱测试或Proteus仿真软件实现。

2.系统的组成与工作原理

2.1系统组成

图2.1系统组成原理图

2.2工作原理

设计的题目是电子时钟。

根据设计要求显示正常的年、月、日、时、分、秒。

要想实现上述功能,就必须将硬件系统和软件系统有机的结合在一起,方可实现我们设计任务中的各项要求。

硬件系统主要有单片机AT89C51、DS1302、74LS154等。

AT89C51主要功能是存储程序、根据程序的内容对各个端口进行判断并做出相应的处理。

DS1302主要的功能是控制年、月、日、时、分、秒的显示效果。

根据设计要求,电子日历要显示年、月、日、时、分、秒就需要16个显示数码管,由于数码管的数量较多,必须采用动态显示扫描的方法。

例如07-12-01,首先日分为个位和十位,个位显示到09时,应向日的十位自动进位,即个位清0,十位置1,显示为10,继续累计;当显示为31时,日的十位就应自动向月的个位进位,显示为01,当月显示到09时,月的个位自动向月的十位进位,个位清0,十位置1,即为10,当月至12时,月向年的个位进位,即显示08,同时月、日开始从01月01日继续显示,依次周而复始的循环运行。

根据按键电路可实现年、月、日、时、分、秒的调整,当K1键按下时,可以调整时间,K2、K3键分别对时间进行加或减,K4键可以切换正常模式与省电模式。

利用单片机将RC复位电路、动态显示电路、电源电路、去抖电路等正确的连接在一起,并通过单片机的编程来实现本次设计任务中的要求。

2.3Protues简介

Protues软件是英国Labcenterelectronics公司出版的EDA工具软件。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机与外围器件。

它是目前最好的仿真单片机与外围器件的工具。

虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

迄今为止是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。

在编译方面,它也支持IAR、Keil和MATLAB等多种编译

2.4KeilC51简介

KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。

如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

 

3.器件的功能和作用

3.1AT89C51简介

AT89C51各引脚结构如图3.1所示:

图3.1AT89C51引脚图

VCC:

电源电压

GND:

接地

P0口:

P0口是一组8位漏极开路双向I/O口,即地址/数据总线复用口。

作为输出口时,每一个管脚都能够驱动8个TTL电路。

当“1”被写入P0口时,每个管脚都能够作为高阻抗输入端。

P0口还能够在访问外部数据存储器或程序存储器时,转换地址和数据总线复用,并在这时激活内部的上拉电阻。

P0口在闪烁编程时,P0口接收指令,在程序校验时,输出指令,需要接电阻。

P1口:

P1口一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动4个TTL电路。

对端口写“1”,通过内部的电阻把端口拉到高电平,此时可作为输入口。

因为内部有电阻,某个引脚被外部信号拉低时输出一个电流。

闪烁编程时和程序校验时,P1口接收低8位地址。

P2口:

P2口是一个内部带有上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL电路。

对端口写“1”,通过内部的电阻把端口拉到高电平,此时,可作为输入口。

因为内部有电阻,某个引脚被外部信号拉低时会输出一个电流。

在访问外部程序存储器或16位地址的外部数据存储器时,P2口送出高8位地址数据。

在访问8位地址的外部数据存储器时,P2口线上的内容在整个运行期间不变。

闪烁编程或校验时,P2口接收高位地址和其它控制信号。

P3口:

P3口是一组带有内部电阻的8位双向I/O口,P3口输出缓冲故可驱动4个TTL电路。

对P3口写如“1”时,它们被内部电阻拉到高电平并可作为输入端时,被外部拉低的P3口将用电阻输出电流。

P3口除了作为一般的I/O口外,更重要的用途是它的第二功能,具体如下:

P3.0--RXD,P3.1--TXD,P3.2--INT0,P3.3--INT1,P3.4--T0,P3.5--T1,P3.6--WR,P3.7--RD。

P3口还接收一些用于闪烁存储器编程和程序校验的控制信号。

RST:

复位输入。

当震荡器工作时,RET引脚出现两个机器周期以上的高电平将使单片机复位。

ALE/:

当访问外部程序存储器或数据存储器时,ALE输出脉冲用于锁存地址的低8位字节。

即使不访问外部存储器,ALE以时钟震荡频率的1/16输出固定的正脉冲信号,因此它可对输出时钟或用于定时目的。

要注意的是:

每当访问外部数据存储器时将跳过一个ALE脉冲时,闪烁存储器编程时,这个引脚还用于输入编程脉冲。

如果必要,可对特殊寄存器区中的8EH单元的D0位置禁止ALE操作。

这个位置后只有一条MOVX和MOVC指令ALE才会被应用。

此外,这个引脚会微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:

程序储存允许输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器读取指令时,每个机器周期两次PSEN有效,即输出两个脉冲。

在此期间,当访问外部数据存储器时,这两次有效的PSEN信号不出现。

EA/VPP:

外部访问允许。

欲使中央处理器仅访问外部程序存储器,EA端必须保持低电平。

需要注意的是:

如果加密位LBI被编程,复位时内部会锁存EA端状态。

如EA端为高电平,CPU则执行内部程序存储器中的指令。

闪烁存储器编程时,该引脚加上+12V的编程允许电压VPP,当然这必须是该器件是使用12V编程电压VPP。

XTAL1:

片内振荡器反相放大器和时钟发生线路的输入端。

使用片内振荡器时,连接外部石英晶体和微调电容。

XTAL2:

片内振荡器反相放大器的输出端。

当使用片内振荡器时,外接石英晶体和微调电容。

 

3.2DS1302简介

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

结构如图3.2所示:

图3.2DS1302引脚图

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

DS1302的管脚排列与描述如下图与表所示

X1、X2:

32.768KHZ晶振接入引脚。

GND:

地。

RST:

复位引脚,低电平有效。

I/O:

数据输入/输出引脚,具有三态功能。

SCLK:

串行时钟输入引脚。

VCC1:

工作电源引脚。

VCC2:

备用电源引脚。

 

3.3LM016L简介

1602采用标准的16脚接口,结构如图3.3所示:

图3.3LMO16L

其中:

VSS:

为电源地

VDD:

接5V电源正极

VEE:

为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

RS:

为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

RW:

为读写信号线,高电平

(1)时进行读操作,低电平(0)时进行写操作。

E(或EN):

为使能(enable)端,高电平

(1)时读取信息,负跳变时执行指令。

D0~D7:

为8位双向数据端。

 

表3.1指令集表

指令码

功能

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

清除显示

0

0

0

0

0

0

0

0

0

1

将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"

地址归位

0

0

0

0

0

0

0

0

1

X

设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;

显示状态开/关

0

0

0

0

0

0

1

D

C

B

[D=1:

整体显示ON][C=1:

游标ON]

[B=1:

游标位置反白允许]

进入点设定

0

0

0

0

0

0

0

1

I/D

S

指定在数据的读取与写入时,设定游标的移动方向与指定显示的移位

游标或显示移位控制

0

0

0

0

0

1

S/C

R/L

X

X

设定游标的移动与显示的移位控制位;这个指令不改变DDRAM的内容

功能设定

0

0

0

0

1

DL

X

RE

X

X

[DL=0/1:

4/8位数据]

[RE=0/1:

基本指令操作/扩充指令操作]

设定CGRAM地址

0

0

0

1

AC5

AC4

AC3

AC2

AC1

AC0

设定CGRAM地址

设定DDRAM地址

0

0

1

0

AC5

AC4

AC3

AC2

AC1

AC0

设定DDRAM地址(显示位址)

[第一行:

80H-A7H]

[第二行:

C0H-E7H]

读取忙标志和地址

0

1

BF

AC6

AC5

AC4

AC3

AC2

AC1

AC0

读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值

写数据到RAM

1

0

数据

将数据D7——D0写入到内部的RAM

读出RAM的值

1

1

数据

从内部RAM读取数据D7——D0

4系统硬件设计

电子日历时钟系统主要功能为实时时间的显示,以AT89C51单片机为核心芯片,通过DS1302时钟芯片的功能扩展;在共阴极LED数码管上或LM1602液晶显示屏上显示出来。

原理图如图4.1所示:

图4.1系统原理图

 

5.系统软件设计

5.1程序流程图

软件设计分为:

动态扫描、主程序、系统资源分配和软件模块几部分,在此设计中采用定时器来完成动态扫描显示。

用定时器T0定20ms的时间间隔,每次定时时间到时就输出一个LED信号,即显示一位。

主程序初始化后,就开始进行对DS1302的读时间;读完后送显示缓冲区,同时并对定时时间进行判断比较。

DS1302的地址由114字节的用户RAM存放。

10字节的存放实时时钟时间\日历和定闹RAM与用于控制和状态的4字节特殊寄存器组成,几乎所有的128个字节直接读写。

设计程序有:

主程序、读取时间的子程序和显示刷新程序。

图5.1程序流程图

5.2程序清单与程序功能注释

#include//包含单片机寄存器的头文件

#include//包含_nop_()函数定义的头文件

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

以下是DS1302芯片的操作程序

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

unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字

sbitDATA=P1^7;//位定义1302芯片的接口,数据输出端定义在P1.7引脚

sbitRST=P1^5;//位定义1302芯片的接口,复位端口定义在P1.5引脚

sbitSCLK=P1^6;//位定义1302芯片的接口,时钟输出端口定义在P1.6引脚

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

函数功能:

延时若干微秒

入口参数:

n

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

voiddelaynus(unsignedcharn)

{

unsignedchari;

for(i=0;i

;

}

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

函数功能:

向1302写一个字节数据

入口参数:

x

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

voidWrite1302(unsignedchardat)

{

unsignedchari;

SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备

delaynus

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续写8个二进制位数据

{

DATA=dat&0x01;//取出dat的第0位数据写入1302

delaynus

(2);//稍微等待,使硬件做好准备

SCLK=1;//上升沿写入数据

delaynus

(2);//稍微等待,使硬件做好准备

SCLK=0;//重新拉低SCLK,形成脉冲

dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位

}

}

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

函数功能:

根据命令字,向1302写一个字节数据

入口参数:

Cmd,储存命令字;dat,储存待写的数据

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

voidWriteSet1302(unsignedcharCmd,unsignedchardat)

{

RST=0;//禁止数据传递

SCLK=0;//确保写数居前SCLK被拉低

RST=1;//启动数据传输

delaynus

(2);//稍微等待,使硬件做好准备

Write1302(Cmd);//写入命令字

Write1302(dat);//写数据

SCLK=1;//将时钟电平置于已知状态

RST=0;//禁止数据传递

}

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

函数功能:

从1302读一个字节数据

入口参数:

x

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

unsignedcharRead1302(void)

{

unsignedchari,dat;

delaynus

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续读8个二进制位数据

{

dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位

if(DATA==1)//如果读出的数据是1

dat|=0x80;//将1取出,写在dat的最高位

SCLK=1;//将SCLK置于高电平,为下降沿读出

delaynus

(2);//稍微等待

SCLK=0;//拉低SCLK,形成脉冲下降沿

delaynus

(2);//稍微等待

}

returndat;//将读出的数据返回

}

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

函数功能:

根据命令字,从1302读取一个字节数据

入口参数:

Cmd

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

unsignedcharReadSet1302(unsignedcharCmd)

{

unsignedchardat;

RST=0;//拉低RST

SCLK=0;//确保写数居前SCLK被拉低

RST=1;//启动数据传输

Write1302(Cmd);//写入命令字

dat=Read1302();//读出数据

SCLK=1;//将时钟电平置于已知状态

RST=0;//禁止数据传递

returndat;//将读出的数据返回

}

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

以下是对液晶模块的操作程序

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

sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚

sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚

sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚

sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚

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

函数功能:

延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

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

voiddelay1ms()

{

unsignedchari,j;

for(i=0;i<10;i++)

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

;

}

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

函数功能:

延时若干毫秒

入口参数:

n

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

voiddelaynms(unsignedcharn)

{

unsignedchari;

for(i=0;i

delay1ms();

}

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

函数功能:

判断液晶模块的忙碌状态

返回值:

result。

result=1,忙碌;result=0,不忙

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

bitBusyTest(void)

{

bitresult;

RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;//E=1,才允许读写

_nop_();//空操作

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

result=BF;//将忙碌标志电平赋给result

E=0;//将E恢复低电平

returnresult;

}

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

函数功能:

将模式设置指令或显示地址写入液晶模块

入口参数:

dictate

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

voidWriteInstruction(unsignedchardictate)

{

while(BusyTest()==1);//如果忙就等待

RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;//E置低电平

//就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

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

当前位置:首页 > 成人教育 > 专升本

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

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