一种新型的时钟日历芯片DS12C887

合集下载

DS12885、DS12887和DS12C887

DS12885、DS12887和DS12C887

DS12885、DS12887和DS12C887实时时钟(RTC)可用来直接替代DS1285和DS1287。

该器件提供一个实时时钟/日历、定时闹钟、三个可屏蔽中断(共用一个中断输出)、可编程方波输出和114字节的电池备份静态RAM (DS12C887和DS12C887A包含113字节RAM)。

DS12887在24引脚模块DIP封装内集成了晶体和锂电池。

DS12C887在地址32h内增加了世纪字节。

对于少于31天的月份,所有器件的日期能够在月末自动调整,带有闰年补偿。

该器件可配置为24小时或12小时格式,带AM/PM指示。

精确的温度补偿电路用于监视的V CC状态。

一旦检测到主电源失效,器件可自动切换到备用电源。

钮扣式锂电池可以连接到DS12885的V BAT输入引脚,在主电源掉电时保持有效的时间和日期。

该器件通过一个复用的、字节宽度接口访问,支持Intel和Motorola模式。

∙直接替代IBM AT计算机时钟/日历∙RTC计算秒、分、时、星期、日、月、年信息,具有润年补偿,有效期至2099年∙用二进制或BCD表示时间∙具有AM、PM标示的12小时模式或24小时模式∙夏时制选择∙可选择Intel或Motorola总线时序∙接口配合软件可寻址128 RAM∙14字节时钟与控制寄存器∙114字节通用、电池备份RAM (DS12C887和DS12C887A为113字节) ∙清除RAM功能(DS12885、DS12887A和DS12C887A)∙三路中断可分别通过软件屏蔽与检测∙闹钟可设置为每秒一次至每星期一次∙周期可设置在122µs至500ms∙时钟终止刷新周期标志∙可编程的方波输出信号∙自动电源失效检测和切换电路∙可选择28引脚PLCC表面贴装封装或32引脚TQFP封装(DS12885)∙可选则集成了晶体和电池的DIP模块(EDIP)封装(DS12887、DS12887A、DS12C887、DS12C887A)∙可选的工业级温度范围。

DS12C887时钟资料

DS12C887时钟资料

第31卷 第3期2010年7月内蒙古农业大学学报Journa l o f Inne r M ongo li a A gr icultural U niversityV o.l31 N o.3J u.l2010基于DS12C887的数字时钟的实现*张永安1, 王 睿2(1.内蒙古农业大学计算机与信息工程学院呼和浩特 010018;2.中国航天科工六院实业总公司动力供应公司,呼和浩特 010076)摘要: 本文介绍了实时时钟芯片DS12C887主要引脚、功能以及内部寄存器的编程方法。

同时给出了D S12C887与AT89C51单片机结合实现数字时钟的方法。

经实际电路调试验证,该芯片的掉电保护、编程灵活、工作稳定等功能得到充分体现。

关键词: 数字时钟; 单片机; D S12C887中图分类号: TP36 文献标识码: A 文章编号:1009-3575(2010)03-0263-04REAL I Z ATI O N of D I G I TAL CLOCK BASED on DS12C887Z HANG Y ong-an1, WABG Rui2(1.Co llege of Computer and Infor m ation E ngineer i ng,Inner M ongoli a Agr icultural Universit y,H uhhot0100182.Chi na A erospace Science and Industry corp the six t h A cade my,H uhho t010076,Chi na)Abstrac:t T his arti c le descr i bes pri m ary p i n,f uncti on and i nte rnal reg ister prog ra mm i ng m ethod of rea lti m e clock ch i p DS12C887.A t the sa m e ti m e,the arti c le introduces rea li zati on m ethod o f d i g ita l clock usi ng D S12C887and AT89C51s i ng lech i p.A fter debugged and ve rifi ed,t he chips'pow er-do w n protection,progra mm i ng flex i bility,j ob secu rity and other functi ons are f u lly realized.Key words: D ig ital c l o ck; s i ng le ch i p; 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调试
MOVX @DPTR,A
INC DPTR
MOV A,#8AH
MOVX @DPTR,A
C51程序:
#include <reg52.h>
#include <math.h>
#include <stdio.h>
#include <absacc.h>
#include <intrins.h>
实时时钟DS12C887调试首页 论坛 问答 博客 登录 注册
yanqin的空间 主页| 博客| 相册| 个人档案| | 开心网 人人网 新浪微博 EEPW微博 查看文章
标题:实时时钟DS12C887调试2009-04-17 11:21:47实时时钟DS12C887 调试
1. 实时时钟DS12C887 寄存器介绍:
MOV DPL,#00H
CLR A
MOVX @DPTR,A
;该程序为设置DS12C887的时间为05年02月24日15时04分00秒并分别把秒、分、时、日、月、年送到片内RAM的30H至35H处显示。
显示
ORG 0000H
SJMP MAIN
MOV A,#15H
MOVX @DPTR,A
MOV DPL,#07H
MOV A,#24H
MOVX A,@DPTR
JB ACC.7,WAIT
MOV DPL,#00H
MOV R0,#30H
上图为运行了上述程序后过10分钟后将LCALL INI指令屏蔽(即不再设置时间直接读取时间)后运行程序所得到的结果。可以看到片内RAM的30H至35H单元为27、15、15、24、02、05。这表示该时刻读出的时间为05年02月24日15时15分27秒。

时钟芯片DS12C887在电动汽车车载记录仪中的应用

时钟芯片DS12C887在电动汽车车载记录仪中的应用

时钟芯片DS12C887在电动汽车车载记录仪中的应用谢 辉,崔润龙(天津大学内燃机国家重点实验室,天津300072)摘要:为了满足电动汽车基于CAN总线的车载记录仪的需要,本文通过对复用总线时钟芯片DS12C887和非复用总线微处理器MC68376管脚功能及时序的分析,采用MC68376的高位地址线作为控制线,实现了二者之间的无缝连接,简化了硬件接口和软件编程。

本文还充分利用DS12C887片上112字节非掉电RAM,存储记录仪的相关使用信息,提高了记录仪操作的可靠性和方便性。

关键词:电动汽车;车载记录仪;实时时钟芯片中图分类号:U46317+7 文献标识码:B 文章编号:1001-3881(2005)12-143-3The Appli ca ti on of Rea l T i m e C lock Ch i p D S12C887i n I n-veh i cle Da t a Recorder ofElectr i ca l Veh i cleX I E Hui,CU I Run2l ong(The State Key Laborat ory f or Engines,Tianjin University,Tianjin300072,China) Abstract:I n order t o meet require ments of the in-vehicle data recorder of electrical vehicle based on CAN bus,the p ins’func2 ti ons and ti m e sequence of a real ti m e cl ock chi p,DS12C887,with multi p lex data/address bus and a m icr op r ocess or,MC68376, with de-multi p lex data/address bus were analyzed,and s ome address p ins of MC68376were connected t o contr ol p ins of DS12C887 t o realized sea m less connecti on bet w een the m,which si m p lifies the hard ware interface circuit and s oft w are p r ogra mm ing1The112bytes nonvolatile RAM were used t o st ore the management inf or mati on of the recorder t o i m p r ove the reliability and convenience1 Keywords:Electrical vehicle;I n-vehicle data recorder;Real ti m e cl ock chi p0 前言为了准确评价和优化电动汽车控制系统的性能,作者开发了一种基于CAN总线的车载记录仪,用于记录车辆道路运行过程中其CAN总线上的全部通信内容。

跨越2000年的时钟芯片DS12887_DS12C887

跨越2000年的时钟芯片DS12887_DS12C887

器件应用跨越2000年的时钟芯片DS12887/DS12C887长沙市无线电厂(长沙410014) 彭希南 摘 要 文章介绍了美国Dallas公司推出的跨越2000年的时钟芯片DS12887/DS12C887,介绍了芯片的主要特点、引脚功能、内部寄存器功能、中断处理和更新周期,以及编程方法。

关键词 时钟控制寄存器 时标寄存器 状态寄存器 更新周期 编程 随着2000年的即将来临,“千年虫”问题成为困扰当今世界的一大难题。

过去采用两位数表示年度的日历系统将要用四位数来表示,因此有关的计算机操作系统和应用软件都要作相应的修改。

据此,美国Dallas公司推出两款数字时钟芯片DS12887/ DS12C887,两款时钟芯片都将在1999年12月31日23时59分59秒时顺利地跳到2000年1月1日零时,并能实现2000年2月29日的闰年提示,是时钟芯片DS1287的增强型品种,结构上相当于MC146818B的改进型。

芯片都采用24引脚双列直插式封装,其引脚接口逻辑和内部操作方式与MC146818基本一致,所不同的是DS12887/ DS12C887芯片的晶体振荡器、振荡电路、充电电路和可充电锂电池等一起封装在芯片的上方,组成一个加厚的集成电路模块,因此,DS12887/DS12C887时钟芯片无需MC146818的电源电位检测端(PS),电路通电时其充电电路便自动对可充电电池充电,充足一次电可供芯片时钟运行半年之久,正常工作时可保证时钟数据十年内不会丢失。

此外,片内通用的RAM为MC146818的两倍以上。

DS12887/ DS12C887内部有专门的接口电路,从而使得外部电路的时序要求十分简单,使它与各种微处理器的接口大大简化。

使用时无需外围电路元件,只要选择引脚MO T电平,即可和不同计算机总线连接。

1 主要技术特点DS12887/DS12C887具有下列主要技术特点:(1)具有完备的时钟、闹钟及到2100年的日历功能,可选择12小时制或24小时制计时,有AM和PM、星期、夏令时间操作,闰年自动补偿等功能。

在智能化仪器仪表中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字节供用户存储需要掉电保持的信息和数据。

DS12C887时钟模块,STC89和STC12的代码实现

DS12C887时钟模块,STC89和STC12的代码实现

DS12C887时钟模块,STC89和STC12的代码实现DS12C887是时钟芯⽚DS12C885集成了电池和晶振的版本. 如果拆掉DS12C887的外壳, 能看到⾥⾯就是DS12C885.功能特性能输出世纪、年、⽉、⽇、时、分、秒等时间信息集成电池, 外部掉电时, 时间不会丢失.有12⼩时和24⼩时两种模式. 在12⼩时制模式中, ⽤AM和PM区分上午和下午时间的存储⽅式有两种: ⼀种⽤⼆进制数表⽰, 另⼀种是⽤BCD码表⽰带有128 byte RAM, 其中11 byte⽤来存储时间信息4 byte⽤来存储DS12C887的控制信息, 称为控制寄存器113 byte 通⽤RAM, 供⽤户使⽤.可以对DS12C887进⾏编程, 实现多种⽅波输出可对其内部的三路中断通过软件进⾏屏蔽芯⽚内部有⼀个精密的温度补偿电路⽤来监视Vee的状态, 如果检测到主电源故障, 该器件可以⾃动切换到备⽤电源供电VBAeKUP引脚⽤于⽀持可充电电池或超级电容, 内部包括⼀个始终有效的涓流充电器.可以通过⼀个读写复⽤的单字节并⾏接⼝访问, 该接⼝⽀持Intel和Motorola模式引脚功能GND、 VCCVCC接+5V输⼊, 当VCC输⼊为+5V时, ⽤户可以访问DS12C887内RAM中的数据, 并可对其进⾏读写操作. 当VCC的输⼊⼩于+4.25V时, 禁⽌⽤户对内部RAM进⾏读写操作, 此时⽤户不能正确获取芯⽚内的时间信息. 当VCC的输⼊⼩于+3V时, DS12C887会⾃动将电源发换到内部⾃带的锂电池上.MOT模式选择脚. DA12C887有两种⼯作模式: Motorola模式和Intel模式,MOT接VCC时是Motorola模式,MOT接GND或者浮空时, 是Intel模式. ⼀般使⽤Intel模式.SQW⽅波输出脚. 当供电电压VCC⼤于4.25V时, SQW脚可进⾏⽅波输出, 此时⽤户可以通过对控制寄存器编程来得到13种⽅波信号的输出AD0-AD7地址和数据复⽤的双向传输总线,地址信息出现在总线周期的前半部分,然后在AS的下降沿被锁存.写⼊数据在Motorola模式时在DS的下降沿被锁存, 在Intel模式时在R/W的上升沿被锁存在读周期, 输出的数据在DS(Motorola模式时为DS和R/W⾼电平, Intel模式时为DS低电平R/W⾼电平)的后沿在Motorola模式下DS变低电平, 或Intel模式下DS变⾼电平, 会结束读周期回到⾼阻态简化⼀下, 对于Intel模式地址信息在AS的下降沿被锁存.写⼊数据在R/W的上升沿被锁存在读周期, 输出的数据在DS低电平, R/W⾼电平的后沿DS变⾼电平, 会结束读周期回到⾼阻态ASAddress Strobe, 地址闸(选通输⼊)脚, 在进⾏读写操作时, AS的下降沿将AD0-AD7上出现的地址信息锁存到DS12C887上, ⽽下⼀个上升沿清除AD0-AD7上的地址信息, 不论⽚选CS是否有效, DS12C887都将执⾏该操作.Address Strobe Input. A positive-going address-strobe pulse serves to demultiplex the bus. The falling edge of AS causes the address to be latched within the device. The next rising edge that occurs on the AS bus clears the address regardless of whether CS is asserted. An address strobe must immediately precede each write or read access. If a write or read is performed with CS deasserted, another address strobe must be performed prior to a read or write access with CS asserted.DS/RDData Strobe or Read Input, 数据闸(选通)或读输⼊脚, 该引脚有两种⼯作模式MOT接VCC时, 为Motorola⼯作模式, 在这种⼯作模式中, 每个总线周期的后⼀部分的DS为⾼电平, 被称为数据选通, 在读操作中, DS的上升沿使DS12C887将内部数据送往总线AD0-AD7上, 以供外部读取, 在写操作中, DS的下降沿将使总线 AD0-AD7上的数据锁存在DS12C887中.MOT接地时, 为Intel模式, 这时DS脚的功能为输出使能(Output Enable)信号, 定义读取的周期R/W读/写输⼊端. 该管脚也有2种⼯作模式当MOT接VCC时, ⼯作在Motorola模式, 此时该引脚的作⽤是区分进⾏的是读操作还是写操作, 当R/W为⾼电平时为读操作, R/W 为低电平时为写操作.当MOT接GND时, ⼯作在Intle模式, 此时该引脚仅作为RAM上的⼀个"可写"信号, 作为写允许输⼊, 数据在信号上升沿被锁存. the R/W signal is an active-low signal. In this mode, the R/W pin operates in a similar fashion as the write-enable signal (WE) on generic RAMs. Data are latched on the rising edge of the signal.RESET低电平有效IRQ中断请求输出, 低电平有效. 当对应的中断开启且中断对应的bit有效时输出低电平. 读取C寄存器可以清除中断. IRQ脚是⼀个开漏输出, 需要外部的上拉电阻接⾄VCCActive-Low Interrupt Request Output. The IRQ pin is an active-low output of the device that can be used as an interrupt input to a processor. The IRQ output remains low as long as the status bit causing the interrupt is present and the corresponding interrupt-enable bit is set.The processor program normally reads the C register to clear the IRQ pin. The RESET pin also clears pendinginterrupts. When no interrupt conditions are present, the IRQ level is in the high-impedance state. Multiple interrupting devices can be connected to an IRQ bus, provided that they are all open drain. The IRQ pin is an open-drain output and requires an external pullup resistor to V CC.CS⽚选, 低电平有效, CS必须在以下状态中保持低电平:Motorola模式: DS和ASIntel模式: DS和RW⽚内数据的地址和范围控制地址0AH0BH0CH0DHRAM地址0EH - 31H33H - 7FH时钟数值地址 Binary Mode (DM = 1)00H: 低六位, 秒, [0, 3B]01H: 低六位, 秒, [0, 3B] 闹钟02H: 低六位, 分, [0, 3B]03H: 低六位, 分, [0, 3B] 闹钟04H: 低五位, 时, [0, 17] (24⼩时制)05H: 低五位, 时, [0, 17] (24⼩时制) 闹钟06H: 低⼆位, ⽇, [0, 07] 周中⽇07H: 低五位, ⽇, [0, 1F] ⽉中⽇08H: 低四位, ⽉, [0, 0C] ⽉09H: 低七位, 年, [0, 63] 00⾄99Binary模式下, 没有世纪信息时钟数值地址 BCD Mode (DM = 0)BCD模式下, 因为是⽤于直接显⽰, 因此在存储中, 每个值都根据实际的显⽰位数被拆成⼀⾄⼆个数字32H, 值[00, 99], BCD模式下有世纪信息STC89C52 驱动 DS12C877连接操作DS12C887时钟芯⽚共需要13条信号线, 分别是并⾏数据地址复⽤线ADO~AD7, CS, AS, R/W, DS 和 IRQ MOD接GNDRESET接VCCDS, AS, R/W, CS分别连接P1.0 - P1.4IRQ是DS12C887的中断请求, 需要连接STC89C52外部中断, 这⾥连接到P3.2左侧MOT => GNDAD0 => P0.0...AD7 => P0.7GND => GND右侧VCC => VCCSQWIRQ => P3.2RESET => VCCDS => P1.0RW => P1.1AS => P1.2CS => P1.4USB2TTL连线TX => P3.0RX => P3.1Keil 51 代码读取时间信息的测试代码#include <reg52.h>#include <stdio.h>typedef unsigned int u16;typedef unsigned char u8;u8 year, month, date, hour, minute, second, week_day;u8 alarm_hour, alarm_minute, alarm_second;u8 reg_a, reg_b, reg_c;void delay(u16 z) {u16 x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}sbit DS12_DS = P1^0;sbit DS12_RW = P1^1;sbit DS12_AS = P1^2;sbit DS12_CS = P1^4;sbit DS12_IRQ = P3^2;void DS12C887_write(u8 addr, u8 dat){delay(1);DS12_CS = 0; // ds12c887de 使能端 cs=0delay(1);DS12_AS=1;DS12_DS=1;DS12_RW=1;delay(1);P0 = addr;delay(1);DS12_AS=0;DS12_RW=0;P0 = dat;DS12_RW=1;DS12_AS=1;delay(1);DS12_CS = 1; // ds12c887de 使能端 cs=1delay(1);}u8 DS12C887_read(u8 addr){u8 ds_date;DS12_AS=1;DS12_DS=1;DS12_RW=1;delay(1);DS12_CS = 0;delay(1);P0 = addr;delay(1);DS12_AS=0;DS12_DS=0;P0 = 0XFF;ds_date=P0;DS12_DS=1;DS12_AS=1;DS12_CS = 1;return ds_date;}void DS12C887_init(){DS12C887_write(0x0b, 0x26);DS12C887_write(0x0a, 0x20);}void main(){P0 = 0x00; // P0⼝清零P1 = 0xff; // P1⼝全1DS12C887_init();//ds12c887 初始化EA =1; // 开启中断, 开启TIM1中断, 开启外部中断0IT0 =1;EX0 =1;// 初始化UARTTMOD = 0x20;SCON = 0x40;TH1 = 256 - 11.0592 * 1000 * 1000 / 12 / 32 / 9600 + 0.5;TCON |= 0x40;SCON |= 0x02;// 初始化UART结束/* 初始化写⼊DS12C887_write(9,11); // YearDS12C887_write(8,8); // MonthDS12C887_write(7,7); // DateDS12C887_write(6,7); // Week DayDS12C887_write(4,9); // HourDS12C887_write(2,27); // MinuteDS12C887_write(0,25); // Second*/while(1) {second = DS12C887_read(0x00);alarm_second = DS12C887_read(0x01);minute = DS12C887_read(0x02);alarm_minute = DS12C887_read(0x03);hour = DS12C887_read(0x04);alarm_hour = DS12C887_read(0x05);date = DS12C887_read(0x07);month = DS12C887_read(0x08);year = DS12C887_read(0x09);reg_a = DS12C887_read(0x0a);reg_b = DS12C887_read(0x0b);reg_c = DS12C887_read(0x0c);printf("%bX-%bX-%bX ", reg_a, reg_b, reg_c);printf("%bX-%bX-%bX ", year, month, date);printf("%bX:%bX:%bX\r\n", hour, minute, second);}}void exter() interrupt 0{// 这⾥处理中断}SDCC代码(基于HML_FwLib_STC89)下⾯的代码, 都是通过IRQ脚的中断来实现的, 启⽤中断后, DS12C887每秒都会将IRQ脚电压拉低, 此时0x0C的IRQF位会被置1, 如果不清除这个标志位, IRQ下次就不会被触发, 清除标志位根据⼿册Any time the IRQF bit is 1, the IRQ pin is driven low. This bit can be cleared by reading Register C or with a RESET.,读取寄存器0x0C使⽤RESET如果需要基于下⾯的代码做改动, 读取寄存器0x0C这⾏reg_c = DS12C887_read(0x0c);要留意不能随便删, 不然只显⽰⼀次就再没新数据了. #include "hml/hml.h"#define DS12_DS P1_0#define DS12_RW P1_1#define DS12_AS P1_2#define DS12_CS P1_4#define DS12_IRQ P3_2uint8_t reg_a, reg_b, reg_c;uint8_t year, month, date, week_day, hour, minute, second;uint8_t alarm_hour, alarm_minute, alarm_second;void DS12C887_write(uint8_t addr, uint8_t w_data){DS12_CS = 0;NOP();DS12_AS = 1;DS12_DS = 1;DS12_RW = 1;NOP();P0 = addr;NOP();DS12_AS = 0;DS12_RW = 0;P0 = w_data;DS12_RW = 1;DS12_AS = 1;NOP();DS12_CS = 1;}uint8_t DS12C887_read(uint8_t addr){uint8_t ds_date;DS12_AS = 1;DS12_DS = 1;DS12_RW = 1;DS12_CS = 0;P0 = addr;DS12_AS = 0;DS12_DS = 0;P0 = 0XFF;ds_date = P0;DS12_DS = 1;DS12_AS = 1;DS12_CS = 1;return ds_date;}void print_time(void){reg_a = DS12C887_read(0x0a);reg_b = DS12C887_read(0x0b);reg_c = DS12C887_read(0x0c);second = DS12C887_read(0x00);minute = DS12C887_read(0x02);hour = DS12C887_read(0x04);week_day = DS12C887_read(0x06);date = DS12C887_read(0x07);month = DS12C887_read(0x08);year = DS12C887_read(0x09);alarm_second = DS12C887_read(0x01);alarm_minute = DS12C887_read(0x03);alarm_hour = DS12C887_read(0x05);UART_sendHex(reg_a);UART_sendByte('-');UART_sendHex(reg_b);UART_sendByte('-');UART_sendHex(reg_c);UART_sendByte(' ');UART_sendHex(year);UART_sendByte('-');UART_sendHex(month);UART_sendByte('-');UART_sendHex(date);UART_sendByte(' ');UART_sendHex(hour);UART_sendByte(':');UART_sendHex(minute);UART_sendByte(':');UART_sendHex(second);UART_sendByte('\n');}void DS12C887_init(){// 0B: SET PIE AIE UIE SQWE DM 24/12 DSEDS12C887_write(0x0b, 0x36);// 0A: UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0DS12C887_write(0x0a, 0x20);alarm_second = DS12C887_read(0x01);alarm_minute = DS12C887_read(0x03);alarm_hour = DS12C887_read(0x05);}void sys_init(void){UART_configTypeDef uc;uc.baudrate = 115200;uc.baudGenerator = PERIPH_TIM_2;uc.interruptState = DISABLE;uc.interruptPriority = UTIL_interruptPriority_0;uc.mode = UART_mode_1;uc.multiBaudrate = DISABLE;uc.receiveState = ENABLE;UART_config(&uc);enableAllInterrupts();}void main(void){DS12C887_init();sys_init();EA = 1;IT0 = 1;EX0 = 1;/*DS12C887_write(0x00, 50); //secDS12C887_write(0x01, 0);DS12C887_write(0x02, 58); //minDS12C887_write(0x03, 0);DS12C887_write(0x04, 17); //hourDS12C887_write(0x05, 0);DS12C887_write(0x06, 4); //weekDS12C887_write(0x07, 21); //dayDS12C887_write(0x08, 8); //mothDS12C887_write(0x09, 14); //year*/while (1);}void Timer0IRQ(void) __interrupt (0){print_time();}观察时序这是⼿册上的时序说明(Intel mode, read)⽤逻辑分析仪进⾏观察, 采样率12MHz, 单次读取(AD0-AD3)⽤逻辑分析仪进⾏观察, 采样率12MHz, 单次读取(AD4-AD7)连续读取, 依次读取了0x0A, 0x0B, 0x0C, 0x00(AD0-AD3)连续读取, 依次读取了0x0A, 0x0B, 0x0C, 0x00(AD4-AD7)观察记录单次读取之间, 间隔27usCS下拉后2.16us, 往AD⼝输⼊地址DS下拉后, AD⼝的地址数据⽴即被清零DS下拉后2.16us, AD出现数据, 此时可以读出数据DS上拉后, AD数据⽴即上拉(全1)CS -> AS -> DS, 下拉和上拉之间的间隔都是1usSTC12操作DS12C887在STC12C5AxxS2系列上, 使⽤STC89的代码⽆法正常读取, 因为STC12的GPIO准双向模式较STC89加强了电流能⼒, 在DS12C887返回数据时, 有⼀定概率会被P0=0xFF;⼲扰. 解决的⽅案是在给完地址, DS下拉后, ⽴即将P0⼝的状态变为⾼阻态, 在读取完返回数据后, 再将P0⼝设置回准双向⼝. 代码如下, 根据DS12C887⼿册, ⼏个下拉时间点之间的间隔要求都是⼏⼗到⼀百个ns, 所以不需要延迟.void DS12C887_write(uint8_t addr, uint8_t w_data){DS12_CS = 0;DS12_AS = 1;DS12_DS = 1;DS12_RW = 1;P0 = addr;DS12_AS = 0;DS12_RW = 0;P0 = w_data;DS12_RW = 1;DS12_AS = 1;DS12_CS = 1;}uint8_t DS12C887_read(uint8_t addr){uint8_t ds_date;DS12_AS = 1;DS12_DS = 1;DS12_RW = 1;DS12_CS = 0;P0 = addr;DS12_AS = 0;DS12_DS = 0;/*** Set P0 to high impedance. This is the tricky part, if the mode remains quasi-bidirectional,* you need to set P0 = 0xFF in order to get output data, but this will also interfere with the output.* This is quite different from STC89.*/P0M0 = 0x00;P0M1 = 0xFF;ds_date = P0;DS12_DS = 1;DS12_AS = 1;DS12_CS = 1;/** Restore P0 to default quasi-bidirectional */P0M0 = 0xFF;P0M1 = 0x00;return ds_date;}参考STC12的代码例⼦c51的printf格式DS12C887拆解。

DS12C887中文资料

DS12C887中文资料

可作为IBM AT 计算机的时钟和日历与MC146818B和DS1287的管脚兼容在没有外部电源的情况下可工作10年自带晶体振荡器及电池可计算到2100年前的秒、分、小时、星期、日期、月、年七种日历信息并带闰年补偿用二进制码或BCD码代表日历和闹钟信息有12和24小时两种制式,12小时制时有AM和PM提示可选用夏令时模式可以应用于MOTOROLA和INTEL两种总线数据/地址总线复用内建128字节RAM– 14 字节时钟控制寄存器– 114 字节通用RAM可编程方波输出总线兼容中断( /IRQ )三种可编程中断–时间性中断可产生每秒一次直到每天一次中断–周期性中断122 ms 到500 ms–时钟更新结束中断管脚名称AD0–AD7 –地址/数据复用总线NC –空脚MOT –总线类型选择(MOTOROLA/INTEL)CS –片选AS – ALER/ W –在INTEL总线下作为/WRDS –在INTEL总线下作为/RDRESET –复位信号IRQ –中断请求输出SQW –方波输出VCC – +5 电源GND –电源地erwinrommel@图1为DS12887的结构框图上电/掉电当VCC高于4.25V 200ms后,芯片可以被外部程序操作;当VCC低于4.25V时,芯片处于写保护状态(所有的输入均无效),同时所有输出呈高阻状态;当VCC低于3V 时,芯片将自动把供电方式切换为由内部电池供电。

管脚功能MOT (总线模式选择)当此脚接到V CC 时,选用的是MOTOROLA总线时序;当它接到地或不接时,选用的是INTEL总线时序。

SQW (方波输出) –当VCC低于4.25V时没有作用。

周期性中断率和方波中断频率表 1AD0–AD7 (双向数据/地址复用总线)AS (地址锁存)–ALEDS (Data Strobe or Read Input)–RD当系统选择的是INTEL总线模式时,DS被称作RD。

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时钟芯片的电子万年历设计本文阐述了一种基于DS12C887时钟芯片的电子万年历软硬件设计方法,使用proteus软件设计和绘制了电子万年历的电路连接图,并通过1602液晶屏显示时钟信息,验证了电子万年历电路及其程序设计的正确性,并给出了部分C程序代码。

标签:DS12C887;时钟芯片;单片机在需要时间信息的电路设计中,设计人员通常采用时钟芯片获取时间信息。

目前,市场中的时钟芯片种类多样,比如DS12C887、PCF8485、SB2068、DS1302等。

其中DS12C887具有价格低、功耗小、易操作等优点,本文选用DS12C887作为设计电子万年历的时钟芯片。

一、电路连接电路原理图如图1所示,主要包括AT89C52单片机、DS12C887、1602液晶屏和3个独立按键等元器件,通过仿真,从图1中可以看到日历信息是2018年9月12日,星期三,17点16分3秒,说明本文设计的电子万年历软硬件设计正确,功能正常。

(一)DS12C887介绍及其与单片机的接口电路DS12C887是DALLAS公司推出的涓流充电时钟芯片,可计时到2100年前的年、月、日、时、分、秒、星期七种日历时间信息并自带闰年补偿功能;自带晶体振荡器并内置锂电池,在没有外部电源的情况下可工作长达10年之久;有12小时制和24小时制两种计时模式。

其中在12小时制模式中,用A.M.和RM.区分上午和下午;可选用夏令时模式;时间表示方法有兩种:一种用二进制数表示,一种用BCD码表示;内部带有128字节RAM,其中11字节用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,113字节RAM供用户使用;数据/地址总线复用,具有MOTOROLA和INTEL两种总线时序,本文在设计时采用的是INTEL总线。

下面阐述DS12C887的电路连接问题:DS12C887一共有24个管脚,其中6个管脚为NC(悬空管脚,不连接),有效管脚为18个。

时钟芯片ds12c887的程序

时钟芯片ds12c887的程序

日历时钟DS12887或146818的C语言源程序#include <reg52.h>#include <stdio.h>#include <absacc.h>#include <math.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#define uchar unsigned char#define uint unsigned int#define P128870 XBYTE[0xa000]#define P128871 XBYTE[0xa001]#define P128872 XBYTE[0xa002]#define P128873 XBYTE[0xa003]#define P128874 XBYTE[0xa004]#define P128875 XBYTE[0xa005]#define P128876 XBYTE[0xa006]#define P128877 XBYTE[0xa007]#define P128878 XBYTE[0xa008]#define P128879 XBYTE[0xa009]#define P12887a XBYTE[0xa00a]#define P12887b XBYTE[0xa00b]#define P12887c XBYTE[0xa00c]#define P12887d XBYTE[0xa00d]#define P12887e XBYTE[0xa00e]#define P12887f XBYTE[0xa00f]void setup12887(uchar *p);void read12887(uchar *p);void start12887(void);void setup12887(uchar *p) //设置系统时间{uchar i;i=P12887d;P12887a=0x70; P12887b=0xa2; P128870=*p++; P128871=0xff; P128872=*p++; P128873=0xff; P128874=*p++; P128875=0xff; P128876=*p++; P128877=*p++; P128878=*p++; P128879=*p++; P12887b=0x22; P12887a=0x20;i=P12887c;}void read12887(uchar *p) //读取系统时间{uchar a;do{ a=P12887a; } while((a&0x80)==0x80);*p++=P128870; *p++=P128872; *p++=P128874; *p++=P128876;*p++=P128877; *p++=P128878; *p++=P128879;}void start12887(void) //启动时钟{uchar i;i=P12887d;P12887a=0x70; P12887b=0xa2; P128871=0xff; P128873=0xff; P128875=0xff; P12887b=0x22; P12887a=0x20;i=P12887c;}/*************************************************************文件名称:ds12c887.c适用范围:时钟芯片ds12c887的驱动程序*************************************************************/#include <absacc.h>/* 命令常量定义 */#define CMD_START_DS12C887 0x20 /* 开启时钟芯片*/#define CMD_START_OSCILLATOR 0x70 /* 开启振荡器,处于抑制状态 */#define CMD_CLOSE_DS12C887 0x30 /* 关掉时钟芯片*//* 所有的置位使用或操作,清除使用与操作 */#define MASK_SETB_SET 0x80 /* 禁止刷新 */#define MASK_CLR_SET 0x7f /* 使能刷新 */#define MASK_SETB_DM 0x04 /* 使用HEX格式*/#define MASK_CLR_DM 0xfb /* 使用BCD码格式 */#define MASK_SETB_2412 0x02 /* 使用24小时模式 */#define MASK_CLR_2412 0xfd /* 使用12小时模式 */#define MASK_SETB_DSE 0x01 /* 使用夏令时 */#define MASK_CLR_DSE 0xfe /* 不使用夏令时*//* 寄存器地址通道定义 */xdata char chSecondsChannel _at_ 0xdf00;xdata char chMinutesChannel _at_ 0xdf02;xdata char chHoursChannel _at_ 0xdf04;xdata char chDofWChannel _at_ 0xdf06;xdata char chDateChannel _at_ 0xdf07;xdata char chMonthChannel _at_ 0xdf08;xdata char chYearChannel _at_ 0xdf09;xdata char chCenturyChannel _at_ 0xdf32;xdata char chRegA _at_ 0xdf0a;xdata char chRegB _at_ 0xdf0b;xdata char chRegC _at_ 0xdf0c;xdata char chRegD _at_ 0xdf0d;/* 函数声明部分 */void StartDs12c887(void);void CloseDs12c887(void);void InitDs12c887(void);unsigned char GetSeconds(void);unsigned char GetMinutes(void);unsigned char GetHours(void);unsigned char GetDate(void);unsigned char GetMonth(void);unsigned char GetYear(void);unsigned char GetCentury(void);void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char chHours);void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear);/*************************************************************函数功能:该函数用来启动时钟芯片工作应用范围:仅在时钟芯片首次使用时用到一次入口参数:出口参数:*************************************************************/void StartDs12c887(void){chRegA = CMD_START_DS12C887;}/*************************************************************函数功能:该函数用来关闭时钟芯片应用范围:一般用不到入口参数:出口参数:*************************************************************/void CloseDs12c887(void){chRegA = CMD_CLOSE_DS12C887;}void InitDs12c887(){StartDs12c887();chRegB = chRegB | MASK_SETB_SET; /* 禁止刷新 */chRegB = chRegB & MASK_CLR_DM | MASK_SETB_2412 \& MASK_CLR_DSE;/* 使用BCD码格式、24小时模式、不使用夏令时 */chCenturyChannel = 0x21; /* 设置为21世纪 */chRegB = chRegB & MASK_CLR_SET; /* 使能刷新 */}/************************************************************* 函数功能:该函数用来从时钟芯片读取秒字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetSeconds(void){return(chSecondsChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取分字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetMinutes(void){return(chMinutesChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取小时字节应用范围:出口参数:*************************************************************/ unsigned char GetHours(void){return(chHoursChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取日字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetDate(void){return(chDateChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取月字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetMonth(void){return(chMonthChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取年字节应用范围:入口参数:出口参数:*************************************************************/ unsigned char GetYear(void){return(chYearChannel);}/************************************************************* 函数功能:该函数用来从时钟芯片读取世纪字节应用范围:入口参数:*************************************************************/unsigned char GetCentury(void){return(chCenturyChannel);}/*************************************************************函数功能:该函数用来设置时钟芯片的时间应用范围:入口参数:chSeconds、chMinutes、chHours是设定时间的压缩BCD码出口参数:*************************************************************/void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char chHours){chRegB = chRegB | MASK_SETB_SET; /* 禁止刷新 */chSecondsChannel = chSeconds;chMinutesChannel = chMinutes;chHoursChannel = chHours;chRegB = chRegB & MASK_CLR_SET; /* 使能刷新 */}/*************************************************************函数功能:该函数用来设置时钟芯片的日期应用范围:入口参数:chDate、chMonth、chYear是设定日期的压缩BCD码出口参数:*************************************************************/void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear) {chRegB = chRegB | MASK_SETB_SET; /* 禁止刷新 */chDateChannel = chDate;chMonthChannel = chMonth;chYearChannel = chYear;chRegB = chRegB & MASK_CLR_SET; /* 使能刷新 */}。

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的高精度语音闹钟万年历

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

综上,我们选择方案二。

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

基于单片机的DS12C887的日历时钟显示系统设计论文

基于单片机的DS12C887的日历时钟显示系统设计论文

摘要在51单片机应用系统中,常常需要记录实时的时间信息并长期保存。

比如,在数据采集时,对某些重要的信息不仅需要记录其内容,还需要记录下该事件发生的准确时间;在银行营业大厅中使用的利率或汇率显示屏,上面除了需要显示利率或汇率等数据以外,还需要显示实时的时间信息,如年、月、日、星期、时间等。

本文用51单片机以及DS12C887日历时钟芯片实现日历时钟的设计。

论文研究了DS12C887日历时钟芯片的相关功能,两片MAX7219分别与单片机连接实现13位数码管显示以及整个实时日历时钟显示系统的硬件,软件设计。

设计结果表明本文设计的基于DS12C887的实时日历时钟显示系统完全能够满足设计要求。

关键词:DS12C887;51单片机;MAX7219;数码管显示Abstract51 SCM application systems, often need to record real-time information and long-term preservation. For example, when data collection for some important information not only need to record the content, but also record the exact time of the incident; the banking hall in the use of interest rate or exchange rate display, shown above in addition to the interest rate or exchange rate such data, it also needs to show real-time information, such as year, month, date, day and time. In this paper, 51 MCU and the calendar clock chip DS12C887 calendar clock design.Thesis of the calendar clock chip DS12C887-related functions, MAX7219 connected respectively to achieve 13-bit single chip digital display and the real time calendar clock display system hardware and software design.Design results show that the DS12C887-based design of real-time calendar clock display system can completely meet the design requirements.Key Words:DS12C887;51 Microcontroller;MAX7219;Digital display1 绪论本次设计的功能是在51单片机系统中设置、获取、记录实时的日历时钟信息并通过数码管显示,要求能够进行长时间的记录,并且存储的时间信息在掉电情况下至少保存10年以上。

DS12C887时钟芯片与1602液晶显示

DS12C887时钟芯片与1602液晶显示

时钟芯片DS12c887,自带锂电池的,1602液晶显示功能:闹钟设置,温度显示,星期显示为自定义字符#include <reg52.h>#include <define.h>#include <1602.h>#include <keyscan.h>#include <ds18b20.h>/*************向12c887写数据***************/ void write_ds(uchar add,uchar date){dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dscs=1;dsas=1;}/************向12c887读数据******************/ uchar read_ds(uchar add){uchar ds_date;dscs=0;dsas=1;dsrw=1;dsds=1;P0=add;dsas=0;dsds=0;P0=0xff; //读IO口时先给IO口送高电平ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}/*****************液晶初始化*******************/ void init(){char i,c;lcden=0;EA=1; //开启总中断EX0=1; //开启外部中断0IT0=1; //选择为跳变沿触发方式c=read_ds(0x0c);write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x0c); //设置开显示,不显示光标write_com(0x06); //写一个字符后指针地址加1write_com(0x01); //显示清0,数据指针清0// write_ds(0x0a,0x20); //开振荡器第一次使用DS12C887和在仿真中都必须打开// write_ds(0x0B,0x26); 允许更新、设置格式为二进制,时钟为24小时制、开启闹钟if(read_ds(0x0b)==0x26){write_com(0x80+0x0f);write_date(0x2a);}else{write_com(0x80+0x0f);write_date(' ');}lcdwrite_CGram();write_com(0x80);for(i=0;i<10;i++)write_date(rq[i]); //写“20 - - ”write_com(0x80+0x40);for(i=0;i<8;i++)write_date(sj[i]); //写“ ::”write_com(0x80+0x0b);write_date('W');write_date(0x7e); //写"W:"write_com(0x80+0x4c);write_date('.');write_com(0x80+0x4e);write_date(0x07); //写自定义字符温度符号write_date('C'); //写温度符号C}/*************读DS12C887总函数********************/void read_dstime(){miao=read_ds(0);write_sfm(6,miao);fen=read_ds(2);write_sfm(3,fen);shi=read_ds(4);write_sfm(0,shi);ri=read_ds(7);yue=read_ds(8);nian=read_ds(9);week=read_ds(6);write_xq(week);write_nyr(8,ri);write_nyr(5,yue);write_nyr(2,nian);}void didi(){beep=0;delay(100);beep=1;delay(100);}/************设置时间************void set_time(){write_ds(4,22);write_ds(2,58);write_ds(0,30);} */void main(){init();// set_time(); //初始化日期while(1){key_scan(); //按键扫描if(flag1==1) //闹钟标志位{read_dstime(); //读取时间didi();}if(flag==1) //选择按键按下就不读取温度、时间{read_dstime(); //读取时间display_ds18b20(get_tem()); //温度显示}}}/*********闹钟中断*********/void ex() interrupt 0{uchar c;flag1=1;c=read_ds(0x0c);}程序分成了几个模块,比较长。

DS12C887时钟芯片

DS12C887时钟芯片

DS12C887时钟芯片#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit beep=P2^3;sbit rs=P3^5;sbit lcden=P3^4;sbit rd=P3^7;sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit s1=P3^0; //功能键sbit s2=P3^1; //增大键sbit s3=P3^2; //减小键sbit s4=P3^6; //闹钟查看键sbit dula=P2^6;sbit wela=P2^7;sbit dsirp=P3^3;sbit gnd=P3^7;bit flag1,flag_ri;uchar count,s1num,flag,t0_num;char miao,shi,fen,day,month,year,week,amiao,afen,ashi;uchar table1[]={"20 - - "};uchar table2[]={" : : "};void write_ds(uchar,uchar);void set_alarm(uchar,uchar,uchar);void read_alarm();uchar read_ds(uchar);void set_time();void write_com(uchar);void write_date(uchar);void write_nyr(uchar,uchar);void write_sfm(uchar,uchar);void write_week(char);void delay(uint x) //延时函数(延时x ms,在晶振为12M的情况下){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void ring() //蜂鸣器鸣叫报警{beep=0;delay(100);beep=1;}void write_com(uchar com) //写液晶命令函数{rs=0;lcden=1;P0=com;delay(3);lcden=0;}void write_date(uchar date) //写液晶数据函数{rs=1;lcden=1;P0=date;delay(3);lcden=0;}void init() //初始化函数{uchar num;EA=1; //打开总中断EX1=1; //打开外部中断1IT1=1; //设置负跳变沿触发中断flag1=0; //变量初始化t0_num=0;s1num=0;week=1;dula=0; //关闭数码管wela=0;lcden=0;rd=0; //读信号输入,低电平有效write_ds(0x0A,0x20); //打开晶振且保持时钟运行write_ds(0x0B,0x26); //允许闹钟中断输出到IRQ,数据为二进制格式,24小时制模式set_time(); //设置上电默认时间//1602液晶初始化write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x0c); //设置开显示,关光标write_com(0x06); //写一个数据后地址指针加1write_com(0x01); //显示清0,数据指针清0write_com(0x80); //设置数据地址指针for(num=0;num<14;num++) //写入液晶固定部分显示{write_date(table1[num]);delay(5);}write_com(0x80+0x40); //设置第二行数据指针for(num=0;num<12;num++){write_date(table2[num]);delay(5);}}void write_sfm(uchar add,uchar date) //1602液晶刷新时分秒函数,第5格为时,8格为分,11格为秒{char shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add); //刷新地址指针write_date(0x30+shi); //0x30即十进制48,在ASCII码里指的是“0”write_date(0x30+ge);}void write_nyr(uchar add,uchar date) //1602液晶刷新年月日函数,第3格为年,6格为月,9格为日{char shi,ge;shi=date/10;ge=date%10;write_com(0x80+add); //刷新地址指针write_date(0x30+shi); //0x30即十进制48,在ASCII码里指的是“0”write_date(0x30+ge);}void write_week(char we) //写液晶星期显示函数{write_com(0x80+11); //第12格为星期switch(we){case 1:write_date('M'); //1为星期一,以下类推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('E');delay(5);write_date('H');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 keys() //键盘部分操作函数{if(flag_ri==1) //取消闹钟响铃{if((s1==0)||(s2==0)||(s3==0)||(s4==0)) //检测按键是否按下{delay(5); //去抖if((s1==0)||(s2==0)||(s3==0)||(s4==0)) //确实有任意一个按键按下{while(!(s1&&s2&&s3&&s4)) //按键被释放flag_ri=0; //闹铃停止}}}if(s1==0) //检测s1,s1为功能键{delay(5);if(s1==0){s1num++; //记录按下的次数if(flag==1)if(s1num==8)s1num=1;flag=1;while(!s1)ring();switch(s1num) //光标闪烁点定位{case 1:write_com(0x80+0x40+10); //s1按1下调整秒write_com(0x0f); //开显示,显示光标,光标闪烁break;case 2:write_com(0x80+0x40+7);break;case 3:write_com(0x80+0x40+4);break;case 4:write_com(0x80+11);break;case 5:write_com(0x80+8);break;case 6:write_com(0x80+5);break;case 7:write_com(0x80+2);break;case 8:s1num=0;write_com(0x0c); //控制字符flag=0;write_ds(0,miao);write_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) //s2为增大键{delay(5);if(s2==0){while(!s2);ring();switch(s1num) //根据功能键次数调节相应数值{case 1:miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);break;case 2:fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);break;case 3:shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);break;case 4:week++;if(week==8)week=1;write_week(week);write_com(0x80+11);break;case 5:day++;if(day==32)day=1;write_nyr(8,day);write_com(0x80+8);break;case 6:month++;if(month==13)month=1;write_nyr(5,month);write_com(0x80+5);break;case 7:year++;if(year==100)year=0;write_nyr(2,year);write_com(0x80+2);break;}}}if(s3==0) //s3为减小键{delay(5);if(s3==0){while(!s3);ring();switch(s1num) //根据功能键次数调节相应数值{case 1:miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);break;case 2:fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);break;case 3:shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);break;case 4:week--;if(week==0)week=7;write_week(week);write_com(0x80+10);break;case 5:day--;if(day==0)day=31;write_nyr(8,day);write_com(0x80+8);break;case 6:month--;if(month==0)month=12;write_nyr(5,month);write_com(0x80+5);break;case 7:year--;if(year==-1)year=99;write_nyr(2,year);write_com(0x80+2);break;}}}}if(s4==0) //s4为闹钟功能查看键{delay(5);if(s4==0){flag1=~flag1;while(!s4);ring();if(flag1==0) //退出闹钟时保存数值{flag=0;write_com(0x80+0x40);write_date(' ');write_date(' ');write_com(0x0c); //只开显示,不显示光标write_ds(1,miao);write_ds(3,fen);write_ds(5,shi);}else //进入闹钟设置{read_alarm(); //读取原始数据miao=amiao; //重新赋值用以按键调节fen=afen;shi=ashi;write_com(0x80+0x40);write_date('R'); //显示标志write_date('i');write_com(0x80+0x40+3);write_sfm(4,ashi);write_sfm(7,afen);write_sfm(10,amiao);}}}}void write_ds(uchar add,uchar date) //Intel模式下写DS12C887函数{dsas=1;dsds=1;dsrw=0;dscs=0;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add) //Intel模式下读DS12C887函数{uchar ds_data;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_data=P0;dsds=1;dsas=1;dscs=1;return ds_data;}void set_time() //首次操作DS12C887初始化{write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);}void read_alarm() //读取DS12C887闹钟值{amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5);}void main() //主函数{gnd=0;init(); //调用初始化函数while(1){keys(); //不停地进行按键扫描if(flag_ri==1) //当闹钟中断时执行{ring();delay(100);ring();delay(100);}if(flag==0&&flag1==0) //闹钟正常工作时执行{keys(); //不停地进行按键扫描year=read_ds(9); //读取DS12C887数据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(2,year);write_nyr(5,month);write_nyr(8,day);}}}void exter() interrupt 2 //外部中断1函数{uchar c;flag_ri=1;c=read_ds(0x0c);}不足的是不能实时更新。

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

一种新型的时钟日历芯片DS12C887
作者:重庆大学光电工程学院林国清李见为王崇文来源:《国外电子元器件》摘要:简要介绍了美国DALLAS 公司的新型时钟日历芯片DS12C887 的功能特性和内部控制寄存器参数,给出了DS12C887 与8031 单片机的电路连接图,同时给出了用C51 编写的初始化程序和获取内部时间的程序。

关键词:时钟单片机DS12C887
1 器件特性
DS12C887 实时时钟芯片功能丰富,可
以用来直接代替IBM PC 上的时钟日历芯片
DS12887,同时,它的管脚也和
MC146818B、DS12887 相兼容。

由于DS12C887 能够自动产生世纪、
年、月、日、时、分、秒等时间信息,其内
部又增加了世纪寄存器,从而利用硬件电路
解决子“千年”问题;DS12C887 中自带有锂电
池,外部掉电时,其内部时间信息还能够保
持10 年之久;对于一天内的时间记录,有
12 小时制和24 小时制两种模式。

在12 小时
制模式中,用AM和PM 区分上午和下午;
时间的表示方法也有两种,一种用二进制数
表示,一种是用BCD 码表示;DS12C887 中
带有128 字节RAM,其中有11 字节RAM
用来存储时间信息,4 字节RAM用来存储
DS12C887 的控制信息,称为控制寄存器,
113 字节通用RAM 使用户使用;此外用户还
可对DS12C887 进行编程以实现多种方波输
出,并可对其内部的三路中断通过软件进行
屏蔽。

2 引脚功能
DS12C887 的引脚排列如图1 所示,各管脚的功能说明如下:
GND、VCC:直流电源,其中VCC 接+5V 输入,GND 接地,当VCC 输入为+5V 时,用
户可以访问DS12C887 内RAM 中的数据,并可对其进行读、写操作;当VCC 的输入小于+4.25V 时,禁止用户对内部RAM 进行读、写操作,此时用户不能正确获取芯片内的时间信
息;当VCC 的输入小于+3V 时,DS12C887 会自动将电源发换到内部自带的锂电池上,以保证
内部的电路能够正常工作。

MOT:模式选择脚,DA12C887 有两种工作模式,即Motorola 模式和Intel 模式,当MOT 接VCC 时,选用的工作模式是Motorola 模式,当MOT 接GND 时,选用的是Intel 模式。


文主要讨论Intel 模式。

SQW:方波输出脚,当供电电压VCC 大于4.25V 时,SQW脚可进行方波输出,此时用
户可以通过对控制寄存器编程来得到13 种方波信号的输出。

AD0~AD7:复用地址数据总线,该总线采用时分复用技术,在总线周期的前半部分,出
现在AD0~AD7 上的是地址信息,可用以选通DS12C887 内的RAM,总线周期的后半部分出
现在AD0~AD7 上的数据信息。

AS:地址选通输入脚,在进行读写操作时,AS 的上升沿将AD0~AD7 上出现的地址信
息锁存到DS12C887 上,而下一个下降沿清除AD0~AD7 上的地址信息,不论是否有效,DS12C887 都将执行该操作。

DS/RD:数据选择或读输入脚,该引脚有两种工作模式,当MOT 接VCC 时,选用Motorola 工作模式,在这种工作模式中,每个总线周期的后一部分的DS 为高电平,被称为数
据选通。

在读操作中,DS 的上升沿使DS12C887 将内部数据送往总线AD0~AD7 上,以供外
部读取。

在写操作中,DS 的下降沿将使总线AD0~AD7 上的数据锁存在DS12C887 中;当
MOT 接GND 时,选用Intel 工作模式,在该模式中,该引脚是读允许输入脚,即Read Enable。

R/W:读/写输入端,该管脚也有2 种工作模式,当MOT 接VCC 时,R/W工作在Motorola 模式。

此时,该引脚的作用是区分进行的是读操作还是写操作,当R/W 为高电平时
为读操作,R/W为低电平时为写操作;当MOT 接GND 时,该脚工作在Intle 模式,此时该作
为写允许输入,即Write Enable。

CS:片选输入,低电平有效。

IRQ:中断请求输入,低电平有效,该脚有效对DS12C887 内的时钟、日历和RAM 中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的应用中,RESET 可以直接接VCC,这样可以保证DS12C887 在掉电时,其内部控制寄存器不受影响。

在DS12C887 内有11 字节RAM用来存储时间信息,4 字节用来存储控制信息,其具体垢地址及取值如表1 所列。

由表1 可以看出:DS12C887 内部有控制寄存器的A-B 等4 个控制寄存器,用户都可以在任何时候对其进行访问以对DS12C887 进行控制操作。

表1 DS12C887 的存储功能
取值范围
地址功能取值范围十进制数
二进制BCD码
0 秒0~59 00~3B 00~59
1 秒闹铃0~59 00~3B 00~59
2 分059 00~3B 00~59
3 分闹铃0~59 00~3B 00~59
12 小时模式0~12 01~0C AM,
81~8C PM
01~12AM,
4 81~92PM
24 小时模式0~23 00~17 00~23
时闹铃,12 小时制1~12 01~0C AM,
81~8C PM
01~12AM,
5 81~92PM
时闹铃,24 小时制0~23 00~17 00~23
6 星期几(星期天=1)1~
7 01~07 01~07
7 日1~31 01~1F 01~31
8 月1~12 01~0C 01~12
9 年0~99 00~63 00~99
10 控制寄存器A
11 控制寄存器B
12 控制寄存器C
13 控制寄存器D
50 世纪0~99 NA 19,20
3 应用
在各种设备、家电、仪器、工业控制系统中,可以很容易地用DS12C887 来组成时间获取单元,以实现各种时间的获取。

图2 是用8031 单片机和DS12C887 构成的时间获取电路图,
其中DS12C887 的基地址为7F00H,相应的程序采用C51 语言编写(以Intel 工作模式为例)。

由8031 单片机和DS12C887 构成的时间获取电路的初始化程序如下:
XBYTE[0x7F00+0x0B]=0x82; XBYTE[0x7F00+0x0A]=0xA0; XBYTE[0x7F00+0x0A]=0x20; XBYTE[0x7F00+0x0B]=0x02;
以下均获取时间程序:
unsigned char data t-century; unsigned char data t-year; unsigned char data t-month; unsigned char data t-date; unsigned char data t-week;
unsigned char data t-hour;
unsigned char data t-minute;
unsigned char data t-second;
if((XBYTE[7F00+0x0A]&0x80)!=0){
t-century=XBYTE[0x7F00+0x32];
t-year=XBYTE[Ox7F00+0x09];
t-month=XBYTE[Ox7F00+0x08];
t-date=XBYTE[Ox7F00+0x07];
t-week=XBYTE[Ox7F00+0x06];
t-hour=XBYTE[Ox7F00+0x04];
t-minute=XBYTE[DS12887+0x02];
t-second=XBYTE[Ox7F00+0x00];}
4 结束语
Dallas 公司的时钟日历芯片DS12C887 功能丰富,使用简单,可能性高,是时间产生电路的良好选择。

相关文档
最新文档