电子日历时钟.docx
- 文档编号:25286003
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:33
- 大小:396.54KB
电子日历时钟.docx
《电子日历时钟.docx》由会员分享,可在线阅读,更多相关《电子日历时钟.docx(33页珍藏版)》请在冰豆网上搜索。
电子日历时钟
课程设计任务书
学院
信息科学与工程学院
专业
计算机科学与技术
学生姓名
朱伟杰
班级学号
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
/***********************************************************************
以下是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_();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 日历 时钟