《作息时间控制器(基于51单片机和DS1302的时钟)要点.pdf》由会员分享,可在线阅读,更多相关《作息时间控制器(基于51单片机和DS1302的时钟)要点.pdf(28页珍藏版)》请在三一文库上搜索。
1、第 I 页共 28 页 课程设计 (论文) 题目:作息时间控制器 院 (系) : 电子工程与自动化学院 专业:测控技术与仪器 学生姓名:吉哲 学号: 0900820413 指导教师:徐翠锋 职称:讲师 2012 年 12 月 27 日 第 II 页共 28 页 摘要 本次作息时间控制器设计是采用AT89S52单片机作为系统的核心元件, 在其最小系 统基础上与 DS1302时钟芯片配合,四个独立按键控制,六位七段数码管显示,无源蜂 鸣器发声。单片机最小系统作为核心处理和控制单元;时钟芯片用来实现实时时间的精 准输出和闹钟信息的存储,并可用纽扣电池供电以保持时间的连续运行;独立按键用于 进行时间及
2、闹钟的设定;数码管用于显示时间及闹钟信息;蜂鸣器用于在达到设定的时 间后进行及时提醒。 关键词: 时间控制; AT89S52 ;单片机; DS1302 ;时钟芯片;闹铃;定时报警 Abstract This work and rest time controller design is to use AT89S52 SCM as the core of the system components, in its minimum system with DS1302 clock chip based on coordination, four independent key control, s
3、ix seven period of digital tube display, passive buzzer sound. Single chip microcomputer minimum system as the core processing and control unit; Clock chip to realize real-time time accurate output and alarm information storage, and use button batteries to keep continuous operation time, Independent
4、 key for time and alarm clock Settings; Digital tube is used to display the time and alarm information; Buzzer to reach a set time for timely remind. Key words:Time control; AT89S52 devices; SCM; DS1302; Clock chip; Alarm; Timing alarm 第 III 页共 28 页 目录 引言. 1 1 课程设计任务及要求 1 2 硬件设计 1 2.1 总体设计思路及系统框图 1
5、2.2 中央处理控制器 2 2.3 晶振电路 3 2.4 时钟信号产生电路 3 2.5 显示电路 4 2.6 控制电路 6 2.7 闹铃电路 8 2.8 电源及下载电路 8 3 程序设计 9 3.1 主程序流程图 9 3.2 按键扫描程序流程图 9 3.3 响铃扫描程序 . 10 4 制板、组装与调试 . 11 4.1 PCB 制作 . 11 4.2 制作 PCB 板流程 . 11 4.3 调试 . 11 5 方案总结 . 11 心得体会 . . 12 谢辞. . 13 参考文献 . . 14 附录. . 15 第 1 页共 28 页 引言 时间是人类生活必不可少的重要元素,从古至今它都扮演着
6、一个非常重要的角色。 时间对人们来说总是那么宝贵,学习、工作的忙碌性和繁杂容易使人忘记当前的时间。 随时提醒那些容易忘记时间的人,电子钟无疑最为直观。所以一个能够帮助人们提醒时 间的事物对于人们来说有着非常重要的意义。 数字钟通过数字电路实现时、分、秒。数字显示的计时装置, 广泛用于人家庭、车 站、码头办公室等公共场所成为人们日常生活中不可少的必需品。由于数字集成电路的 发展和石英晶体振荡器的广泛应用, 使得数字钟的精度远远超过老式钟表。 多功能数字钟的应用非常普遍。由单片机作为数字钟的核心控制器,通过它的时钟 信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来,通过键盘 可以
7、进行校时、定时闹钟等功能,输出设备显示器可以用液晶显示技术和数码管来显示 技术。 作息时间控制器利用单片机控制技术将时钟电子化、数字化,拥有时钟精确、体积 小等特点,拥有人性化的闹铃提醒功能,可被广泛应用于我们日常的学习、工作和生活 当中。 1 课程设计任务及要求 1 掌握单片机最小系统的设计方法; 2 熟悉单片机定时器的原理。 3 了解数码显示器与 MCU 的接口方法; 4 掌握独立按键的使用方法; 5 要求显示时钟的时、分、秒,在预定的时间内响铃,可同时预置5 次以上时间。 6 扩展:按键后才显示时间(低功耗) ,液晶显示记事。 2 硬件设计 2.1 总体设计思路及系统框图 通过时钟信号产
8、生电路产生时钟信号,然后将信号送入中央处理单元,然后由控制 电路控制中央处理单元控制时钟闹钟的设定及修改、显示电路的显示和蜂鸣器的闹铃。 第 2 页共 28 页 系统结构框图 2.2 中央处理控制器 AT89S52是一种低功耗、 高性能的 CMOS 工艺的 8 位单片机。它带有 8KB的可在线编 程的 Flash 存储器,该单片机采用了ATMEL 公司的高密度、非易失性存储器技术,与 工业上标准型 80C51单片机的指令系统及引脚完全兼容; 片内的 Flash 存储器可在线重 新编程,或使用通用的非易失性存储器编程器;通用的8 位 CPU 与在线可编程 Flash 集 成在一块芯片上,从而使A
9、T89S52功能更加完善,应用更加灵活;具有较高的性能价格 比,使其在嵌入式控制系统中有着广泛的应用前景。 单片机结构图 时钟电路 显示电路 闹铃电路控制电路 中 央 处 理 单 元 晶振电路 第 3 页共 28 页 2.3 晶振电路 时钟是单片机的心脏, 单片机各功能部件的运行都是以时钟频率为基准,有条不紊 地一拍一拍地工作。常用的时钟电路有两种方式,一种为内部时钟方式,另一种为外部 时钟方式。外部时钟方式是使用外部振荡脉冲信号,常用于多片单片机同时工作,以便 于同步。对外部脉冲信号只要求高电平的持续时间大于20uS,一般为低于 12MHz 的方波。 在单片机内部有一个用于构成振荡器的高增益
10、反相放大器,该高增益反相放大器的输入 端为芯片引脚 XTAL1 ,输出端为引脚 XTAL2 ,这两个引脚跨接石英晶体振荡器可微调电 容,就构成一个稳定的自激振荡器,下图是单片机内部时钟方式的振荡器电路。 本时钟电路是采用内部时钟方式,在 XT1和 X2引脚之间外接振荡器, 构成一个自激 振荡器,自激振荡器与单片机内部的时钟发生器构成单片机的时钟电路。 晶振电路 电路中电容的大小会影响振荡器频率的高低、振荡器的稳定性和起振的快速性,C1 和 C2的典型取值通常选择为30pF左右。 晶振的振荡频率的范围通常是在1.2MHz12MHz 之间,常选择振荡频率6MHz或 12MHz的石英晶体。 2.4
11、时钟信号产生电路 (1) 方案一:单片机内部定时器 利用单片机内部定时器设计时间计时处理,采用单片机内部的T0定时器溢出中断来 实现,工作在方式2 下,8 位定时器,具有自动重装载功能,具有精确定时功能。 优点:电路简单,充分利用现有资源,节约资源和成本 缺点:掉电后数据丢失,需重新设定时间和闹钟 第 4 页共 28 页 (2) 方案二: DS1302时钟芯片 DS1302是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加31字 节静态 RAM ,采用 SPI 三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个 字节的时钟信号和RAM 数据。实时时钟可提供秒、分
12、、时、日、星期、月和年,一个月 小与 31 天时可以自动调整, 且具有闰年补偿功能。 工作电压宽达 2.5 5.5V。采用双电 源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细 电流充电的能力。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上, 能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。本次设计中, 使用 DS1302提供的 RAM 区保存 5 个闹铃数据,达到掉电不丢失功能。 优点:掉电后不掉数据,可以保存时间和闹钟,比较符合实际使用 缺点:成本稍高,使用程序相对复杂 时钟芯片应用电路 考虑到实际使用需求,为方便用户使用,故
13、采用方案二。 2.5 显示电路 (1) 方案一: OCM12864 带中文字库的128*64 是一种具有 4 位/8 位并行、 2 线或 3 线串行多种并行方式。 内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块,其分辨率为128*64, 内置 8192 个 16*16 点汉字,和 128 个 16*8 点 ASC 字符集, 利用该模块可构成全中文 人机交互图形界面。 优点:屏幕较大,使用方便,可显示信息量大 缺点:体积大,价格昂贵,在较远处无法清晰看到屏幕内容 第 5 页共 28 页 OCM12864 (2) 方案二: LCM1602 1602 液晶也叫 1602 字符型液晶,它是一
14、种专门用来显示字母、数字、符号等的点 阵型液晶模块。它由若干个5X7或者 5X11等点阵字符位组成,每个点阵字符位都可以 显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行 间距的作用,正因为如此所以它不能很好地显示图形。 优点:体积较小,使用方便,显示信息量较大 缺点:成本稍高,在较远处无法清晰看到屏幕内容 LCM1602 第 6 页共 28 页 (3) 方案三:数码管 常用的数码管有 7 段和“米”段之分,又有共阳极和共阴极两种。该系统采用7 段共阳极数码管。共阳极数码管内的发光二极管的阳极连接在一起,通常此公共阳极接 正电压,当某个发光二极管的阴极接低电平时,发
15、光二极管被点亮,相应的段被显示。 数码管有静态显示和动态显示两种显示方式。静态显示方式程序简单,显示度高, 但占用 I/O 口资源较多,硬件成本高,且功耗大。本系统需要显示时分秒,所以采用动 态显示,当要显示信息时,由P0口输出字符的段码, P2口对相应的位输出低电平,三 极管导通,点亮相应的数码管,就可以把要显示的字符在数码管上显示。在这种显示电 路中,一个字位一个字位地轮流点亮各LED ,每一个字位停留1ms左右,由于人的视觉 暂留,不会察觉有闪烁现象。 优点:体积较小,价格便宜,使用方便,亮度高,远处也可看清 缺点:可现实信息量小 由于实际使用中需要在较远处也可清洗看到显示的时间,结合成
16、本和体积,故援用 方案三。 2.6 控制电路 常用到的一般有编码键盘和非编码键盘。编码键盘是靠硬件电路对每个键位进行编 码,当有键按下时,输出固定的数码,并用来判断键位。编码键盘一般需要较多的硬件 电路,成本较高。单片机一般采用非编码键盘。非编码键盘是指不是靠固定的编码来实 现键位的识别,而是用软件确定一种算法对键位进行扫描。非编码键盘能实现实现软件 的资源的充分利用。常见的非编码键盘有独立按键和矩阵键盘两种。矩阵式键盘与独立 按键相比同样多的按键使用的I/O 口较少,节省资源,但编程、电路设计较复杂。独立 式按键则只需读对应的I/O 口,来确定键位,而且考虑到作息时间控制器中需要的I/O 口
17、较少,所以采用独立式按键。键盘模块连接的I/O 口为 P3口,P3口的引脚都有第二 第 7 页共 28 页 功能。电子闹钟的时间校准时需要把定时器的标志位和寄存器等与系统时间相关的参数 恢复到计时初始状态,虽说在一般的函数内部也可以做到,但如果用单片机自带的外部 中断方式会更方便,便于人工随时设置。键盘输入采用P3口使得软件设计更灵活。 (1) 方案一:两个按键 两个按键调整是在日常生活中最长见的一种。其中一个键用来切换需要调整的内容, 另一个键用来改变当时选定的数值,一般为增量改变。 优点:节约资源,节省整体体积 缺点:如遇需切换量大,修改值比当前值稍小时,使用极不方便 (2) 方案二:三个
18、按键 在方案一的基础上,增加减量修改按钮。 优点:节约资源,节省整体体积 缺点:如遇需切换量大,使用不方便 (3) 方案三:四个按键 在方案二的基础上增加一个辅助切换按钮,即:按键A为切换时间与闹钟循环显示 按键;按键 B为修改按钮,即在当前显示值需要修改时,按下此按键即可修改,同时此 按键还有切换修改数的功能,即切换所需修改的“时”“分”“秒”;剩余两个位增量 修改和减量修改键。 优点:使用方便,符合实际使用需求 缺点:按键复用较多,编程较复杂 控制按键电路 考虑到板子体积,故没有采用按键较多的矩阵式键盘。再结合考虑实际使用需求, 故选用方案三。 第 8 页共 28 页 2.7 闹铃电路 蜂
19、鸣器报警的发音器件常采用压电式蜂 鸣器。压电式蜂鸣器约需10mA的驱动电流, 可以用一个晶体三极管驱动, 如图 1.2.5 所 示。P1.0 接晶体管的基极输入端,当P1.0 输出低电平“ 0”时,三极管导通并对I/O 口的灌电流放大驱动蜂鸣器;当P1.0 输出 高电平“ 1”时,三极管截止,蜂鸣器停止 发声。 闹铃电路 2.8 电源及下载电路 考虑到在实际使用中,需要有电源指示 灯来指示当前电源供电时候正常,故增加电 源指示灯(红色 LED )一个;考虑到实际使 用中的需要和节能功能,设置电源开关(自 锁式开关)一个,以方便使用;考虑到实际 使用中,程序已经写入单片机内,无需频繁 修改,故将
20、普通九针式牛角座下载口改换为 排针式,以节约空间,减小实物体积。 电源电路 第 9 页共 28 页 3 程序设计 3.1 主程序流程图 3.2 按键扫描程序流程图 发送键值 读回键值 延时再读回键值(消抖) 松手检测 第 10 页共 28 页 Y N 3.3 响铃扫描程序 Y N 判断键值并给key 赋值 key=1 Key=2 Key=3 Key=4 将修 改后 时间 或闹 钟存 入时 钟芯 片 Gai=0 ? 切 换 时 间 与 五 个 闹 钟 轮 流 显 示 循环 切换 修改 的内 容: 时 分秒 给 选 中 修 改 的 值 加 1 给选 中修 改的 值减 1 Ring_flag=1 ?
21、 响铃不响铃 第 11 页共 28 页 4 制板、组装与调试 4.1 PCB 制作 硬件电路的调试首先是系统原理图的检查。根据所学的理论知识检查原理图是否有 不合理之处,各部分的参数是否合理。其次检查绘制的PCB 的封装和实物是否相符。再 次检查 PCB各网络间的连接是否和原理图相符,以及做出来的电路板是否有在制作过程 中断线的情况。电路板的初步检查就完成了。 4.2 制作 pcb 板的流程 设计好原理图 sch改变封装绘制pcb板布局布线打印pcb图纸 印制铜板腐蚀铜板钻孔焊接元器件测板修改电路测试。 4.3 调试 对硬件电路的检查需借助万用表,用来检测每一条线路之间是否通路,以及有没有 虚
22、焊,还要检测一些靠的比较近的线之间是否出现短路。将检测出来的问题解决后,就 可以进行第二步的调试 然后进行上电调试。对最小系统板,看下载口是否能正常工作。如果不能正常工作, 检查与下载相关的下载接口和复位电路。如果能正常工作,编写与模块相应的程序检查 模块是否能正常工作。 5 方案总结 AT89S52除 8K在系统可编程 Flash 外,与工业 80C51产品指令和引脚完全兼容。片 上 Flash 允许程序存储器在系统可编程,亦适用于常规编程器。在单芯片上,拥有灵巧 的 8 位 CPU和在系统可编程 Flash ,使得 AT89S52为众多嵌入式控制应用系统提供高灵 活、超有效的解决方案。 A
23、T89S52具有以下标准功能: 8k 字节 Flash ,256 字节 RAM ,32 位 I/O 口线,看门 狗定时器, 2 个数据指针,三个16位定时 / 计数器,全双工串行口,片内晶振及时钟电 路。另外, AT89S52支持 2 种软件可选择节电模式。空闲模式下,CPU 停止工作,允许 RAM 、定时 / 计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保护,振荡器 被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。 作息时间控制器是以AT89S52为核心,辅以必要的电路,设计的带有闹铃功能的数 字电子时钟。通过 12864 液晶显示时间,可调整时间。系统的重点是基于A
24、T89S52单片 机的编程,通过设计系统从而达到学习、设计、开发软、硬件的能力。 第 12 页共 28 页 电子时钟采用液晶实现对“时” 、 “分” 、 “秒”数字显示。相比老式的机械钟表单就 显示而言就遥遥领先。电子时钟小巧,价格低廉,走时精度高,使用方便,功能多,便 于集成化使得数字时钟功能大大的得到了扩展。诸如定时自动报警、按时自动响铃、时 间程序自动控制、定时广播、自动启闭路灯、定时开关烘箱等,所有的这些都是以钟表 数字化为基础的。因此,研究电子时钟及扩大其应用,有着非常现实的意义。 心得体会 两个星期的课程设计结束了, 我们从中获益匪浅。 从选题、确定方案、设计原理图、 焊接、调试的
25、过程中,我们体会到了课本联系实际并学以致用,设计思想、动手能力都 有所提高,这对我们来说是一次将课本所学知识应用到具体实践中的一次考验。 在课程设计之初,首先对题目要求做一个分析,构思好每一个功能要通过什么电路 来实现。要做好一个课程设计,还必须做到:在设计程序之前,对所用单片机的内部结 构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的 软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进 是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现 功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在
26、 设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析 清楚,以免下次再碰到同样的问题。在焊接每个元件的时候一定要注意各个输入、输出 引脚,因为每个引脚都是不一样的,只要让各个引脚互相对应,才能得出正确的结果, 否则,出现任何一点小的误差就会对整个系统造成毁灭性的打击。 通过课程设计, 对一些已学过的知识, 是一个很好的回顾, 巩固了自己所学的知识, 又从实践中验证了理论知识,实践与理论相结合。 第 13 页共 28 页 谢辞 转眼课程设计已接近尾声,老师们治学严谨,学识渊博,思想深邃,视野雄阔,为我 营造了一种良好的精神氛围。在课程设计开始之初,徐老师就告诉我们要认真
27、对待自己 的课程设计,并在过程中经常抽出时间来关心我们的设计进度情况,帮助我们分析问题, 督促我们抓紧学习。授人以鱼不如授人以渔,置身其间,耳濡目染,潜移默化,使我不 仅接受了全新的思想观念,树立了宏伟的学术目标,领会了基本的思考方式。特别是徐 老师在课程设计期间投注了大量的时间及精力关注我们的设计进度,指导我们的论文写 作。在此我衷心的感谢各位老师,并向各位老师表达我崇高的敬意。最后,我也向各位 在课程设计期间帮助我,给予我支持的同学表达我的谢意。 第 14 页共 28 页 参考文献 1 白驹珩,雷晓平编著 . 单片计算机及其应用 . 北京: 高等教育出版社, 2010 2郭天祥 . 51
28、单片机 C语言教程 . 电子工业出版社 . 2009. 3康华光电子技术基础(模拟部分)M. 高等教育出版社 . 1998 4 谭浩强 . C 程序设计 . 清华大学出版社 .2005 5 王选民 . 智能仪器原理及设计 . 清华大学出版社 .2008 第 15 页共 28 页 附录 附录一 整体原理图 附录二 整体 PCB图 附录三 整体实物图 附录四 整体程序 第 16 页共 28 页 第 17 页共 28 页 第 15 页共 28 页 / 完整程序源代码 #include “reg52.h“ #include “ds1302.h“ #define uchar unsigned char
29、#define uint unsigned int #define Duan P0 #define Wei P2 #define Key_value (P1 uchar code tableP=0x40,0x79,0x24,0x30,0x19,0x12, 0x02,0x78, 0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e ; SYSTEMTIME CTime6; sbit beep=P10; sbit light=P11; sbit k4=P30; uint state,gai,key1,key2,key3,key4,temp,bee,cou nt,ring_
30、flag,m,i,j; void display(uchar,uchar,uchar,uchar,uchar,uchar ); void keyscan(); void beepscan(); void beepring(); void delay(uchar); void delay2(uchar); void main() EA=1; ET1=1; TMOD=0x10; TH1=(65536-5000)/256; TL1=(65536-5000)%256; TR1=1; Initial_DS1302(); Read_Alarmdata(CTime+1); while(1) if(gai=0
31、) DS1302_GetTime( if(state=0) display(CTimestate.Hour/10,CTimest ate.Hour%10,CTimestate.Minute/10,CTi mestate.Minute%10,CTimestate.Second/ 10,CTimestate.Second%10); else display(CTimestate.Hour/10,CTimest ate.Hour%10,CTimestate.Minute/10,CTi mestate.Minute%10,CTimestate.Second, state); keyscan(); be
32、epscan(); beepring(); void display(uchar A,uchar B,uchar C,uchar D,uchar E,uchar F) if(gai=0) Wei=0; delay(1); Duan=tableAA; Wei=0x80; 第 16 页共 28 页 delay(5); Wei=0; delay(1); if(F%2=0) Duan=tablePB; else Duan=tableAB; Wei=0x40; delay(5); Wei=0; delay(1); Duan=tableAC; Wei=0x20; delay(5); Wei=0; dela
33、y(1); Duan=tableAD; Wei=0x10; delay(5); Wei=0; delay(1); Duan=tableAE; Wei=0x08; delay(5); Wei=0; delay(1); Duan=tableAF; Wei=0x04; delay(1); if(gai=1) Wei=0; delay(1); Duan=tableAA; Wei=0x80; delay(5); Wei=0; delay(1); if(F%2=0) Duan=tablePB; else Duan=tableAB; Wei=0x40; delay(5); if(gai=2) Wei=0;
34、delay(1); Duan=tableAC; Wei=0x20; delay(5); Wei=0; delay(1); Duan=tableAD; Wei=0x10; delay(5); if(gai=3) Wei=0; delay(1); Duan=tableAE; 第 17 页共 28 页 Wei=0x08; delay(5); if(state=0) Wei=0; delay(1); Duan=tableAF; Wei=0x04; delay(5); void keyscan() temp=Key_value; if(temp!=0x0f) delay(10); temp=Key_va
35、lue; if(temp!=0x0f) switch(temp) case 0x0d : key1=1; break; case 0x0b : key2=1; break; case 0x07 : key3=1; break; case 0x0e : key4=1; break; while(Key_value!=0x0f) if(state=0) display(CTimestate.Hour/10,CTimest ate.Hour%10,CTimestate.Minute/10,CTi mestate.Minute%10,CTimestate.Second/ 10,CTimestate.S
36、econd%10); else display(CTimestate.Hour/10,CTimest ate.Hour%10,CTimestate.Minute/10,CTi mestate.Minute%10,CTimestate.Second, state); if(key1) if(gai) gai=0; if(state=0) modif_time(CTimestate.Second,CTim estate.Minute,CTimestate.Hour); else Wirte_Alarmdata(CTime+state,state-1); state=0; else if(5=sta
37、te) state=0; else state+; key1=0; else if(key2) if(gai=3) gai=1; else gai+; 第 18 页共 28 页 key2=0; else if(key3) /if(state=0) Stop_DS1302(); if(gai=1) if(CTimestate.Hour=23) CTimestate.Hour=0; else CTimestate.Hour+; else if(gai=2) if(CTimestate.Minute=59) CTimestate.Minute=0; else CTimestate.Minute+;
38、else if(state=0) if(CTimestate.Second=59) CTimestate.Second=0; else CTimestate.Second+; else if(CTimestate.Second=0) CTimestate.Second=1; else CTimestate.Second=0; key3=0; else if(key4=1) if(state=0)/ Stop_DS1302(); if(gai=1) if(CTimestate.Hour=0) CTimestate.Hour=23; else CTimestate.Hour-; else if(g
39、ai=2) if(CTimestate.Minute=0) CTimestate.Minute=59; else CTimestate.Minute-; else if(state=0) if(CTimestate.Second=0) CTimestate.Second=59; else CTimestate.Second-; else 第 19 页共 28 页 if(CTimestate.Second=0) CTimestate.Second=1; else CTimestate.Second=0; key4=0; void beepscan() ring_flag=0; if(i=5) i
40、=1; else i+; if(CTimei.Second=1) else if(CTimei.Second=1) beep=1; light=1; else ring_flag=0; void beepring() if(count=2) count=0; if(ring_flag) beep=beep; light=light; else ring_flag=0; void time1()interrupt 3 TH1=(65536-5000)/256; TL1=(65536-5000)%256; count+; void delay(unsigned char x) unsigned c
41、har i,j; for(i=x;i0;i-) for(j=20;j0;j-); 第 20 页共 28 页 /文件内容 /* * * THE REAL TIMER DS1302 DRIVER LIB COPYRIGHT (c) 2005 BY JJJ. - ALL RIGHTS RESERVED - File Name: DS1302.h Author: Jiang Jian Jun Created: 2003/7/21 Modified: NO Revision: 1.0 * * */ #ifndef _DS1302_H_ #define _DS1302_H_ sbit DS1302_CLK
42、 = P35; /实时时钟时钟线引脚 sbit DS1302_RST = P37; /实时时钟数据线引脚 sbit DS1302_IO = P36; /实时时钟复位线引脚 sbit ACC7 = ACC7 ; typedef struct _SYSTEMTIME_ unsigned char Second; unsigned char Minute; unsigned char Hour; SYSTEMTIME;/ 定义的时间类型 #define AM(X) X #define PM(X) (X+12) / 转成 24 小时制 #define DS1302_SECOND 0x80 #defin
43、e DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C #define DS1302_RAM(X) (0xC0+(X)*2) /用于计算DS1302_RAM 地址的宏 void DS1302InputByte(unsigned char d) / 实时时钟写入一字节 (内部函数 ) unsigned char i; for(i=0; i=1 ; DS1302_C
44、LK = 0; unsigned char DS1302OutputByte(void) / 实时时钟读取一字节 (内部函数 ) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; / 相当于汇编中的RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa) /ucAddr: DS1302 地址, ucData: 要写的数据 第 21 页共 28 页 DS1302_R
45、ST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写 1Byte 数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr) /读取 DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01
46、); / 地址,命令 ucData = DS1302OutputByte(); / 读 1Byte 数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); void DS1302_SetProtect(bit flag) / 是否写保护 if(flag) Write1302(0x8E,0x80); /是 else Write1302(0x8E,0x00); /否 void DS1302_GetTime(SYSTEMTIME *Time) unsigned char value; value = Read1302(DS1302_SECOND); Ti
47、me-Second = (value /BCD 码:十位 +个位 value = Read1302(DS1302_MINUTE); Time-Minute = (value value = Read1302(DS1302_HOUR); Time-Hour = (value void Initial_DS1302(void) unsigned char Second=Read1302(DS1302_SECOND); if(Second /禁止写保护 / Write1302(DS1302_MINUTE,0x59); /为 BCD 码 / Write1302(DS1302_HOUR,0x23); /最高位为低,表示24小时制 Write1302(DS1302_SECOND,(0/10)Hour); Write1302(RAM_ADDR+2,Time-Minute) ; DS1302_SetProtect(1); /写保护 void Read_Alarmdata(SYSTEMTIME *Time) unsigned char i; unsigned char RAM_ADDR=0xc0; DS1302_SetProtect(0); for(i=0;iHour = Read1302(RAM_ADDR); (Time
链接地址:https://www.31doc.com/p-5206220.html