基于DS1302的电子时钟设计报告.docx
- 文档编号:9146839
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:988.60KB
基于DS1302的电子时钟设计报告.docx
《基于DS1302的电子时钟设计报告.docx》由会员分享,可在线阅读,更多相关《基于DS1302的电子时钟设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
基于DS1302的电子时钟设计报告
常熟理工学院
电气与自动化工程学院
《微机原理与接口技术》课程设计
题目:
基于DS1302的电子钟设计
姓名:
祝朝贺
学号:
160512231
班级:
测控122班
指导教师:
陈景波
起止日期:
2015年7月
摘要
电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。
另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。
本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。
本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:
电子时钟;多功能;AT89C52;时钟日历芯片
《微机原理与接口技术》课程设计任务书
一、设计要求
DS1302是DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、时、分、秒进行计时,且具有闰年补偿功能,工作电压为2.5~5.5V。
DS1302采用三线接口,与CPU进行同步通信,并可采用突发方式一次传送多个字节的时间数据或RAM数据。
DS1302内部有一个31X8的用于临时性存放数据的RAM存储器。
本课题要求设计一基于DS1302的电子钟,该系统基本要求包含时钟显示模块可用数码管显示。
拨动拨码开关可以分别显示时间以及日历。
二、总体设计方案
2.1设计框图
按照系统设计功能的要求,初步确定设计系统由主控模块、时钟模块、存储模块、键盘接口模块、显示模块和闹铃模块共6个模块组成,电路系统构成框图如图所示。
主控芯片使用52系列AT89C52单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时芯片DS1302,存储模块采用美国ATMEL公司生产的低功耗CMOS串行EEPROM存储芯片AT24C02。
DS1302作为主要计时芯片,可以做到计时准确。
更重要的是,DS1302可以在很小的后备(2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流来对后备电源进行快速充电,可以保证后备电源基本不耗电。
图2-1电路系统构成图
2.2模块说明
2.2.1DS1302模块
1、DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设臵备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。
需要强调的是,DS1302需要使用32.768KHz的晶振。
2、DS1302的性能特性
(1)实时时钟,可对秒、分、时、日、周、月及带闰年补偿的年进行比较;
(2)用于高速数据暂存的31*8位RAM;
(3)最少引脚的串行I/O;
(4)2.5~5.5V电压工作范围;
(5)2.5V时耗小于300nA;
(6)用于时钟或RAM数据读/写的单字节或多字节数据传送方式;
(7)简单的三线接口;
DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被访问到。
在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。
时钟脉冲的个数在单字节方式下为8+8,在多字节方式下为8+字节数,最大可达248字节数。
如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST脚必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
3、DS1302引脚说明
图2-2DS1302芯片引脚图
引脚号
名称
功能
1
Vcc1
备份电源输入
2
X1
32.786KHz晶振输入
3
X2
32.786KHz晶振输出
4
GND
地
5
RST
控制移位寄存器/复位
6
I/O
数据输入/输出
7
SCLK
串行时钟
8
Vcc2
主电源输入
表2.2引脚功能说明
三、硬件电路设计
3.1单片机最小系统
3.1.1系统结构
总线型单片机非总线应用的最小系统示意图如图3-2所示,只有单片机和时钟电路、复位电路构成的最简单电路,并行总线不用于外围扩展,可作为应用系统的I/O口使用。
图3-2总线型单片机非总线应用的最小系统
3.1.2系统特点
(1)有大量可使用的I/O口;
(2)没有并行扩展,应用系统结构简单;
3.2时钟电路设计
DS1302是DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿功能,工作电压为2.5~5.5V。
DS1302采用三线接口,与CPU进行同步通信,并可采用突发方式一次传送多个字节的时间数据或RAM数据。
DS1302内部有一个31X8的用于临时性存放数据的RAM存储器。
时钟设计电路图如图3-3所示。
图3-3DS1302时钟电路
3.3数码管显示设计
本设计采用8255数码管显示,初始化程序是,数码管显示器有两种显示类型,第一种显示时间,第二种显示日历。
运行程序时,可通过拨码开关对数码管显示器上显示的类型进行转换。
3.4键盘电路
本设计共采用拨码开关的方式,通过拨动拨码开关P1.1实现数字时间与日历的相互转换,当P1.1=1时,数码管显示的是时间,当P1.1=0时,数码管显示的是日历。
如图3-6。
图3-6拨码开关电路
四、软件设计
4.1主程序流程
为了实现时间和日期的显示功能,需要在DS1302中读取时间和日期,并送数码管中显示,这样需要DS1302模块和数码管模块、DS1302的时间日期的读取程序、数码管的显示程序。
系统主程序流程图如图所示。
系统首先对DS1302和定时器0初始化后,只是调用按键处理子程序。
程序在定时器0中断服务程序中,定时读取DS1302的时间和日期送数码管显示。
DS1302电子钟主程序框图
4.2时钟电路设计
五、程序调试与运行结果
5.1程序调试
分步骤进行调试,对每一个子程序进行编译链接后,将整个程序全部编译,生成HEX文件加载到单片机上,进行仿真。
出现错误和警告时要进行分析,解决问题。
当将程序下载到试验箱上时,数码管显示时间、年月日,当拨动拨码开关P1.1=1时,数码管显示时、分、秒时间计时,当拨动拨码开关P1.1=0时,数码管显示年、月、日万年历计日。
这与预期的效果是一致的。
5.2日历显示
2015年7月9日
5.2.1日历显示子程序
voiddisp_year(void)
{
year=Read1302(READ_YEAR);
month=Read1302(READ_MONTH);
day=Read1302(READ_DAY);
segdisplay(1,2);
segdisplay(2,0);
segdisplay(3,1);
segdisplay(4,5);//年
segdisplay(5,month/10%10);
segdisplay(6,month%10);//月
segdisplay(7,day/10%10);
segdisplay(8,day%10);//日
}
5.3时间显示
06:
43:
42
5.3.1时间显示子程序
voiddisp_time(void)
{
hour=Read1302(READ_HOUR);
min=Read1302(READ_MINUTE);
sec=Read1302(READ_SECOND);
segdisplay(1,hour/10%10);
segdisplay(2,hour%10);//时
segdisplay(4,min/10%10);
segdisplay(5,min%10);//分
segdisplay(7,sec/10%10);
segdisplay(8,sec%10);//秒
segdisplay(9,16);//横杠
}
六、附录
实验电路程序
Main主函数
/*包含51头文件*/
#include
#include
#include
#include"DS1302.h"
sbitsj=P1^1;
sbitLE_WEI=P3^7;
sbitsetj=P1^3;
voiddelay500(void)//延时500us
{
unsignedchara;
for(a=55;a>0;a--);
}
voidmain(void)
{
while
(1)
{
if(sj==1)
{
disp_time();
delay500();
}
//显示日历
if(sj==0)
{
LE_WEI=1;
P0=0xff;
LE_WEI=0;
disp_year();
delay500();
}
//显示时间
}
}
DS1302模块程序
/*包含51头文件*/
#include
#include
#include
#include"DS1302.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitLE_LED=P3^5;
sbitLE_WEI=P3^7;
sbitLE_DUAN=P3^6;
unsignedintyear,month,day;
unsignedinthour,min,sec;
ucharcodedisp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//段选码
ucharcodedula[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xdb};//位选码
voidWrite1302(unsignedcharaddr,dat)
{
unsignedchari,temp;
CE=0;//CE引脚为低,数据传送中止
SCK=0;//清零时钟总线
CE=1;//CE引脚为高,逻辑控制有效
//发送地址
for(i=8;i>0;i--)//循环8次移位
{
SCK=0;
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1;//右移一位
SCK=1;
}
//发送数据
for(i=8;i>0;i--)
{
SCK=0;
temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
SCK=1;
}
CE=0;
}
//数据读取子程序
unsignedcharRead1302(unsignedcharaddr)
{
unsignedchari,temp,dat1,dat2;
CE=0;
SCK=0;
CE=1;
//发送地址
for(i=8;i>0;i--)//循环8次移位
{
SCK=0;
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1;//右移一位
SCK=1;
}
//读取数据
for(i=8;i>0;i--)
{
ACC_7=DIO;
SCK=1;
ACC>>=1;
SCK=0;
}
CE=0;
dat1=ACC;
dat2=dat1/16;//数据进制转换
dat1=dat1%16;//十六进制转十进制
dat1=dat1+dat2*10;
return(ACC);
}
//初始化DS1302
voidDS1302_init(void)
{
Write1302(WRITE_PROTECT,0X00);//禁止写保护
Write1302(WRITE_SECOND,0x0);//秒位初始化
Write1302(WRITE_MINUTE,0x45);//分钟初始化
Write1302(WRITE_HOUR,0x19);//小时初始化
Write1302(WRITE_DAY,0x20);//日初始化
Write1302(WRITE_MONTH,0x07);//月初始化
Write1302(WRITE_WEEK,0x06);//星期初始化
Write1302(WRITE_YEAR,0x13);//年初始化
Write1302(WRITE_PROTECT,0x80);//允许写保护
}
voidUart1_Init(void)//2400bps@12MHz
{
TMOD=0x20;
SCON=0x50;
TH1=0xF3;
TL1=0xF3;
TR1=1;
TI=1;
EA=1;
}
voiddelay500us(unsignedinttime)//延时500us
{
unsignedchari;
while(time--)
{
for(i=0;i<55;i++);
}
}
voidsegdisplay(ucharwei,ucharduan)
{
LE_WEI=1;
P0=dula[0];
LE_WEI=0;
LE_DUAN=1;
P0=disp[duan];
LE_DUAN=0;
LE_WEI=1;
P0=dula[wei];
LE_WEI=0;
delay500us(5);
}
voiddisp_time(void)
{
hour=Read1302(READ_HOUR);
min=Read1302(READ_MINUTE);
sec=Read1302(READ_SECOND);
segdisplay(1,hour/10%10);
segdisplay(2,hour%10);//时
segdisplay(4,min/10%10);
segdisplay(5,min%10);//分
segdisplay(7,sec/10%10);
segdisplay(8,sec%10);//秒
segdisplay(9,16);//横杠
}
voiddisp_year(void)
{
year=Read1302(READ_YEAR);
month=Read1302(READ_MONTH);
day=Read1302(READ_DAY);
segdisplay(1,2);
segdisplay(2,0);
segdisplay(3,1);
segdisplay(4,5);//年
segdisplay(5,month/10%10);
segdisplay(6,month%10);//月
segdisplay(7,day/10%10);
segdisplay(8,day%10);//日
}
七、心得与体会
通过今次单片机实训,使我对单片机的认识有了更深刻的理解。
系统以51单片机为核心部件,利用汇编软件编程,通过键盘控制和数码管显示实现了基本时钟显示功能、时间调节功能,能实现本设计题目的基本要求和发挥部分。
由于时间有限和本身知识水平的限制,本系统还存在一些不够完善的地方,要作为实际应用还有一些具体细节问题需要解决。
例如:
不能实现只用两个按键来控制时钟时间,还不能实现闹钟等扩展功能。
踉踉跄跄地忙碌了两周,我的时钟程序终于编译成功。
当看着自己的程序,自己成天相伴的系统能够健康的运行,真是莫大的幸福和欣慰。
我相信其中的酸甜苦辣最终都会化为甜美的甘泉。
但在这次实训中同时使我对汇编语言有了更深的认识。
当我第一次接触汇编语言就感觉很难,特别是今次实训要用到汇编语言,尽管困难重重,可我们还是克服了。
这次的实训使培养了我们严肃认真的做事作风,增强了我们之间的团队合作能力,使我们认识到了团队合作精神的重要性。
这次实训的经历也会使我终身受益,我感受到这次实训是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。
希望这次的经历能让我在以后学习中激励我继续进步。
八、参考文献
[1]姜志海,赵艳雷,陈松.单片机的C语言程序设计与应用[M].北京:
电子工业出版社,2013,107~115.
[2]林立.单片机原理及应用——基于Proteus和KeilC[M].北京:
电子工业出版社,2009.
[3]郑峰王巧芝程丽平张清鹏.51单片机典型应用开发范例大全.北京:
中国铁道出版社,2011.10.
[4]孙俊喜.LCD驱动电路、驱动程序设计及典型应用.北京:
人民邮电出版社出版发行,2009.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DS1302 电子 时钟 设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)