使用DS12C887时钟芯片设计高精度时钟

合集下载

新型时钟日历芯片DS12C887的应用设计

新型时钟日历芯片DS12C887的应用设计

收 稿 日期 :0 0 0 — 2 2 1- 7 0
W Wed.n 2 1.2 电 子 元 嚣 件 焘 硐 2 W . ac 0 01 c 1
第 1卷 2
第 l 期 2
电 手 元 器 件 主 用
Elcr ni mp ne t& De ie App iai n e to cCo o n vc lc to s
杨 伟 强 张振 东 ,张 朋 ’ , ,刘 炳翔
(. 海理 工 大学 汽车 工程研 究所 ,上 海 2 0 9 ; 1上 0 0 3
2 上 海 由 乐电子 有 限公 司 ,上海 2 10 ) . 0 19
摘 要 : 介 绍 了 时 钟 日 历 芯 片 D 1 C 8 S 2 8 7的 主 要 功 能 、特 点 和 内部 地 址 分 布 . 给 出 了
◇ 可 用 二 进 制 或 B D码 表 示 日历 和 闹 钟 信 C 息:
MO 引 脚接 地 ,以选 用MO O O A 线 时序 。本 T TR L总
设 计 把 D 1 C 8 的 R M作 为 C 0 1 0 0 t 存 储 S2 87 A 85 F 2 # 部 ,
器 进 行 读 写 , 因而 程 序 简单 ,指 令 执 行 时 间 短 。
◇ 可 编程 方波 输 出 :
◇ 总线 兼 容 中断 f Q ; I ) R
◇ 具有 三 种可 编程 中断 。 D 1 C 8 实 时 时 钟 日历 芯 片 的地 址 分 布 如 S 2 87
图 1 示 , 芯 片 内 部 的 所 有 地 址 都 包 括 1 3 节 的 所 1字
芯 片 ,该 芯 片功 能 多 、可 靠性 高 ,使 用 简单 。通 过D 1 C 8 的 寄存 器 读 写 ,可 以很 容 易 的 获 取 S287 时间 信息 。因此 ,此 芯 片 在各 种设 备 、家 电 、仪

基于DS12C887时钟芯片的高精度时钟的设计毕业论文

基于DS12C887时钟芯片的高精度时钟的设计毕业论文

基于DS12C887时钟芯片的高精度时钟的设计毕业论文目录第1章绪论 (2)1.1 研究背景 (2)第2章方案论证选择 (2)2.1时钟计时的方案选择 (2)2.2显示部分的方案选择 (3)第3章系统组成 (4)3.1.1 系统原理与硬件设计 (4)3.1.2 硬件选择 (5)3.1.3单片机STC89C52中文资料 (5)3.1.4 STC单片机最小系统 (9)第4章系统硬件电路设计 (10)4.1.1晶振电路 (10)4.1.2复位电路 (10)4.1.3程序下载接口 (12)4.2.1 1602液晶概述 (12)4.2.2 1602液晶引脚功能 (12)4.2.3 1602读写时序图 (13)4.2.4 1602LCD的一般初始化(复位)过程 (15)4.2.5 1602LCD的电路连接 (16)4.3.1 DS12C887概述 (16)4.3.2 DS12C887引脚功能 (17)4.3.3 DS12C887读写时序 (18)4.3.4 DS12C887流程图 (18)4.3.5 时钟芯片引脚介绍 (19)4.3.6 4个控制寄存器介绍 (20)4.4闹铃电路 (22)4.5 独立键盘电路 (22)4.6 电源模块 (22)结论 (24)参考文献 (26)谢辞 (31)附录1 硬件实物图 (32)附录2 程序代码 (33)第1章绪论1.1 研究背景传统时钟芯片在电源断电时部的时间芯片就会停止计时,所以需要额外使用一个备用的电源向时钟芯片供电,这样会使系统功耗增大,体积变大。

单一功能定时时钟只提供年,月,日,时,分,秒的时间信息和日历功能,多功能时钟除了提供时间信息和日历功能以外,通常还具有报警,定时,闹钟等功能。

采用单片机STC89C52和时钟日历芯片DS12C887设计并且制作出来的电子钟,一个月的时间里只有1秒的误差[1],比DS1302,DS1307,PCF8485等的芯片设计出来的时钟更精确[2]时钟按照工具接口方式不同可以分为并行接口时钟和串行接口时钟,并行接口时钟的特点是:传输速度快,但是硬件数目多,接线数目多,产品体积大。

基于DS12C887的高精度语音闹钟万年历

基于DS12C887的高精度语音闹钟万年历

1 设计方案与论证随着电子技术的发展,计算机在现代科学技术的发展中起着重要的作用。

多媒体技术、网络技术、智能信息处理技术、自适用控制技术、数据挖掘与处理技术等都离不开计算机。

本课程设计是基单片机原理与接口技术的简单应用。

运用所学的单片机原理和接口技术知识完成数字电子表的设计。

电子表已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。

由于数字集成电路技术的发展和采用了先进的石英技术,使电子表具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。

尽管目前市场上已有现成的电子表集成电路芯片出售,价格便宜、使用也方便,但鉴于电子表电路的基本组成包含了数字电路的主要组成部分,因此进行电子表的设计是必要的,用汇编设计电子表显示程序,要求根据输入程序显示电子表画面。

研究电子表及扩大其应用,有着非常现实的意义。

方案一:主控芯片用MSP430,时钟芯片用DS1302,显示器用12864,语音芯片用ISD4001。

方案二:主控芯片用STC89C52,时钟芯片用DS12C887,显示器用1602,语音芯片用1420。

STC89C52单片机,这款单片机成本低廉,操作方便,而且足以满足控制要求。

实时时钟芯片有12C887和DS1302可供选择,DS1302是串口操作,用外部晶振,功能比较单一,而且精确程度有外部晶振影响。

12C887有内置晶振元和锂电池,并口操作,功能很多。

综上,我们选择12C887作为实时时钟芯片。

语音芯片种类很多,考虑到只用于那种功能,我们选择了1420语音芯片,录音简单,时长20秒,很符合系统要求。

显示模块有1602,1332,12864,数码管等可供选用,因为是万年历,而且只显示数字或英文字母,最终我们选用了1602作为显示器。

综上,我们选择方案二。

最后完全可以实现四个按钮可以设置时间和闹钟时间、有录放音功能、每次上电都能显示当时的时间、用液晶显示器显示实时时间以及闹钟时间这些功能。

基于单片机的电子万年历的设计与制作

基于单片机的电子万年历的设计与制作

郑州航空工业管理学院毕业论文(设计)题目基于单片机的电子万年历的设计与制作二О一三年五月二十三日摘要单片机应用技术飞速发展,从导弹的导航装置到飞机上各种仪表的控制,从计算机的网络通讯与数据传输到工业自动化过程的实时控制和数据处理,以及生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU、RAM、ROM 、定时、计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,系统由主控制器STC89C52为控制中心,DS12C887产生时钟,DS18B20产生温度,12864液晶显示对日期、时间等进行显示,按键可以设置时间、闹钟等。

能实现时钟、日历、时间和温度显示的功能。

今后万年历将会朝着精准度更高,外观更加美丽,价格更加实惠的方向发展,并且将会出现更多的辅助功能。

关键词:单片机,农历查询,万年历,温度显示ABSTRACTAs the rapid development of Single-chip Microcomputer Application technology, from the navigation device of missile to the various instruments on the aircraft control and from computer communication network and data transmission to industrial real-time automation process control and data processing, as well as the extensive use of the smart card and electronic pets in live, All of this is inseparable from the microcontroller. SCM is set to CPU, RAM, ROM, timing, counting and multiple interfaces in one microcontroller. It has the advantages of small volume, low cost, strong function, widely used in smart industries, and industrial automation.This paper designed a electronic clock which can achieve calendar function based on microcontroller, the system consists of main controller STC89C52, clock circuit, display circuit, DS12C887circuit, and a reset circuit components,the main control system as the control center, DS12C887 generates a clock, DS18B20 generates temperature, a 12864 LCD display the date and time, the key can set the time, alarm clock, achieved the clock calendar and time display function.In the future, the calendar will be more accurate, look more beautiful; more affordable prices of the direction of development, and will appear more auxiliary function.Keywords: Monolithic single-chip,lunar calendar demand, perpetual calendars display temperature目录摘要 (I)ABSTRACT (II)第1章绪论 (1)1.1 课题的背景 (1)1.2 电子万年历的发展 (1)1.3 电子万年历设计 (1)第2章设计要求与方案论证 (3)2.1 设计要求 (3)2.2 方案论证 (3)2.2.1 控制部分方案设计 .......................................... .32.2.2 显示部分的设计 ........................................... ..42.2.3 单片机芯片的选择方案和论证 (4)2.2.4 时钟芯片的选择方案和论证 (4)2.2.5 温度传感器的选择方案和论证 (5)2.2.6 电源的选择方案 (5)第3章硬件设计 (6)3.1 电路的设计框图 (6)3.2 主要单元电路的设计 (6)3.2.1 单片机主控电路设计 (6)3.2.2 时钟振荡电路设计 (8)3.2.3 复位电路设计 (9)3.2.4 温度传感器电路设计 (9)3.2.5 时钟电路设计 (12)3.2.6 显示电路设计 (13)3.2.7 按键电路设计 (16)3.2.8 报警电路设计 (16)第4章软件设计 (17)4.1 程序流程图 (17)4.1.1 主程序流程 (17)4.1.2 时间调整程序流程图 (18)4.1.3 时钟芯片读写程序流程 (20)4.1.4 温度测量元件控制程序流程 (20)4.1.4 公历转换成农历的基本原理 (21)4.2 操作与调试 (22)4.2.1 软件调试 (22)4.2.2 万年历实物 (23)总结与展望 (26)致谢 (27)参考文献 (28)附录一:系统硬件原理图 (29)附录二:元器件清单 (30)附录三:设计程序 (31)第1章绪论1.1 课题的背景随着社会的发展和科技水平的提高,人类获得和计算时间的方法,历经观天阳、摆钟到现在电子钟,经过不断发展和创新,计时的精度越来越准确。

单片机课程设计--电子秒表与闹钟的设计

单片机课程设计--电子秒表与闹钟的设计

目录摘要 (Ⅰ)1 电子秒表与闹钟系统概述 (1)1.1 课程设计基本要求 (1)1.2 系统实现功能 (1)1.3 系统应用价值展望 (2)2 仿真软件Proteus和Keil简介 (3)2.1 Proteus简介 (3)2.2 Keil简介 (3)3 系统工作原理分析 (4)3.1AT89C2051模块 (4)3.2 显示驱动模块 (6)3.3 数码管显示模块 (8)4 程序流程图设计 (9)5 Proteus仿真原理图 (12)6 课程设计体会 (14)参考文献 (15)附:源程序代码 (16)摘要随着科学技术的不断发展 , 人们对时间计量的要求越来越高。

在当今社会,电子时钟已经得到相当广泛的应用,产品多样,发展更是多元化。

本作品是以STC89C51单片机作为主控芯片,使用12MHZ的晶振,使用专用时钟日历芯片DS12C887产生时间信息,时间精确。

软件部分以C语言为主体,用1602LCD 液晶屏显示输出信息,输出信息量多,更直观、人性化。

该时钟可实现人机交互,可通过提供的键盘对其进行调整。

系统具有以下功能:年、月、日、时、分、秒显示;12小时/24小时模式切换,在12小时模式中,用AM和PM区分上午和下午;秒表功能;整点闹铃和报时功能,且闹钟可设置多组。

本次设计的电子时钟系统由单片机最小系统,1602LCD液晶屏,时钟芯片,调整按键,蜂鸣器,电源五大部分组成。

关键词:定时器中断闹钟电子时钟1 电子秒表与闹钟系统概述1.1 课程设计基本要求(1) 用并行口设计一个具有显示功能的秒表,显示准确的北京时间(时、分、秒),可用24小时制式;(2) 有时间校准功能;(3) 允许通过转换功能键转换显示时间,用定时器实现一个电子闹钟,能设定和修改定时的时间,并能到时响铃通知;(4) 所有按键需要通过串口自发自收来调校各种功能。

1.2 系统实现功能本系统是基于单片机AT89S52制作的数字电子钟。

根据实验要求,在完成实验所要求的基本功能外,扩展了几个功能。

在智能化仪器仪表中ds12c887

在智能化仪器仪表中ds12c887

在智能化仪器仪表中,往往需要走时准确的实时时钟为多通道数据采集、定时及实时控制提供精确的时间基准和同步信号。

目前,实现实时时钟的方法主要有软件时钟(由软件计时实现)、硬件时钟(由硬件时钟芯片实现)、GPS时钟(由全球卫星定位系统提供)等。

软件时钟具有硬件开销小、成本低、外围电路简单等优点。

但由于时钟是靠软件延时实现的,运行过程中不仅要占用大量的CPU时间,而且计时精度低、走时误差较大,在智能化仪器仪表中很少采用。

GPS (全球卫星定位系统)提供的实时时钟信号虽然具有相当高的精度,但由于GPS产品成本高,在普通智能化仪器仪表中很少采用。

本文介绍一种较新的实时时钟芯片DS12C887及其与AT89C51单片机的软硬件接口。

1 DS12C887的特点及引脚描述DS12C887是由美国达拉斯半导体公司推出的CMOS并行实时时钟芯片,它与目前微型计算机主机板中普遍采用的MC146818、DS12887时钟芯片引脚完全兼容,可以直接替换。

DS12C887将时钟电路、晶振及其外围电路、锂电池及其相关电路等嵌装成一体,并具有与微处理器的并行接口,可方便地用于对时钟精度要求较高的智能化仪器仪表中。

DS12C887的主要功能特点有:(1)内含锂电池。

当外电源电压降到3 V以下时,时钟自动将电源切换到由芯片内部锂电池供电,在外电源断电的收稿日期:2002—05~20作者简介:宋雨潭(1972一),女,吉林长春人,工程师。

情况下,时钟可以连续运行10 a而不丢失数据。

(2)具有秒、分、时、日、月、年、世纪、星期计时及闰年自动校正功能。

(3)可根据用户需要选择24/12 h运行方式和夏令时运行方式。

(4)由硬件选择MOTOROLA和INTEL总线时序,便于和不同的微处理器相连接。

(5)内含128字节掉电保持RAM单元,其中10字节用于存储时钟日历和报警信息,4字节用于状态控制寄存器,其余I14字节供用户存储需要掉电保持的信息和数据。

温湿度检测功能电子时钟

温湿度检测功能电子时钟

湄洲湾职业技术学院温湿度检测功能电子时钟系别:自动化工程系年级:10级专业:电气自动化姓名:小何学号:1001020228导师姓名:佘明辉职称:教授2013年 5月27日1 前言 (1)2 系统设计技术参数要求 (2)3 系统设计 (3)3.1 系统设计总体框图 (3)3.2各模块原理说明 (3)3.3系统总原理图说明 (4)3.4系统印刷电路板的制作图 (4)3.5系统的操作说明 (4)3.6系统操作注意事项 (4)参考文献 (5)致谢词 (6)附录 (7)附录1 系统整体原理图 (7)附录2 系统印刷电路板的制作图 (8)附录3程序与元件清单 (9)温度和湿度的检测和控制是许多行业的重要工作之一,不论是货品仓库、生产车间,都需要有规定的温度和湿度,然而温度和湿度却是最不易保障的指标,针对这一情况,研制可靠且实用的温度和湿度检测与控制系统就显得非常重要。

温湿度的检测与控制是工业生产过程中比较典型的应用之一[1],随着传感器在生产和生活中的更加广泛的应用。

在生产中,温湿度的高低对产品的质量影响很大。

由于温湿度的检测控制不当,可能使我们导致无法估计的经济损失。

为保证日常工作的顺利进行,首要问题是加强生产车间内温度与湿度的监测工作,但传统的方法过于粗糙,通过人工进行检测,对不符合温度和湿度要求的库房进行通风、去湿和降温等工作。

这种人工测试方法费时费力、效率低,且测试的温度及湿度误差大,随机性大。

由于温湿度传感器及其控制系统是20世纪90年代才兴起的行业,因此设计出一款精度高、稳定性好、成本低的温湿度检测控制系统具有一定的市场前景。

此研究项目采用具有高精度,防干扰等优点的传感器,结合单片机嵌入式系统技术,设计完成的系统具有易携带、低功耗等特点,从而克服了传统温湿度检测系统需要复杂的校准过程和精度较低的缺点。

2 系统设计技术参数要求1.+5V电压,对比度可调;2.内含复位电路;3.提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;4.有80字节显示数据存储器DDRAM;5.内建有160个5X7点阵的字型的字符发生器CGROM;3 系统设计3.1系统设计总体框图图3-1 系统设计总体框图3.2各模块原理说明1.时间设置模块因设置模块只需编写相应的程序外加相应的按键即可实现,实现方法较简单,在此不再论述。

用实时时钟芯片DS12C887设计高精度时钟

用实时时钟芯片DS12C887设计高精度时钟
1引言 . 在 许 多 电 子 没备 和监 控 系 统 当 中 , 常 会 进 行 一 些 与 时 间有 关 的 通 控 制 , 要 记 录 实 时 的 时 间 信 息并 长 期 保 存 。 比如 , 数 据 采 集 时 , 需 在 对 某 些重要 的信息不仅 需要记 录其 内容 , 还要 记录下该事 件发生 的准确 时问 ; 比如 , 义 实时 网速 流量 监控系统 , 了要显示流量数据 以外 , 除 还要 记 录实时的时 间信息 , 中包 括年 、 、 时 、 、 其 月 日、 分 秒等 。为了实现上述 目的 , 需 要 实 时 时钟 的 参 与 配 合 。 然 而 , 常 单 片机 没 有 实 时 时 钟 功 就 通 能 , 果 用 单 片 机 系统 的 定 时 器 的 中 断 电路 来 设 计 时钟 的话 , 然 的 掉 如 偶 电或晶振 的误差都会 造成时 间的错乱 ; 如果 完全用程序 设计时钟 则会 占 用 大 量 的 系 统 资 源 , 而严 重 影 响 系 统 的 其 他 功 能 运 行 , 采 用 独 立 从 而 运 行 的 实 时 时 钟 芯 片 D 1 C 8 , 可 避 免 不 少 麻 烦 , 时 配 合 相 应 的 S 2 87 就 同 程 序就可以有效地完成所有达到 的 目的。 2 D 2 8 7时 钟 芯 片 介 绍 . S1 C 8 21 1C 8 主 要 功 能 特 性 .DS 2 8 7 D 1C 8 时钟 芯片能够 自动产 生世纪 、 、 、 时 、 、 等时 S2 87 年 月 日、 分 秒
32系 统 整 体 方 案 设 计 图 .
— — — — — — —
竺 tBiblioteka / lS C81 D 2 7J r '  ̄
功 设键 I 能置 ・
单机 片

基于单片机的DS12C887时钟芯片应用研究

基于单片机的DS12C887时钟芯片应用研究

品 。 S 2 8 与D 1 8 的 形 式 、 置 和 功 能 相 同 , 是D 1 8 7 D 18 7 S 2 7 配 只 S 2 8 增 加 了6 字 节 的通 用 R M。 访 问 附 加 的6 字 节R M取 决 于访 4 A 4 A 问 周 期 地 址 输 出 阶 段 A 6 逻 辑 电 平 , 4 脚 双 排 直 列 封 装 D 的 2管 内包 含 有 一 个 锂 电 池 、 英 晶振 和写 保 护 电路 。 因 此D 1 8 7 石 S28 是 一 个 完 整 的 子 系 统 , 取 代 在 典 型 应 用 中 的 l 个 组 件 , 的 可 6 它 功能 包 括 非 易 失 时 钟 、 报 器 、 年历 、 编程 中 断 、 波 发 生 警 百 可 方 器 和 l 4 节 . 易 失 静 态 R M. 时 时 钟 在 断 电情 况 下 仍 能 1字 非 A 实 保 持 时 间 与 内 存 是 其 与众 不 同 的 特 点 。 MO ( 式 选 择 ) T 脚 为 两种 总线 类 型 的选 择 提 供 了 T模 : MO 管 方便 , 当联 接 到 V C , 择 MO O L C 时 选 T R A时 序 , 联 接 到 G D 当 N 时. 选择 I T L N E 时序 , 管 脚 有 一 约2 K 部 下 拉 电 阻 。 此 0内
基 于 单 片 机 的 DS1 C8 7 钟 芯 片 应 用 研 究 2 8 时
王 啸 东
( 京 铁 道 职 业 技 术 学 院 ( 州 校 区 ) 江 苏 苏州 南 苏 , 253 ) 1 1 7
摘 要 :新 型 时钟 芯 片 D IC 8 具 有 计 时 精 确 、 电情 S 2 87 断 况 下 运 行 十年 以 上 不 丢 失 资 料 等 优 点 ,在 单 片 机 计 时 系统 中 有 着 广 泛 应 用 。 本 文 分 析 了D 1 C 8 的 功 能 特 性 .介 绍 了 S 2 87 D 1 C 8 与 A 8 C l 片机 系统 的硬 件 电路 图 . 同时 介 绍 了 S 2 87 T 9 5 单

基于DS12C887的高精度时钟设计

基于DS12C887的高精度时钟设计

基于DS12C887的高精度时钟设计摘要:设计以ATM89C52单片机为核心的,采用LCD1602液晶和专门时钟芯片DS12C887的高精度时钟,该时钟具有电路结构简单合理、显示精度高和实时更新显示等特点。

介绍了DS12C887芯片和LCD1602液晶的特点、功能和实现方法,给出了ATM89C52单片机的外部接口电路和相关程序的设计方法。

关键词:单片机;时钟芯片;实时时钟;接口电路0引言随着人们生活水平的提高和智能化电子集成的发展,许多电子设备,通常要进行与时间有关的控制,并需要记录实时的时间信息。

许多重要的信息不仅需要记录其内容,还需要记录发生的准确时间。

有些设备需要长时间运行并且保证掉电数据不丢失。

通常的单片机并没有这样的实时时钟功能,单片机掉电或者时钟晶振的误差会导致时间错乱。

如果完全用程序设计时钟,又会占用单片机大量的系统资源,影响到其他功能的实现。

美国Dallas公司的DS12C887实时时钟芯片,将晶振、写保护电路、可充电锂电池等集成,可保证时钟精确、掉电时时钟数据不丢失,可靠性高,使用简单。

1系统原理本系统利用DS12C887芯片设计的高精度时钟,与52单片机相连,通过1602液晶显示,实现在1602液晶上精确显示年、月、日、时、分、秒,并且在掉电的情况下仍能记录时间数据,通电后更新实时显示,与矩阵键盘相连接,能够使用按键调节时间,设定闹钟。

2核心芯片AT89C52单片机本系统核心芯片采用ATMEL公司生产的AT89C52单片机。

AT89C52是51系列单片机的其中一种型号,是一种低电压、高性能的8位单片机。

其片内含有8K bytes的可反复擦写Flash只读程序存储器和256 bytes的随机存取数据存储器。

AT89C52有40个引脚,其中32个为外部双向输入/输出(I/O)引脚,同时内含2个外部中断口,51单片机内部共有定时器T0和定时器T1两个16位可编程定时/计数器,AT89C52单片机内部比51单片机多一个T2定时/计数器,它们可以按照常规方法进行编程,并兼容标准MCS-51指令系统。

DS12C887时钟日历芯片

DS12C887时钟日历芯片
DS12C887处于正常工作状态时,每秒钟将产生一个更新周期。芯片片于更新周期的标志是寄存器A中的UIP位为1。在更新周期内,芯片内部时标寄存器的数据处于更新阶段。所以,在这个阶段微处理器不能读时标寄存器的内容,否则将得到不确定数据。
更新周期的基本功能主要是:
1、刷新各个时标寄存器中的内容,同时秒时标寄存器内容加1,并检查其他时标寄存器内容是否有溢出,如果有溢出则相应进位分、时、日、月、年。2、检查3个——时、分、秒闹钟时标寄存器的内容是否与对应时标寄存器的内容相符。如果相符,则寄存器C中的AF位置1;如果闹钟时标寄存器的内容为C0H~FFH之间数据,则为不关心状态。
在中断申请中,要读一次寄存器C,目的就是使寄存器C中的内容自动清0。IRQF为0,则不再引起中断申请。目的就是使下一次闹钟时间与当前时间符合时,可以再次申请中断。
另一个理解:如果在中断服务程序中不读寄存器C,即,不使寄存器C中的各位清0的话,那么就会不断的申请中断。因为IRQF值为1。——我这个理解未做测试,以后将测试结果放上。
DS/RD:数据选择或读输入引脚该引脚有两种工作模式:Motorola工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通。在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取。在写操作中,DS的下降沿将使总线 AD0~AD7上的数据锁存在DS12C887中;Intel工作模式中,DS被称作RD。该引脚是读允许输入脚,即Read Enable。是读(RD)信号输入端。当他有效时表示DS12C887正往总线输出数据。RD信号线在存储器芯片上被称作OE信号线。
下面在讲ห้องสมุดไป่ตู้关于DS12C887的初始化
DS12C887采用连续工作制,一般无需每次都初始化,即使是系统复位时也是如此。一般是新产品买回来,第一次使用的时候初始化;或者你想要初始化的时候。那么如何初始化DS12C887呢?

DS12C887电子时钟详细教程

DS12C887电子时钟详细教程

本人呕心沥血制作的一个基于ds12c887的电子钟的详细教程,程序已经在protues中仿真,仿真图在下方!!花了血本制作的,我花了将近一个月时间探索出来的电子钟(其间断断续续编),在这里给同学们一个好的案例,这个程序由用51,1602,ds12c887,4个按键,一个喇叭。

下面还介绍了总线的画法,以及实际中连接编程时的重要注意事项,附上了时序图,对程序的解释很是详细,看了好的帮我顶下,谢谢大家!------------------------血顶猎鹰D7D6D5D4D3D2D1DERWRSVSSVDDVEEs2,s3可以调整闹铃时间。

仿真时有一个小bug,当按下闹铃后再按s1,再退出时得再重新按一遍闹铃才可以正常运行,估计是软件的原因。

我用的是7.7的,所以有这个芯片,这是我从论坛上找的版本低的解决办法,大家可以看下仿真软件如果版本低可以这样将库文件和dll文件复制到7.5SP3的library和models,仿真时,每次一定要给寄存器初始化,否则时钟不能正常运行.正式硬件运行时仅初次化时使用一下,将以下内容屏蔽后重新编译,再下载程序到89C51.//初始化DS12C887工作方式write_ds(0x0A,0x20);//打开振荡器write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式,开启闹铃中断set_time();//设置上电默认时间,调试的时候用对这三个进行屏蔽,还有把set time()这个子函数屏蔽掉仿真软件中bus总线画法如下,拖出总线,点lbl给总线标上AD[0..7],再标细线时有没发现框里多了这些标号相同的电气连接相同,好了,去连吧。

下面是程序,主要参照郭天祥那本书的,关键地方加了很详细的注释#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^4;sbit lcden=P2^6;sbit s1=P3^0; //功能键sbit s2=P3^1; //增大键sbit s3=P3^2; //减小键sbit s4=P3^6; //闹铃查看键sbit beep=P2^3;//蜂鸣器sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^3; //中断bit flag1,flag_ri;//定义标志位flag1设置闹铃uchar count,s1num,flag,t0_num;char miao,shi,fen,year,month,day,week,amiao,afen,ashi;char code table[]=" 20 - - "; // 20 - -uchar code table1[]=" : : "; // : :void write_ds(uchar,uchar); uchar read_ds(uchar);void set_time();void read_alarm();void set_alarm(uchar,uchar,uchar);void delayms(uint z) //延时毫秒的程序{uint x,y;for(x=z;x>0;x--)for(y=112;y>0;y--);}void di(){beep=0;delayms(100);beep=1;}void write_cmd(uchar cmd){lcden=0;lcdrs=0;P0=cmd;_nop_();lcden=1;delayms(1);lcden=0;_nop_();}void write_dat(uchar dat){lcden=0;lcdrs=1;P0=dat;_nop_();lcden=1;delayms(1);lcden=0;_nop_();}void lcdint(){lcden=0;write_cmd(0x38); // 显示模式设置write_cmd(0x0c); //开显示,不显示光标,不闪烁write_cmd(0x06); //写一个字符后地址加1,屏幕不移write_cmd(0x01); //清屏delayms(1);}void init(){uchar num;EA=1;//开总中断EX1=1;//开外部中断1IT1=1;//外部中断下降沿触发flag1=0; t0_num=0;s1num=0;week=1;write_ds(0x0A,0x20);//打开振荡器write_ds(0x0B,0x26);//设置24小时模式,数据二进制格式,开启闹铃中断set_time();//设置上电默认时间,调试的时候用lcdint();write_cmd(0x80);for(num=0;num<15;num++){write_dat(table[num]);}write_cmd(0xc0);for(num=0;num<11;num++){write_dat(table1[num]);}}void write_sfm(uchar add,char date) //写时间,2位一起写{char shi,ge;shi=date/10;ge=date%10;write_cmd(0xc0+add);write_dat(0x30+shi);write_dat(0x30+ge);}void write_nyr(uchar add,char date)//年月日{char shi,ge;shi=date/10;ge=date%10;write_cmd(0x80+add);write_dat(0x30+shi);write_dat(0x30+ge);}void write_week(char we)//星期{write_cmd(0x80+12);switch(we){case 1: write_dat('M');write_dat('O');write_dat('N');break;case 2: write_dat('T');write_dat('U');write_dat('E');break;case 3: write_dat('W');write_dat('E');write_dat('D');break;case 4: write_dat('T');write_dat('H');write_dat('U');break;case 5: write_dat('F');write_dat('R');write_dat('I');break;case 6: write_dat('S');write_dat('A');write_dat('T');break;case 7: write_dat('S');write_dat('U');write_dat('N');break;}}void keyscan(){if(flag_ri==1){if((s1==0)||(s2==0)||(s3==0)||(s4==0))//按任意键取消闹钟报警{delayms(5);if((s1==0)||(s2==0)||(s3==0)||(s4==0)){while(!(s1&&s2&&s3&&s4));di();flag_ri=0;}}}if(s1==0) //如果功能按键1按下{delayms(5); //去抖动if(s1==0){while(!s1); //等待松手s1num++; //记下次数di(); //蜂鸣器响if(flag1==1) //设置闹铃为1时才对s1num调整,只调秒,分,时{if(s1num>3){s1num=1;}}flag=1; //在调整时间时标志位flag为1,不进行正常操作switch(s1num){case 1:write_cmd(0xc0+10); write_cmd(0x0f); break; //按一下秒钟指针显示闪烁case 2:write_cmd(0xc0+7); break;case 3:write_cmd(0xc0+4); break;case 4:write_cmd(0x80+12); break;case 5:write_cmd(0x80+9); break;case 6:write_cmd(0x80+6); break;case 7:write_cmd(0x80+3); break;default: //用default可以解决s1num跑飞s1num=0;write_cmd(0x0c); //按了8次关闪烁,flag=0,退出调整,显示时间flag=0;write_ds(0,miao); //将调整后的时间写入ds12c887write_ds(2,fen);write_ds(4,shi);write_ds(6,week);write_ds(7,day);write_ds(8,month);write_ds(9,year);break;}}}if(s1num!=0) //S1有按下过,检测S2,S3{if(s2==0) //如果按键2按下执行加{delayms(5);if(s2==0){while(!s2);di();switch(s1num){case 1:miao++;if(miao>59){miao=0;}write_sfm(10,miao);write_cmd(0x80+0x40+10);break;case 2:fen++;if(fen>59){fen=0;}write_sfm(7,fen);write_cmd(0x80+0x40+7);break;case 3:shi++;if(shi>23){shi=0;}write_sfm(4,shi);write_cmd(0x80+0x40+4);break;case 4:week++;if(week>7){week=1;}write_week(week);write_cmd(0x80+12);break;case 5:day++;if(day>31){day=1;}write_nyr(9,day);write_cmd(0x80+9);break;case 6:month++;if(month>12){month=1;}write_nyr(6,month);write_cmd(0x80+6);break;case 7:year++;if(year>99){year=0;}write_nyr(3,year);write_cmd(0x80+3);break;}}}if(s3==0){delayms(5);if(s3==0){while(!s3);di();switch(s1num){case 1:miao--;if(miao<0){miao=59;}write_sfm(10,miao);write_cmd(0x80+0x40+10);break;case 2:fen--;if(fen<0){fen=59;}write_sfm(7,fen);write_cmd(0x80+0x40+7);break;case 3:shi--;if(shi<0){shi=23;}write_sfm(4,shi);write_cmd(0x80+0x40+4);break;case 4:week--;if(week<1){week=7;}write_week(week);write_cmd(0x80+12);break;case 5:day--;if(day<1){day=31;}write_nyr(9,day);write_cmd(0x80+9);break;case 6:month--;if(month<1){month=12;}write_nyr(6,month);write_cmd(0x80+6);break;case 7:year--;if(year<0){year=99;}write_nyr(3,year);write_cmd(0x80+3);break;}}}}if(s4==0){delayms(5);if(s4==0){while(!s4);di(); flag1=~flag1; //闹铃调好后再按一次键返回if(flag1==0) //退出闹钟设置保存数值{flag=0; //启动时间显示write_cmd(0x80+0x40);write_dat(' ');write_dat(' ');write_cmd(0x0c); //清屏下,否则光标乱跳(闹铃调时间时)write_ds(1,miao);write_ds(3,fen);write_ds(5,shi);}else //设置闹钟{read_alarm(); //读原始数据miao=amiao;fen=afen;shi=ashi;write_cmd(0xc0);write_dat('R');write_dat('i');write_cmd(0x80+0x40);write_sfm(4,ashi);write_sfm(7,afen);write_sfm(10,amiao);}}}}void write_ds(uchar add,uchar date)//写12c887函数{dscs=0;dsas=1;dsds=1;dsrw=1;P0=add; //写地址dsas=0;dsrw=0;P0=date; //写数据dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add) //读12c887{uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}void set_time() //初始化{write_ds(0,0); //秒write_ds(1,10); //秒闹铃write_ds(2,34); //分钟write_ds(3,34); //分钟闹铃write_ds(4,15); //小时write_ds(5,15); //小时闹铃write_ds(6,5); //星期write_ds(7,20); //日write_ds(8,5); //月write_ds(9,11); //年}void read_alarm(){amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5);}void main(){init();while(1){keyscan(); //键盘不断扫描if(flag_ri==1) //如果闹铃时间到{di();delayms(100);di();delayms(500);}if(flag==0&&flag1==0){keyscan();year=read_ds(9);month=read_ds(8);day=read_ds(7);week=read_ds(6);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_nyr(3,year);write_nyr(6,month);write_nyr(9,day);}}}void exter()interrupt 2 //闹铃外部中断1{uchar c; //闹铃时间到flag_ri=1;c=read_ds(0x0c); //读C寄存器表示响应中断}下面是管脚和时序图寄存器的定义如下我爱帮帮,啵!嘻嘻。

智能时钟日历温度计

智能时钟日历温度计

毕业设计说明书题目:智能时钟日历温度计的设计院(系):专业:学生姓名:学号:指导教师:职称:摘要目前温度计的发展很快,从原始的玻璃管温度计发展到了现在的热电阻温度计、热电偶温度计、数字温度计、电子温度计等等。

随着科学技术的发展和现代工业技术的需要,测温技术也不断地改进和提高。

由于测温范围越来越广,根据不同的要求,又制造出不同需要的测温仪器。

本文设计一个智能时钟日历温度计,要求既能掌握时间又能了解天气温度的变化,方便又适用的智能时钟日历温度计是以单片机(AT89C51)为核心,使用温度采集芯片DS18B20来对当时室温进行采集,通过液晶屏TS1602-1来显示,DS12C887时钟芯片来读取时间。

时钟芯片需要初始化进行启动,设置初值后不用再反复设置,并且可以准确显示年、月、日、时、分、秒,少于31天的月份自动地调整,包括闰年补偿,还可以设置闹铃并通过蜂鸣器鸣报来提示,电路安装四个按键来控制温度及时间的修改,通过选择键分别对要修改的值进行修改,也可以修改设置闹铃等。

所选用的芯片DS12C887具有功耗低、外围接口简单、精度高、工作稳定可靠等优点,可广泛应用于各种需要较高精确度的实时时钟场合中。

芯片DS18B20测量温度范围广,能达到-55℃~+125℃,分辨率高,可实现高精度测温,因此对周围温度较敏感能准确采集温度。

关键词:单片机AT89C51;温度采集芯片DS18B20;液晶屏TS1602-1;蜂鸣器AbstractAt present the thermometer has developed very rapidly, from the original glass tube thermometer to the development of the current heat resistance thermometers, thermocouple thermometers, digital thermometers, electronic thermometers, and so on. With the development of science and technology and the needs of modern industrial technology, temperature measurement technology is constantly improving and improving. As more and more wide temperature range, according to different requirements, and create different needs for the thermometer.In this paper, the design of a smart clock calendar thermometer for both track of time while the weather changes in temperature, convenient and application of smart clock thermometer on the calendar SCM (AT89C51) as the core, the use of temperature to the acquisition chip DS18B20 was carried out at room temperature Acquisition through TS1602-1 LCD screen to display, DS12C887 time clock chip to read. Clock Chip need to initialize a start, set up after the initial do not have to repeatedly set up and can accurately display year, month, day, real-time clock, less than 31 days of the month automatically adjusted, including leap year compensation, but also can set the alarm And through buzzer-ming was to suggest that circuit installation of four keys to control the temperature and time changes, respectively, through the selection key to amend the value of the revision can also modify settings, such as an alarm.DS12C887 selected chips with low power consumption, the external simple interface, high precision, stable and reliable work of the advantages that can be widely applied to the needs of high accuracy of real-time clock occasions. DS18B20 chip measuring a wide range of temperature can reach -55 ℃~ +125 ℃, high resolution, high-precision temperature measurement can be realized and therefore more sensitive to the ambient temperature can collect accurate temperature.Key words:SCM AT89C51;temperature acquisition chip DS18B20;LCD TS1602-1;buzzer目录引言 (1)1 时钟温度计的设计流程 (2)1.1设计要求 (2)1.2设计流程图 (2)1.3流程图解说 (2)1.4芯片的选择 (3)2 时钟温度计的硬件部分 (3)2.1时钟温度计的原理 (3)2.2测温模块 (4)2.2.1DS18B20与单片机的连接 (5)2.2.2DS18B20工作原理 (5)2.2.3单片机AT89C51构造 (8)2.3时钟模块 (16)2.3.1DS12C887的连接图 (17)2.3.2DS12C887的初始化设置 (18)2.3.3A/D转换 (20)2.4显示电路模块 (22)2.4.1液晶TS1602 (23)3 软件设计 (23)3.1软件设计流程图 (23)3.2测温编程 (24)3.2.1DS18B20时序的读写 (26)3.2.2单片机I/O口 (27)3.3时钟编程 (29)3.3.1A/D转换器 (30)3.3.2时钟电路引脚 (31)3.4液晶显示驱动 (32)3.5按键及其它部分 (33)4 电路调试 (34)5 结论 (36)谢辞 (37)参考文献 (38)附录 (39)引言在单片机技术日趋成熟的今天,其灵活的硬件电路的设计和软件的设计,让单片机得到了广泛的应用,几乎是从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。

DS12C887中文资料_数据手册_参数

DS12C887中文资料_数据手册_参数
Applications
Embedded Systems
Utility Meters
Security Systems
Network Hubs, Bridges, and Routers
Typical Operating Circuit
CRYSTAL VCC
DS83C520
X1 X2 AS
VCC RESET
Storage Temperature Range .............................-55°C to +125°C Soldering Temperature .......................................See IPC/JEDEC
J-STD-020 Specification (Note 1) Soldering Temperature (leads, 10s) ................................+260°C
Rev 3; 2/07
DS12885/DS12887/DS12887A/DS12C887/DS12C887A
Real-Time Clock
General Description
The DS12885, DS12887, and DS12C887 real-time clocks (RTCs) are designed to be direct replacements for the DS1285 and DS1287. The devices provide a real-time clock/calendar, one time-of-day alarm, three maskable interrupts with a common interrupt output, a programmable square wave, and 114 bytes of batterybacked static RAM (113 bytes in the DS12C887 and DS12C887A). The DS12887 integrates a quartz crystal and lithium energy source into a 24-pin encapsulated DIP package. The DS12C887 adds a century byte at address 32h. For all devices, the date at the end of the month is automatically adjusted for months with fewer than 31 days, including correction for leap years. The devices also operate in either 24-hour or 12-hour format with an AM/PM indicator. A precision temperature-compensated circuit monitors the status of VCC. If a primary power failure is detected, the device automatically switches to a backup supply. A lithium coin-cell battery can be connected to the VBAT input pin on the DS12885 to maintain time and date operation when primary power is absent. The device is accessed through a multiplexed byte-wide interface, which supports both Intel and Motorola modes.

DS12C887资料

DS12C887资料

DS12C887时钟日历芯片,是由美国DALLAS公司生产的新型时钟日历芯片,采用CMOS技术制成。

芯片采用24引脚双列直插式封装,内部集成晶振、振荡电路、充电电路和可充电锂电池,组成一个加厚的集成电路模块,在没有外部电源的情况下可工作10年。

具有良好的微机接口、精度高、外围接口简单、工作稳定可靠等优点,可广泛使用于各种需要较高精度的实时场合。

一、器件特性·可计算到2100年前的秒、分、小时、星期、日期、月、年七种日历信息并带闰年补偿;·自带晶体振荡器和锂电池。

在没有外部电源的情况下可工作10年;·对于一天内的时间记录,有12小时制和24小时制两种模式。

在12小时制模式中,用AM和PM区分上午和下午;·可选用夏令时模式·时间表示方法有两种:一种用二进制数表示,一种用BCD码表示;·DS12C887中带有128字节RAM,其中11字节用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节RAM供用户使用;·数据/地址总线复用·用户可编程以实现多种方波输出·可应用于MOTOROLA和INTEL两种种线。

——我这里只阐述INTEL总线实现方法·三种可编程中断:定闹中断、时钟更新结束中断、周期性中断DS12C887各引脚的功能说明GND、VCC:直流电源,其中VCC接+5V输入,GND接地。

当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;当VCC输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC输入小于+3V时,DS12C887会自动将电源切换到内部自带的锂电池上,以保证内部的电路能够正常工作。

MOT:模式选择引脚DS12C887有两种工作模式,即Motorola模式和Intel模式。

课程设计_电子万年历DS12C887+温度18B20+LCD12864显示+闹钟

课程设计_电子万年历DS12C887+温度18B20+LCD12864显示+闹钟

西南科技大学电子专业综合设计报告设计名称:基于单片机的多功能电子万年历系统设计姓名:学号:班级:指导教师:起止日期:西南科技大学信息工程学院制综合设计任务书学生班级:学生姓名:学号:设计名称:基于单片机的多功能电子万年历系统设计起止日期:指导教师:设计要求:基本要求:1.查阅有关资料,掌握单总线的基本通信协议及C语言的编程方法;2.用STC89C52微控制器控制DS12CR887和DS18B20的工作方式,完成多功能电子万年历系统的设计,显示部分采用LCD12864。

要求日期可显示农历,并能提示农历节日和阳历节日;要求电子万年历具有闹钟功能并能实时显示当前环境温度;3.对系统的工作的可靠性进和稳定性行分析,得出结论;4.撰写设计报告。

综合设计学生日志时间设计内容2013.11.23 熟悉题目,对研究题目做分析,具体划分为几个模块2013.11.24 LCD12864显示屏的显示模块的实现2013.11.25 DS18B20温度传感器模块的研究2013.11.26 对DS18B20和LCD12864联合设计温度显示系统2013.11.27 阅读DS12CR887的数据手册,了解芯片的功能实现2013.11.28 根据DS12CR887数据手册完成基本的驱动程序2013.11.30 在C52单片机最小系统的的基础上搭建电子万年历硬件系统,完成芯片焊接及连线2013.12.1 上网查阅阳历转换阴历的相关算法2013.12.2 完成阳历转换阴历相关算法在单片机的程序设计以及节日的显示程序2013.12.3 设计程序实现在LCD12864上显示时间,日期,农历,节日,温度等功能2013.12.4 完成闹钟程序设计2013.12.5 调试硬件系统和软件系统解决系统BUG2013.12.6 完成课程设计报告1基于单片机的多功能电子万年历系统设计摘要:电子万年历是一种通过STC52C89RC单片机编程来对不同电子芯片件进行控制、执行、数据读取、和读取的数据结果的显示的电子产品。

基于单片机的高精度时钟设计

基于单片机的高精度时钟设计

中国西部科技2009年7月(中旬)第08卷第20期总 第181期基于单片机的高精度时钟设计陈华兵 傅成华 方景杰(四川理工学院自动化与电子信息学院,四川 自贡 643000) 摘 要:本文采用一种具有低功耗的多功能时钟/日历芯片DS18B20为核心,设计出一个带有校时和闹钟功能的实时显示 智能电子钟,通过键盘实时调整系统当前时间和设定系统闹钟时间。

关键词:DS12887;单片机;1602液晶 Abstract:This paper based on a multi-purpose clock and calendar chip DS18B20 which runs on low power,designs one real time display and intelligence electron clock of having timing check and alarm clock functions,adjusting system current time and setting system alarm clock-time by keyboard. Key words:DS12887;Monolithic integrated circuit;LCD16021引言 随着电子技术的产业结构调整,生产工艺的飞速发控制功能完善。

其内部具有128字节RAM, 而且内部含有 4KB的可编程闪烁存储器,数据保留时间可达10年以上。

③ 丰富强大的外接接口性能:32个可编程I/O口,可编程串行 通道。

2.2 实时时钟芯片 DS12887美国DALLAS公司推出的8位并行接口实时时钟 /日历芯片, 利用CMOS技术制成。

采用24引脚双列直插式封 装, 是由振荡电路、分频电路、周期中断/方波选择电路、 14字节时钟和控制单元、114字节的用户非易失性RAM、十 进制/二制累加器、总线接口电路、内部锂电池等部分组 成。

实时时钟DS12C887_C实例程序

实时时钟DS12C887_C实例程序

DS12C887实例程序#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar nian,yue,ri,day,shi,fen,miao,ashi,afen,sshi,sfen;uchar s1num,flag,flag1,flag2,flag3,flag4,settime,setalarm;/********************************************************************引脚配置定义 GND VCC VL RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK*********************************************************************/#define LCDIO P1sbit LCD1602_RS=P3^5;sbit LCD1602_RW=P3^4;sbit LCD1602_EN=P3^3;sbit s1=P2^1;sbit s2=P2^2;sbit s3=P2^0;sbit s4=P2^3;/********************************************************************/ void LCD_delay(void);void delay_ms(unsigned int n);uchar change_bcd(uchar a);void LCD_en_command(unsigned char command);void LCD_en_dat(unsigned char temp);void LCD_set_xy( unsigned char x, unsigned char y );void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s); void LCD_init(void);void write_sfm(uchar,uchar);void setup_time();void setup_alarm();/******************** LCD PART *************************************/void LCD_delay(void){_nop_();_nop_();_nop_();}void delay_ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/********************************* *********************************/ uchar change_bcd(uchar a) //D0~D7转换程序{char temp,i;for(i=0;i<8;i++){temp<<=1;temp|=(a&0x01);a>>=1;}return(temp);}/********************************* *********************************/ void LCD_en_command(unsigned char command){command=change_bcd(command);command=_crol_(command,4);LCD1602_RS=0;LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(command & 0xf0);LCD1602_EN=1;LCD_delay();LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(command << 4) & 0xf0;LCD1602_EN=1;LCD_delay();LCD1602_EN=0;delay_ms(1);}void LCD_en_dat(unsigned char dat){dat=change_bcd(dat);dat=_crol_(dat,4);LCD1602_RS=1;LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(dat & 0xf0);LCD1602_EN=1;LCD_delay();LCD1602_EN=0;LCDIO&=0X0f;LCDIO|=(dat << 4) & 0xf0;LCD1602_EN=1;LCD_delay();LCD1602_EN=0;delay_ms(1);}/********************************************************************/ void LCD_set_xy( unsigned char x, unsigned char y ){unsigned char address;if (y ==0)address = 0x80 + x;elseaddress = 0xC0 + x;LCD_en_command(address);}/********************************************************************/ void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) {LCD_set_xy( X, Y ); //set addresswhile (*s) // write character{LCD_en_dat(*s);s ++;}}/********************************************************************/ void LCD_init(void){LCD1602_RW=0;LCD_en_command(0x01);delay_ms(5);LCD_en_command(0x01);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x28);delay_ms(5);LCD_en_command(0x0C);delay_ms(5);LCD_en_command(0x80);delay_ms(5);LCD_en_command(0x01);delay_ms(5);}/********************************************************************/void write_sfm(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;LCD_en_command(add);LCD_en_dat(shi+'0');LCD_en_dat(ge+'0');}/*****************************SET DAY & TIME***************************************/ void setup_time(){if(s1==0){delay_ms(5);if(s1==0){s1num++;TR0=0; //关定时器flag=1;flag1=1;flag3=1;flag4=1; //停止扫描DS12C887_read_time,setup_alarmwhile(!s1);if(s1num==1){LCD_en_command(0x82);LCD_en_command(0x0f);}}if(s1num==2){LCD_en_command(0x85);}if(s1num==3){LCD_en_command(0x88);}if(s1num==4){LCD_en_command(0x8b);}if(s1num==5){LCD_en_command(0xc0);}if(s1num==6){LCD_en_command(0xc3);}if(s1num==7){LCD_en_command(0xc6);}if(s1num==8){s1num=0;TR0=1; //开定时器flag1=0;flag3=0;flag4=0; //执行扫描setup_alarmsettime=1; //执行settimeLCD_en_command(0x0c);}}if(s1num!=0){/********************************************************************/ if(s2==0){delay_ms(2);if(s2==0){while(!s2);if(s1num==1){nian++;if(nian==100)miao=0;write_sfm(0x82,nian);LCD_en_command(0x82);}if(s1num==2){yue++;if(yue==13)yue=0;write_sfm(0x85,yue);LCD_en_command(0x85);}if(s1num==3){ri++;if(ri==32)ri=0;write_sfm(0x88,ri);LCD_en_command(0x88);}if(s1num==4){day++;if(day==8)day=1;write_sfm(0x8b,day);LCD_en_command(0x8b);}if(s1num==5){shi++;if(shi==24)shi=0;write_sfm(0xc0,shi);LCD_en_command(0xc0);}if(s1num==6){fen++;if(fen==60)fen=0;write_sfm(0xc3,fen);LCD_en_command(0xc3);}if(s1num==7){miao++;if(miao==60)miao=0;write_sfm(0xc6,miao);LCD_en_command(0xc6);}}}/********************************************************************/ if(s3==0){delay_ms(2);if(s3==0){while(!s3);if(s1num==1){nian--;if(nian==-1)nian=99;write_sfm(0x82,nian);LCD_en_command(0x82);}if(s1num==2){yue--;if(yue==0)yue=12;write_sfm(0x85,yue);LCD_en_command(0x85);}if(s1num==3){ri--;if(ri==0)ri=31;write_sfm(0x88,ri);LCD_en_command(0x88);}if(s1num==4){day--;if(day==0)day=7;write_sfm(0x8b,day);LCD_en_command(0x8b);}if(s1num==5){shi--;if(shi==-1)shi=23;write_sfm(0xc0,shi);LCD_en_command(0xc0);}if(s1num==6){fen--;if(fen==-1)fen=59;write_sfm(0xc3,fen);LCD_en_command(0xc3);}if(s1num==7){miao--;if(miao==-1)miao=59;write_sfm(0xc6,miao);LCD_en_command(0xc6);}}}/********************************************************************/ }}/********************************************************************//********************************************************************/void setup_alarm(){if(s4==0){delay_ms(5);if(s4==0){s1num++;TR0=0; //关定时器flag=1;flag2=1;flag3=1;flag4=1; //停止扫描DS12C887_read_time,setup_timewhile(!s4);if(s1num==1){LCD_en_command(0x01);LCD_write_string(0,0,"Start alarm at");write_sfm(0xcb,ashi);write_sfm(0xce,afen);LCD_write_string(0x0d,1,":");LCD_en_command(0xcb);LCD_en_command(0x0f);}}if(s1num==2){LCD_en_command(0xce);}if(s1num==3){LCD_en_command(0x01);LCD_write_string(0,0,"Stop alarm at");write_sfm(0xcb,sshi);write_sfm(0xce,sfen);LCD_write_string(0x0d,1,":");LCD_en_command(0xcb);LCD_en_command(0x0f);}if(s1num==4){LCD_en_command(0xce);}if(s1num==5){s1num=0;TR0=1; //开定时器flag2=0;flag3=0;flag4=0; //执行扫描setup_timesetalarm=1; //执行setalarmLCD_en_command(0x01); //清LCD屏幕LCD_write_string(0,0,"20 - -");LCD_write_string(2,1,": :");LCD_en_command(0x0c);}}if(s1num!=0){/********************************************************************/ if(s2==0){delay_ms(5);if(s2==0){while(!s2);if(s1num==1){ashi++;if(ashi==24)ashi=0;write_sfm(0xcb,ashi);LCD_en_command(0xcb);}if(s1num==2){afen++;if(afen==60)afen=0;write_sfm(0xce,afen);LCD_en_command(0xce);}if(s1num==3){sshi++;if(sshi==24)sshi=0;write_sfm(0xcb,sshi);LCD_en_command(0xcb);}if(s1num==4){sfen++;if(sfen==60)sfen=0;write_sfm(0xce,sfen);LCD_en_command(0xce);}}}/********************************************************************/ if(s3==0){delay_ms(5);if(s3==0){while(!s3);if(s1num==1){ashi--;if(ashi==-1)ashi=23;write_sfm(0xcb,ashi);LCD_en_command(0xcb);}if(s1num==2){afen--;if(afen==-1)afen=59;write_sfm(0xce,afen);LCD_en_command(0xce);}if(s1num==3){sshi--;if(sshi==-1)sshi=23;write_sfm(0xcb,sshi);LCD_en_command(0xcb);}if(s1num==4){sfen--;if(sfen==-1)sfen=59;write_sfm(0xce,sfen);LCD_en_command(0xce);}}}/********************************************************************/ }}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子设计竞赛报告题目:使用DS12C887时钟芯片设计高精度时钟学 部 信息科学与工程学部 专 业 电气一类 学 号 2009480102 姓 名 田海茂2011年3月12日装 订 线河北大学工商学院目录摘要 (3)一系统组成与功能说明 (3)二硬件电路设计与分析 (2)三程序流程说明 (3)四实物图 (6)附录1 (7)摘要本系统利用单片机(STC89C52)和DS12C887时钟芯片实现对时间的控制。

在1602液晶上显示年,月,日,星期,时,分,秒,并且按秒实时更新显示;具有闹铃报警功能;并可任意更改时间;采用个性化的液晶显示,当开始供电时以屏幕的平移为起始,时间信息从右往左平移至中央;利用DS12C887自身掉电可继续走时的特性,实现断电后时间不停,再次上电时时间仍准确显示在液晶上的功能。

以上各种功能依据一定的联系,组成一个比较完整的系统。

一系统组成与功能说明系统可划分为几个功能模块,如图1所示。

图1通过STC89C52单片机按键的扫描函数实现对更改时间功能的控制;在外部断电情况下DS12C887仍能继续走时,再次上电时将准确时间传给单片机,从而实现时间不停的功能;具有闹铃报警功能,通过蜂鸣器发出“滴滴”的闹铃声,当有任意键被按下时闹铃停止;采用个性化的液晶显示,当开始供电时以屏幕的平移为起始,时间信息从右往左平移至中央;每次按键均会发出“滴”的提示音;在1602液晶上显示年,月,日,星期,时,分,秒,并且按秒实时更新显示。

二硬件电路设计与分析硬件电路原理图如下所示最小系统图1602液晶与单片机连接图1.液晶1,2端为电源,15,16为背光电源,为防止直接加5V 电压烧坏背光灯,在15脚串联10欧电阻限流。

2.液晶3端为液晶对比度调节端,通过一个10K 欧电位器接地来调节液晶显示对比度。

DS12C887与单片机连接图1.IRQ 为DS12C887的中断申请端,必须和单片机的外部中断引脚相联。

注:P0同时与液晶和DS12C887相联,这样复用并不会发生冲突,因为单片机在操作液晶的时候是不会操作DS12C887的,它们都有各自的片选信号。

三 程序流程说明D0 D1 D2 D3 D4 D5 D6 D7图主程序流程图四实物图附件1#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit rs=P3^5;//液晶数据命令选择断sbit lcden=P3^4;//液晶使能端sbit s1=P3^6;//功能键sbit s2=P3^1;//增大键sbit s3=P3^2;//减小键sbit beep=P2^3;//蜂鸣器sbit dscs=P1^4;//芯片片选端sbit dsas=P1^5;//地址选通输入端sbit dsrw=P1^6;//写允许输入sbit dsds=P1^7;//读允许输入sbit dsirq=P3^3;//终端请求输出uchar count,s1num,flag;bit flag1;char miao,shi,fen,nian,yue,ri,week;uchar code table[]=" 20 - - ";//液晶固定显示uchar code table1[]=" : : ";uchar code table2[]=" Hello everyone!";uchar code table3[]="Nice to meet you!";void write_ds(uchar,uchar);void set_alarm(uchar,uchar,uchar);uchar read_ds(uchar);void set_time();uchar amiao,ashi,afen;void delay(uint z)//延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di()//按键时蜂鸣器发音{beep=0;delay(100);beep=1;}void didi() //闹钟时蜂鸣器发音{beep=0;delay(50);beep=1;delay(100);beep=0;delay(50);beep=1;}void write_com(uchar com)//写液晶命令函数{rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date)//写液晶具体数据函数{rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init()//程序初始化{uchar num;EA=1;//打开总中断EX1=1;//开外部中断1IT1=1;//设置负跳变沿触发方式lcden=0;week=1;// set_time();//给DS12C887设置时间函数set_alarm(2,2,10);//设置闹铃函数write_ds(0x0B,0x26);//设置DS12C887 24小时模式write_com(0x38);//1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);//定位数据指针第一行第一列for(num=0;num<16;num++)//写入液晶平移内容{write_date(table2[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<16;num++){write_date(table3[num]);delay(5);}write_com(0x80+0x10);//写入液晶固定内容for(num=0;num<16;num++){write_date(table[num]);delay(5);}write_com(0x80+0x50);for(num=0;num<16;num++){write_date(table1[num]);delay(5);}}void write_sfm(uchar add,uchar date)//在液晶上写入时分秒{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x50+add);write_date(0x30+shi);write_date(0x30+ge);}void write_sfm1(uchar add,uchar date)//在液晶上写入年月日{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x10+add);write_date(0x30+shi);write_date(0x30+ge);}void write_week(uchar we)//星期函数{write_com(0x80+0x10+13);switch(we){case 1:write_date('M');delay(5);write_date('O');delay(5);write_date('N');break;case 2:write_date('T');delay(5);write_date('U');delay(5);write_date('E');break;case 3:write_date('W');delay(5); write_date('E');delay(5); write_date('D');break;case 4:write_date('T');delay(5); write_date('H');delay(5); write_date('U');break;case 5:write_date('F');delay(5); write_date('R');delay(5); write_date('I');break;case 6:write_date('S');delay(5); write_date('A');delay(5); write_date('T');break;case 7:write_date('S');delay(5); write_date('U');delay(5);write_date('N');break;}}void keyscan(){if(flag1==1)//闹铃响{if(s2==0){delay(5);if(s2==0){while(!s2);di();flag1=0;//中断闹铃}}if(s3==0){delay(5);if(s3==0){while(!s3);di();flag1=0;//中断闹铃}}}if(s1==0){delay(5);if(s1==0){ s1num++;flag=1;flag1=0;while(!s1);di();if(s1num==1){write_com(0x0f);//光标停止位置不断闪烁}if(s1num==2){write_com(0x80+0x50+7);}if(s1num==3){write_com(0x80+0x50+4);}if(s1num==4){write_com(0x80+0x10+13);}if(s1num==5){write_com(0x80+0x10+10);}if(s1num==6){}if(s1num==7){write_com(0x80+0x10+4);}if(s1num==8){s1num=0;write_com(0x0c);//光标停止闪烁write_ds(0,miao);//将此时时间信息写入DS12C887write_ds(2,fen);write_ds(4,shi);write_ds(6,week);write_ds(7,ri);write_ds(8,yue);write_ds(9,nian);flag=0;}}}if(s1num!=0){if(s2==0){delay(1);if(s2==0){while(!s2);di();if(s1num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);//将变化后的时间写入液晶write_com(0x80+0x50+10);}if(s1num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x50+7); }if(s1num==3){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x50+4); }if(s1num==4){week++;if(week==8)week=1;write_week(week);write_com(0x80+0x10+13); }if(s1num==5)ri++;if(ri==32)ri=1;write_sfm1(10,ri);write_com(0x80+0x10+10); }if(s1num==6){yue++;if(yue==13)yue=1;write_sfm1(7,yue);write_com(0x80+0x10+7); }if(s1num==7){nian++;if(nian==100)nian=0;write_sfm1(4,nian);write_com(0x80+0x10+4);}}if(s3==0){delay(1);if(s3==0){while(!s3);di();if(s1num==1){miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x50+10);}if(s1num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x50+7); }if(s1num==3){shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x50+4); }if(s1num==4){week--;if(week==0)week=7;write_week(week);write_com(0x80+0x10+13); }if(s1num==5)ri--;if(ri==0)ri=31;write_sfm1(10,ri);write_com(0x80+0x10+10); }if(s1num==6){yue--;if(yue==0)yue=12;write_sfm1(7,yue);write_com(0x80+0x10+7); }if(s1num==7){nian--;if(nian==-1)yue=99;write_sfm1(4,nian);write_com(0x80+0x10+4);}}}}void write_ds(uchar add,uchar date)// DS12C887写入程序函数{dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add)//从DS12C887中读取数据{uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}void set_time()//设置时间{write_ds(4,1);//小时write_ds(2,2);//分钟write_ds(6,3);//星期write_ds(7,4);//日write_ds(8,5);//月write_ds(9,6);//年}void set_alarm(uchar ashi,uchar afen,uchar amiao)//设置闹铃{write_ds(1,amiao);write_ds(3,afen);write_ds(5,ashi);}void main(){uchar num,bo=0;init();delay(4000);for(num=0;num<16;num++){{write_com(0x18);//1602平移函数delay(600);}keyscan();//按键检测if(flag1==1)didi();if(flag==0){miao=read_ds(0);//平移时从时钟芯片中读取时间fen=read_ds(2);shi=read_ds(4);week=read_ds(6);ri=read_ds(7);yue=read_ds(8);nian=read_ds(9);write_sfm(10,miao);//平移时将读取的时间写到液晶write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_sfm1(10,ri);write_sfm1(7,yue);write_sfm1(4,nian);}}while(1){keyscan();if(flag1==1)didi();if(flag==0){miao=read_ds(0);//读取数据fen=read_ds(2);shi=read_ds(4);week=read_ds(6);ri=read_ds(7);yue=read_ds(8);nian=read_ds(9);write_sfm(10,miao);//写入数据write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_sfm1(10,ri);write_sfm1(7,yue);write_sfm1(4,nian);}}}void exter() interrupt 2{ uchar c;flag1=1;c=read_ds(0x0c);}。

相关文档
最新文档