基于DS1302与LCD1602的电子日历时钟的设计与实现

更新时间:2023-03-08 05:14:23 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

武汉纺织大学高职学院

毕业设计(论文)

2014— 2015学年第 1 学期

题目: 基于DS1302与LCD1602的电子日历时

钟的设计与实现

学生姓名 曹强 学 号 1218092183 指导教师 王骏 评阅教师

时 间 2014年10月

武汉纺织大学高职学院毕业设计(论文)开题报告

课题名称(来源、类型):

基于 DS1302 与 1602LCD 电子日历时钟的设计与实现 指导教师: 王骏 学生姓名: 曹强

开题报告内容:(调研资料的准备,设计/论文的目的、要求、思路与预期成果;

任务完成的阶段内容及时间安排;完成设计(论文)所具备的条件因素等。)

1. 目的:实现日历和时钟的显示并且能够调整

2. 要求:完成电子日历和时钟的软件和硬件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,控制程序的编写等。 3. 预期成果:仿真成功,做出实物。

(1) 显示初始值 日历时钟初始值;

4. 时间安排:第3周:熟悉课题的基本要求,查阅相关资料,初步拟定设计的

整体方案,完成开题报告。

第4-5周:自学这次课题所涉及的相关内容,包括器件基础知识、单片机,DS1302时钟芯片工作原理和相关软件的使用以及LCD1602液晶显示屏的相关内容。并设计一些简单的实际电路,熟练所学内容并加以巩固。

第6-8周:设计DS1302时钟模块的控制电路、LCD1602液晶显示电路、电源电路等硬件电路,并用Proteus仿真

第8-10周:焊接调试电路,根据个部分的作用对硬件进行调试,最后联机调试。

第10-12周:写毕业设计论文,作品展示,完成全部毕业设计

指导教师签名: 日期: 2014年

2

目 录

摘 要 .................................................... 1 关键词 ................................................... 1 Abstract ................................................. 2 Key Words ............................................... 2 第一章 设计要求与方案论证 ............................... 3 1.1 设计要求: ........................................ 3 1.2 系统基本方案选择和论证 ............................ 3 1.2.1 单片机芯片的选择方案和论证 ................... 3 1.2.2 显示模块选择方案和论证 ....................... 3 1.2.3 时钟芯片的选择方案和论证 ..................... 3 1.3 电路设计最终方案决定 .............................. 4 第二章 系统的硬件设计与实现 ............................. 4 2.1 电路设计框图 ...................................... 4 2.2 系统硬件概述 ...................................... 4 2.3 主要单元电路的设计 ................................ 5 2.3.1 单片机主控制模块的设计 ....................... 5 2.3.2 时钟电路DS1302 ............................... 5 2.3.3 显示模块的设计 ............................... 8

3

第三章 系统的软件设计 .................................. 10 3.1 主程序流程图 ..................................... 10 3.2 DS1302子程序....................................12

3.3 LCD1602液晶子程序子程序 .......................... 15 3.4位定义............................................18 第四章 指标测试 ........................................ 19 4.1 测试仪器 ......................................... 19 4.2 硬件测试 ......................................... 19 4.3 软件测试 ......................................... 19 4.4 测试结果分析与结论 ............................... 20 4.4.1 测试结果分析 ................................ 20 4.4.2 测试结论 .................................... 20 作品总结 ................................................ 20 致谢词 .................................................. 20 参考文献 ................................................ 21 附录一 系统电路图 ....................................... 21 附录二 Proteus仿真图 .................................... 22 附录三 系统程序 ......................................... 22 附录四 元器件清单及其实物图 ............................. 30 附录五 PCB图············································33

4

摘 要

随着现代科技的快速发展,时间的不断流逝,从观太阳、摆钟到现在的电子时钟,人类凭借非凡的智慧不断研究,又创造出新的纪录。美国Dallas公司推出了一种具有涓细电流充电能能力的低功耗实时时钟时钟芯片DS1302。它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于可调电子日历采用直观的数字显示,可以同时显示年、月、日、星期、时、分、秒信息,还具有时间校准等功能。该电路采用STC89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3-5V电压供电。用LCD1602液晶显示,较直观。

综上所述此可调电子日历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键词

时钟电路;DS1302;LCD1602;单片机STC89C52

Abstract

With the rapid development of modern science and technology, the passage of time, from the view of the sun, the pendulum clocks are now electronic clock, human with extraordinary wisdom continuously research, create a new record. The Dallas company launched a has Juan fine current charge ability of the real time clock low power consumption DS1302 chip. It can be to year, month, day, week, when, minutes and seconds for the time, also has a leap year compensation and other functions, and the DS1302 long service life and small error. For adjustable electronic calendar by using object digital display, can also shows that year, month, day, week, when, minutes and seconds information, but also has time calibration etc. Function. This circuit STC89C52 single chip microcomputer as the core, its power consumption is small, can be in 3 V of low-pressure work, voltage can choose 3 ~ 5 V voltage power supply. With LCD1602 liquid crystal display, more intuitive.

To sum up the adjustable electronic calendar has read the convenient, direct display, functional diversity, simple circuit, low cost, and many other advantages, conform to the trend of the development of electronic instruments, and has a broad market prospect.

Key Words

The clock DianZhong; DS1302; LCD1602; STC89C52 single chip microcomputer

2

第一章 设计要求与方案论证

1.1 设计要求:

① 具有年、月、日、星期、时、分、秒等功能;

1.2 系统基本方案选择和论证

1.2.1 单片机芯片的选择方案和论证

方案一:

采用STC89C52芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。 方案二:

采用STC89C52芯片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有STC89C52的功能,且具有在线编程可擦除技术,对所下载的程序能够加密,比较安全。当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。所以选择采用STC89C52作为主控制系统。

1.2.2 显示模块选择方案和论证

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示。 方案二:

采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,所以也不用此种作为显示。 方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,与普通数码管相比功耗较小,硬件连接简单。所以显示部分采用1602液晶显示。

1.2.3 时钟芯片的选择方案和论证

方案一:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的

3

时间误差较大。所以不采用此方案。 方案二:

采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、周、月、年一级闰年补偿的年进行计数,而且精度高, RAM作为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.

1.3 电路设计最终方案决定

综上各方案所述,对此次作品的方案选定:采用STC89C52作为主控制系统;DS1302提供时钟;LCD1602液晶作为显示

第二章 系统的硬件设计与实现

2.1 电路设计框图

图1电路设计框图

2.2 系统硬件概述

本电路是由STC89C52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本电路采用DS1302单字节传送方式实现与主控机之间数据的传送;显示部分由1602构成。

4

2.3 主要单元电路的设计

2.3.1 单片机主控制模块的设计

STC89C52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路, 如图-2

图2主控制系统

2.3.2 时钟电路DS1302

1.DS1302的性能特性

DS1302是一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。

图3示出DS1302的引脚排列图,其中Vcc1为后备电源,Vcc2为主电源。

5

在主电源关闭的情况下,也能保持时钟的连续运行。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.5V之前,RST必须保持低电平。中有在SCLK 为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终是输入端。 DS1302_SCLK 接P3^6; 实时时钟时钟线引脚 DS1302_I/O 接P3^4; 实时时钟数据线引脚 DS1302_RST 接P3^5; 实时时钟复位线引脚

图3 DS1302的引脚图

2.DS1302数据操作原理

图4 DS1302数据时序图

DS1302是通过SPI串行总线跟单片机通信的,当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还

6

Lcd1602_Delay1ms(5); LCD1602_E = 0; }

#endif

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

* 函 数 名 : LcdWriteData * 函数功能 : 向LCD写入一个字节的数据 * 输 入 : dat * 输 出 : 无

*******************************************************************************/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat) //写入数据 {

LCD1602_E = 0; //使能清零

LCD1602_RS = 1; //选择输入数据 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat; //写入数据 Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序

Lcd1602_Delay1ms(5); //保持时间 LCD1602_E = 0; } #else

void LcdWriteData(uchar dat) //写入数据 {

LCD1602_E = 0; //使能清零

LCD1602_RS = 1; //选择写入数据 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0;

LCD1602_DATAPINS = dat << 4; //写入低四位 Lcd1602_Delay1ms(1);

17

LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; }

#endif

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

* 函 数 名 : LcdInit() * 函数功能 : 初始化LCD屏 * 输 入 : 无 * 输 出 : 无

*******************************************************************************/ #ifndef LCD1602_4PINS void LcdInit() //LCD初始化子程序 {

LcdWriteCom(0x38); //开显示

LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏

LcdWriteCom(0x80); //设置数据指针起点 } #else

void LcdInit() //LCD初始化子程序 {

LcdWriteCom(0x32); //将8位总线转为4位总线 LcdWriteCom(0x28); //在四位线下的初始化 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏

LcdWriteCom(0x80); //设置数据指针起点 }

#endif

3.4 位定义

PIN口定义

sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6;//

---定义ds1302使用的IO口---// sbit DSIO=P3^4; sbit RST=P3^5; sbit SCLK=P3^6;

18

第四章 指标测试

4.1 测试仪器

测试如表2 所示。 序号 1 2 3 4 名称 PC机 单片机仿真软件 数字万用表 ISP在线下载线 表2 测试仪器

型号 Proteus、keil C DT9205B 4.2 硬件测试

可调电子日历的电路,焊接不可轻视,只要出于一处的错误,则会对检测造成很大的不便,对于各种锋利的引脚要注意处理,否则会刺破带有包皮的导线,则会对电路造成短路现象。

在电子日历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

(1)单片机晶振不起振

(2)LCD1602液晶的VDD 与VSS 引脚接反了,当时也没接保护电阻,

电容,结果把液晶发热烧坏了。 解决:①:根据仪器的测试,发现电路引脚有接错的现象,重新焊接后晶振, 复位正常,程序能够下载。②:重新买了个液晶,把VDD与VSS重新接到 正确的引脚。

4.3 软件测试

电子日历是多功能的数字型,可以看当前日期,时间。在编写程序和调试时出现了较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。

19

4.4 测试结果分析与结论

4.4.1 测试结果分析

(1).在测试中遇到单片机晶振不起振,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.

(2).LCD1602液晶不显示时间和日期,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。然后查看程序是否正确无误,对程序进行认真修改。

4.4.2 测试结论

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力,同时在软件的编程方面得到更多的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。

作品总结

在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识,较好的完成了作品,达到了预期的目的。完了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路焊接过程中,不能心急,一个个慢慢来不能急于求成。反而达到事半功倍的效果。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,理清了思路,反而得心应手。通过做这次的毕业设计,我知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我的耐心,做什么事都要有耐心。此次毕业设计中学到了很多很多东西,这是最重要的。总之,毕业设计让我的能力得到了全方位的提高。

致谢词

感谢学院,感谢老师再设计中给予我的帮助,给我一次难得煅炼的机会,使得我的动手能力和专业技能都有了很大的提高。

在设计和制作的过程中,我深切的体会到,实践的重要性,这一次的设计是对我所学知识的一次综合性检测,无论是动手能力还是理论知识运用能力都得到了提高,同时加深了我对网络资源的认识,大大提高了查阅资料的效率,使我有充足的时间投入到电路设计当中。在做作品的日子里得到了指导教师的悉心指导,在此向我的指导教师致以诚挚的谢意。并且感谢提供相关技术帮助的老师和同学,你们的支持和鼓励使我们对这次的作品完成有了信心和动力,也给了我很多无私的帮助和支持,我在此深表谢意。

20

参考文献

1:张毅刚,彭喜元,姜守达,乔立言.《新编MCS-51单片机应用设计》 哈尔滨工业大学出版社,2008

2:马忠梅.《单片机的C语言应用设计》 北京航空航天大学出版社 2008 3:王静霞.《单片机应用技术》,电子工业出版社, 2009. 4:: 张道德.《单片机接口技术》,中国水利水电出版社 2007 5:石生.《电路基本分析》,高等教育出版社2008 6:谭浩强.《C语言程序设计》(第2版),清华大学出版社. 7:胡宴如,耿苏燕.《模拟电子技术》高等教育出版社 2000 8:谭永红,雷跃,莫振栋《电子线路实验进阶教程》 北京航空航天大学出版 2008

9:刘国巍,周晓萍,周莉《数字电子技术基础》,国防科技大学出版社2009 10:张永枫,《单片机应用实训教程》北京:清华大学出版社,2008. 11:刘守义,《单片机应用技术》(第2版)西安电子科技大学出版社,2007 12:先锋工作室《单片机程序设计实例》北京:清华大学出版社,2003 13:广州周立功单片机发展有限公司,Keil C51使用技巧及实战,2003 14:李群芳,《单片机微型计算机与接口技术》(第2版)北京:电子工业出版 15:徐玮,《C51单片机高效入门》,北京:机械工业出版社,2006.

附录一 系统电路图

附图1系统电路图

21

附录二 Proteus仿真图

附图2 Proteus仿真图

附录三 系统程序

源程序如下:

#include #include\#include\

#define uchar unsigned char #define uint unsigned int

//---DS1302写入和读取时分秒的地址命令---// //---秒分时日月周年 最低位读写位;-------//

uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---// //---存储顺序是秒分时日月周年,存储格式是用BCD码---// uchar TIME[7] = {0x00, 0x24, 0x12, 0x01, 0x01, 0x02, 0x13}; sbit DSIO=P3^4; sbit RST=P3^5; sbit SCLK=P3^6;

sbit LCD1602_E=P2^7;

22

sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6;

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

* 函 数 名 : Lcd1602_Delay1ms * 函数功能 : 延时函数,延时1ms * 输 入 : c * 输 出 : 无

* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。 *******************************************************************************/

void Lcd1602_Delay1ms(uint c) //误差 0us {

uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } }

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

* 函 数 名 : LcdWriteCom * 函数功能 : 向LCD写入一个字节的命令 * 输 入 : com * 输 出 : 无

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

void LcdWriteCom(uchar com) //写入命令 {

LCD1602_E = 0; //使能

LCD1602_RS = 0; //选择发送命令 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = com; //放入命令 Lcd1602_Delay1ms(1); //等待数据稳定

LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); //保持时间

23

LCD1602_E = 0; }

#else

void LcdWriteCom(uchar com) //写入命令 {

LCD1602_E = 0; //使能清零

LCD1602_RS = 0; //选择写入命令 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0;

// Lcd1602_Delay1ms(1);

LCD1602_DATAPINS = com << 4; //发送低四位 Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; }

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

* 函 数 名 : LcdWriteData * 函数功能 : 向LCD写入一个字节的数据 * 输 入 : dat * 输 出 : 无

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

void LcdWriteData(uchar dat) //写入数据 {

LCD1602_E = 0; //使能清零

LCD1602_RS = 1; //选择输入数据 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat; //写入数据 Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序

Lcd1602_Delay1ms(5); //保持时间

24

LCD1602_E = 0; } #else

void LcdWriteData(uchar dat) //写入数据 {

LCD1602_E = 0; //使能清零

LCD1602_RS = 1; //选择写入数据 LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0;

LCD1602_DATAPINS = dat << 4; //写入低四位 Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; }

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

* 函 数 名 : LcdInit() * 函数功能 : 初始化LCD屏 * 输 入 : 无 * 输 出 : 无

*******************************************************************************/ #ifndef LCD1602_4PINS void LcdInit() //LCD初始化子程序 {

LcdWriteCom(0x38); //开显示

LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏

LcdWriteCom(0x80); //设置数据指针起点 } #else

void LcdInit() //LCD初始化子程序 {

25

LcdWriteCom(0x32); //将8位总线转为4位总线 LcdWriteCom(0x28); //在四位线下的初始化 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏

LcdWriteCom(0x80); //设置数据指针起点 }

void Ds1302Write(uchar addr, uchar dat) {

uchar n; RST = 0; _nop_();

SCLK = 0;//先将SCLK置低电平。 _nop_();

RST = 1; //然后将RST(CE)置高电平。 _nop_();

for (n=0; n<8; n++)//开始传送八位地址命令 { DSIO = addr & 0x01;//数据从低位开始传送 addr >>= 1; SCLK = 1;//数据在上升沿时,DS1302读取数据 _nop_(); SCLK = 0; _nop_(); }

for (n=0; n<8; n++)//写入8位数据 { DSIO = dat & 0x01; dat >>= 1; SCLK = 1;//数据在上升沿时,DS1302读取数据 _nop_(); SCLK = 0; _nop_(); }

RST = 0;//传送数据结束 _nop_(); }

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

* 函 数 名 : Ds1302Read

26

* 函数功能 : 读取一个地址的数据 * 输 入 : addr * 输 出 : dat

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

uchar Ds1302Read(uchar addr) {

uchar n,dat,dat1; RST = 0; _nop_();

SCLK = 0;//先将SCLK置低电平。 _nop_();

RST = 1;//然后将RST(CE)置高电平。 _nop_();

for(n=0; n<8; n++)//开始传送八位地址命令 { DSIO = addr & 0x01;//数据从低位开始传送 addr >>= 1; SCLK = 1;//数据在上升沿时,DS1302读取数据 _nop_(); SCLK = 0;//DS1302下降沿时,放置数据 _nop_(); }

_nop_();

for(n=0; n<8; n++)//读取8位数据 { dat1 = DSIO;//从最低位开始接收 dat = (dat>>1) | (dat1<<7); SCLK = 1; _nop_(); SCLK = 0;//DS1302下降沿时,放置数据 _nop_(); }

RST = 0;

_nop_(); //以下为DS1302复位的稳定时间,必须的。 SCLK = 1; _nop_(); DSIO = 0; _nop_(); DSIO = 1;

27

_nop_(); return dat; }

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

* 函 数 名 : Ds1302Init * 函数功能 : 初始化DS1302. * 输 入 : 无 * 输 出 : 无

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

void Ds1302Init() {

uchar n;

Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能 for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年 { Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]); }

Ds1302Write(0x8E,0x80); //打开写保护功能 }

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

* 函 数 名 : Ds1302ReadTime * 函数功能 : 读取时钟信息 * 输 入 : 无 * 输 出 : 无

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

void Ds1302ReadTime() {

uchar n;

for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年 { TIME[n] = Ds1302Read(READ_RTC_ADDR[n]); } }

void LcdDisplay()

28

{

LcdWriteCom(0x80+0X40);

LcdWriteData('0'+TIME[2]/16); LcdWriteData('0'+(TIME[2]&0x0f)); LcdWriteData('-');

LcdWriteData('0'+TIME[1]/16); LcdWriteData('0'+(TIME[1]&0x0f)); LcdWriteData('-');

LcdWriteData('0'+TIME[0]/16); LcdWriteData('0'+(TIME[0]&0x0f));

LcdWriteCom(0x80); LcdWriteData('2'); LcdWriteData('0');

LcdWriteData('0'+TIME[6]/16); LcdWriteData('0'+(TIME[6]&0x0f)); LcdWriteData('-');

LcdWriteData('0'+TIME[4]/16); LcdWriteData('0'+(TIME[4]&0x0f)); LcdWriteData('-');

LcdWriteData('0'+TIME[3]/16); LcdWriteData('0'+(TIME[3]&0x0f)); LcdWriteCom(0x8D);

LcdWriteData('0'+(TIME[5]&0x07)); }

void main() {

LcdInit(); Ds1302Init(); while(1) { Ds1302ReadTime(); LcdDisplay(); } }

//时 //分

//秒

//年

//月

//日

//星期

29

附录四 元器件清单及其实物图

元器件名称 洞洞板 电解电容 100uF + 10uF STC89C52RC单片机+底座 瓷片电容 10uF + 30pF 自锁开关 按键 COM口 电阻 10K+1K USB-B 3V电子 MAX232+底座 DS1302 +底座 LED红 排针 排针插 LCD1602液晶

数量 1 1+1 1+1 7+3 1 1 1 2+10 1 1 1+1 1+1 1 2 1 1

附图3采购的元器件清单

30

附图 4 实物图

31

本文来源:https://www.bwwdw.com/article/vpb.html

Top