基于DS12C887的高精度时钟设计

合集下载

基于DS12C887时钟芯片的多功能万年历设计概要

基于DS12C887时钟芯片的多功能万年历设计概要

一、系统的结构和工作原理 1.系统结构此次课程设计的万年历,以AT89S52单片机为主控核心,由LCD 显示屏、DS12C887时钟芯片、温度传感器DS18B20、蜂鸣器、功能键盘、复位电路、晶振、电源模块等组成,系统结构框图如图1所示。

AT89S52单片机温度传感器DS18B20DS12C887时钟芯片LCD 显示屏(1602)蜂鸣器复位电路功能键盘电源模块图1 系统结构框图2.工作原理主控制器每隔一段时间(小于一秒钟)读一次时钟芯片的内部寄存器的值,将读出的时间、星期、温度等值实时显示在LCD 液晶屏上。

同时,主控制器不断的扫描按键电路和温度测量电路,当有按键按下时,识别出按键的值并调整相应的时间、星期值再写入时钟芯片内部。

温度数据由测量电路获得的环境温度值送人显示电路。

二、硬件设计1.主控核心—AT89S52单片机AT89S52是一个低功耗,高性能CMOS8位单片机,具有8K 在系统可编程Flash 存储器。

采用ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。

2.DS12C887时钟电路DS12C887与计算机常用的时钟芯片MC146818和DS12887管脚兼容,可直接替换。

采用DS12C887芯片设计的时钟电路无需任何外围电路和器件,并且有良好的微机接口。

DS12C887芯片内有微功耗,外围接口简单,精度高,工作稳定可靠等优点,广泛用于各种需要较高精度的实时时钟系统中。

DS12C887主要功能如下:(1)内含一个锂电池,断电后运行十年以上不丢失数据; (2)计秒、分、时、天、星期、日、月、年、并有闰年补偿功能;(3)二进制数码或BCD 码表示时间,日历和定闹;(4)12小时或24小时制,12小时时钟模式带有PM 和AM 指示,有夏令时功能; (5)Motorola 和Intel 总线时序选择;(6)有128个字节RAM 单元与软件接口,其中14个字节作为时钟和控制寄存器,114 字节为通用RAM ,所有RAM 单元数据都具有掉电保护功能; (7)可编程方波信号输出;(8)中断信号输出(IRQ )和总线兼容、定闹中断、周期性中断、时钟更新周期、结束 中断可分别由软件屏蔽,也可分别进行测试; DS12C887时钟芯片和单片机的硬件连接如下图2 :EA/VPP 31XTAL119XTAL218RESET 9P3.7/RD 17P3.6/WR 16P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN 29ALE/PROG 30P3.1/TXD 11P3.0/RXD 10VCC 40GND 20U1AT89S52VCC+C1210u FR910KS17Y112MHzC930p FC1030p FP00P01P02P03P04P05P06P07VCCP20P21P22P23P24P25P27P26P10P11P12P04P13P14P15P16P00P17P01P32P02P30P03P31P05P33P06P34P07P35P20P35WR P37P32P34242322212019181716151413121110987654321DS12C887CSASR/WNCDSRESETIRQNCNCNCSQWVCCGND AD7AD6AD5AD4AD3AD2AD1AD0NC MOT NC 123456789RP1RESPACKVCCU3P36P37图2 DS12C887与单片机的连接3.DS18B20温度传感器采用数字式温度传感器DS18B20,其仅需一条数据线进行数据传输,易于与单片机连接,可以去除A/D 模块,降低硬件成本,简化系统电路。

基于DS12C887的实时日历时钟的设计

基于DS12C887的实时日历时钟的设计

基于DS12C887的实时日历时钟的设计张媛;侯小虎【摘要】This system uses the microcontroller as the core controller ,digital clock ,read clock chip value ,and that the circuit to the microcontroller through the implementation of key signal ,the in-itial value assigned to the clock chip .Using STC89C52 microcontroller as a master clock module select-ed as a clock chip DS12C887 ,display module selectionLCD1602 .The design feature is the 51 SCM systemShezhi ,acquisition ,real-time recording ofcalendar clock informationand ,through digital con-trol ,use the calendar clock chip DS12C887 as a real-time clock chip ,the time for the system to pro-vide detailed information ,times the chip internal lithium battery ,can be the case with a power -down save more than 10 years .%本系统采用单片机作为数字钟的核心控制器,读取时钟芯片的值,并通过显示器显示出来,而且可以通过按键电路给单片机执行信号,给时钟芯片赋初值。

基于52单片机和DS12C887的高精度多功能电子钟

基于52单片机和DS12C887的高精度多功能电子钟

基于52单片机和DS12C887的高精度多功能电子钟摘要:本文分析了基于STC89C52以及DS12C887芯片进行电子钟设计的基本原理和硬软件设计方法,本设计可实现显示年、月、日、星期、时、分、秒等基本功能,并通过简易的按键操作可实现时制切换、到时闹铃以及秒表功能。

关键词:单片机;电子钟;秒表;DS12C8871 引言电子钟已成为人们日常生活中必不可少的物品,广泛用于个人家庭以及车站、码头、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。

随着技术的发展,人们已不再满足于钟表原先简单的报时功能,希望出现一些新的功能,诸如日历的显示、跑表功能、重要日期倒计时显示,气温监测等,以带来更大的方便,而所有这些,又都是以数字化的电子时钟为基础的。

因此,研究实用电子钟及其扩展应用,有着非常现实的意义,具有很大的实用价值。

2 系统方案设计2.1 主控单元方案选择STC89C52是一种低损耗、高性能、CMOS八位微处理器,片内有4k字节的在线可重复编程快擦快写程序存储器,能重复写入/擦除1000次。

它与MCS-51系列单片机在指令系统和引脚上完全兼容,不仅可完全代替MCS-51系列单片机,而且能使系统具有许多MCS-51系列产品没有的功能。

STC89C52可构成真正的单片机最小应用系统,缩小系统体积, 增加系统的可靠性,降低了系统成本。

因此,本设计主控芯片采用STC89C52。

2.2显示方案选择方案一:普通LED数码管显示。

最简单最容易操作的显示方法。

采用8段数码管既经济实惠,效果也比较好,但是本次设计需要的显示数据比较多,此时数码管显示就显得捉襟见肘了。

方案二:LCD1602液晶显示。

可以较为清晰的显示出字母和数字,显示效果出众,可以方便与单片机进行通信。

1602液晶提供了2行16列的显示范围,足够显示年月日星期以及时间了。

方案三:点阵式LCD12864显示,这种显示器操作最为复杂,指令繁多,但是显示效果最好,不仅可以显示数字,字母,还可以显示汉字,图形等。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

综上,我们选择方案二。

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

基于STC89C52和时钟芯片DS12887的多功能电子钟设计的说明书

基于STC89C52和时钟芯片DS12887的多功能电子钟设计的说明书

基于DS12C887的多功能电子钟设计的说明书摘要本系统名为基于DS12C887的多功能电子钟,以STC公司的STC89C5xRC 系列单片机作为主控芯片。

采用了实时时钟芯片DS12C887,走时精确,具有闹钟等多种功能。

采用128×64 LCD作为显示输出,可以同时显示时间、日期、室温、节日等内容,可视化的图形菜单便于操作。

同时采用了ISD4002语音芯片,实现了语音报时功能。

一、方案的设计与选择方案一:DS1302+数码管这届电子设计大赛其实在暑假前就已经开始,当时决定参赛的我在大赛的指定课题中选择了电子钟这个题目,并尝试制作。

我当时选择的方案就是DS1302+数码管。

在暑假中我完成了这个设计。

基于数码管+DS1302设计的多功能电子钟应该说这个方案在电子钟制作中应用最多。

DS1302的使用非常方便,而且价格也不贵。

而数码管显示的也很清楚,特别是显示时间时很直观。

但在制作过程中我发现了这个方案的一些问题。

DS1302是不自带电池,虽然可以通过外接纽扣电池来达到断电走时继续的目的,但在实际调试中会发现这是比较困难的。

因为DS1302上电需要复位,而复位就会把正确的走时清零。

如果不复位,DS1302会出现各种各样的问题,如不走时、读出乱码等。

要解决这个问题需要增加如2402等存储器,上电后先存储时间值,再复位。

这么做无疑增加了电路设计和软件设计的复杂度。

而使用数码管显示,虽然价格便宜,显示效果好,但多位的数码管在动态扫描的时候会出现闪烁。

如果少用几位,用切换的方法查看日期,温度等信息又显得麻烦。

方案二:DS12C887+液晶屏采用DS12C887作为实时时钟芯片,128×64 LCD作为显示输出。

DS12C887不仅自带锂电池而且内部带有晶振,无需外接,使用方便。

走时精度较高,带有自动闰年补偿功能。

128×64 LCD显示的信息量很大,可以同时显示时间、日期、室温、节日等信息,而且和单片机的接口简单。

基于51单片机的DS12C887时钟芯片的时钟电路设计

基于51单片机的DS12C887时钟芯片的时钟电路设计

摘要:本设计开发了一款具有日期、时间、星期和气温同步显示功能的电子时钟.工作原理是主控MCU读取实时时钟芯片DS12C887,获取时间信息,由全数字单总线结构温度传感器DS18B20读取温度信息,经MCU处理,送LCD显示,关键字:DS12C887 DS18B20 电子时前言随着科学技术的不断发展, 人们对时间计量的要求越来越高。

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

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

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

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

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

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

1. 课题分析随着电子技术的发展,电子技术为人们的生活带来了越来越大的方便.本课题旨在借助实时时钟芯片DS12C887和温度传感器DS18B20 和51单片机设计一个多功能的电子时钟.由于DS12C887芯片内附加锂电池,在上电情况下可以通过电源充电,断电后可以利用内部锂电池供电继续工作,在掉电重新上电后,不影响时间数据,不需重新对时,方便可靠.2. 方案论证方案一、利用单片机内部定时器产生秒信号,通过软件处理得到时间信息,送LCD显示.方案二、利用通用串行实时时钟芯片DS1302产生时间信息,利用MCU读取时间信息,送LCD 显示.方案三、通过实时时钟芯片DS12887,获取时间信息,经MCU处理,送LCD显示.方案一电路结构简单,可控性强,但断电后时间数据完全消失,再次上电后需重新设定,且由于电路本身缺陷和附加干扰较多,时间误差较大.方案二电路结构简单,时间精度较高,由于使用串行数据传输,节省MCU资源,但DS1302无内置电池,掉电后,数据丢失,重新上电后需对时.方案三采用实时时钟芯片DS12C887,其内部具有内置锂电池,在掉电的情况下可以正常工作10年以上,且带有非易失性RAM,可以保证在掉电的情况下,用户的定时信息不会丢失;带有温度补偿,保证时间数据的准确.经过综合考虑,我们认为方案三满足设计需求.2.2温度部分由于只是测量气温,用数字温度传感器单总线结构DS18B20即可满足要求,该器件采用单总线结构,且数字传输,可以与CPU直接接口,电路结构简便,可靠性好.2.3主控部分选用单片微控制器AT89C52作为主控.系统方案方框图如图2.1所示.图2.1 系统方案3.方案实现3.1 器件简介(1)AT89C52AT89C52是ATMEL公司生产的通用低功耗8位CMOS微控器,具有8051内核和8KB的可编程Flash程序存储空间以及256字节RAM.有32个通用IO口线和全双工串口,两个数据指针、两个16位可编程计数器/定时器、8个2级优先级中断源,具有片内时钟电路,通过简单的外接器件即可实现时钟电路.(2)DS12C887引脚结构及其功能如图3.1.图3.1 DS12C887引脚结构AD0-AD7:地址/数据总线NC :空脚MOT :总线模式选择CS :片选信号AS :地址锁存信号R/W :写信号(intel总线模式下)DS :读信号(intel总线模式下)RESET :复位信号IRQ : 中断请求输岀VCC :+5V电源GND :电源地DS12C887是美国DALLAS半导体公司生产的实时时钟芯片.采用24 引脚双列直插式的封装形式.芯片的晶体振荡器、振荡电路、充电电路和可充电锂电池等一起封装在芯片内部,组成一个加厚的集成电路模块.电路通电时,其内部充电电路便自动对其内部电池充电.可保证时钟数据10 年内不会丢失.DS12C887内部设有方便的接口电路,接口设计简便,使其与各种微处理器的接口大大简化.使用时无需外围电路元件,通过对MOT引脚的电平控制,可以实现与不同的计算机总线连接.DS12C887 能够自动存取并更新当前的时间,CPU 可通过读取DS12C887 的内部时标寄存器得到当前的时间和日历,也可通过选择二进制码或BCD 码初始化芯片的10 个时标寄存器.其中114 字节的非易失性静态RAM 可供用户使用,可以在控制器掉电的情况下,保存一些重要的数据.DS12C887 的4 个状态寄存器用来控制和指出DS12C887 模块当前的工作状态,除数据更新周期外,程序可随时读写这4 个寄存器.其内部结构如下图3.2.图3.2 DS12C887内部结构(3)DS18B20DS18B20是美国DALLAS半导体公司生产的可组网数字式温度传感器,在其内部使用了在板(ON-B0ARD)专利技术.全部传感元件及转换电路仅集成在形如三极管的一个集成电路内.DS18B20采用单总线接口方式,与微处理器连接时仅需要一条总线即可实现微处理器与DS18B20的双向通讯;支持多点组网功能,多个DS18B20可以并联在一条总线上,即可实现多点测温;在使用中不需要任何外围元件.测温范围为-55℃~+125℃,结果以9位数字量方式串行传送.DS18B20测温原理如图3.3所示.图3.3 DS18B20内部结构图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1.高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入.计数器1和温度寄存器被预置在-55℃所对应的一个基数值.计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1 ,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶体振荡器产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度.其内部带有非线性修正,确保温度数据的准确性.DS18B20的测温分辨率为0.5℃以9位数据格式表示,其中最低有效位(LSB)由比较器进行0.25℃比较,当计数器1中的余值转化成温度后低于0.25℃时,清除温度寄存器的最低位(LSB),当计数器1中的余值转化成温度后高于0.25℃,置位温度寄存器的最低位(LSB),DS18B20温度数据格式如表3.1所示.表3.1 DS18B20温度数据格式DS18B20采用12位二进制数据表示温度,分成两个字节,低字节低四位为小数位,低字节高四位和高字节低四位组成温度信息的8位整数位,其中第一位为符号位,为0表示温度为正值,为1表示温度为负值.当温度为负值时,数据采用补码存放.高字节高四位无效,与符号位保持一致.温度与数据对应关系如表3.2所示.表3.2 部分温度对应数据3.2硬件电路设计本课题涉及电路原理图和PCB图均由Altium Designer Summer 09绘制.(1)电源部分图3.7 整机电源电路由于电路微控器供电电压为5V,osyno6188供电电压为3V或4.5V,osyno6188对电源电压精度要求不高,决定整机采用5V电源供电,在电源处串联一只1N4003二极管,为osyno6188供电,1N4003为硅管,正向导通压降在0.7V左右,经过二极管后,得到约4.3V 电压,为osyno6188供电.电源电路为普通稳压电源电路,由于不是本项目主要方面,不再赘述.(2)AT89C52最小系统电路图3.8 AT89C52单片机最小系统电路由震荡电路,复位电路和单片机构成最小系统.震荡电路为单片机提供工作时钟,由石英晶体和补偿电容构成.由于语音部分需要1200bps波特率,石英晶体选取11.0592MHz,保证波特率零误差,补偿电容选取30pF瓷片电容.复位电路在上电时为单片机提供复位信号,由10uF电容和10K电阻构成的RC充电电路构成,当系统复位上电瞬间,电源通过电阻R为电容充电,在电阻上得到下降的指数充电电压,由高电平经过一段时间到达低电平,提供单片机需要的高脉冲复位信号.电源部分电容为去耦电容.EA拉高,MCU 上电后,从内部程序存储器开始执行.(3)osyno6188及外围电路设计.图3.9 osyno6188及外围电路系统采用4.5V电源供电模式,电源VDD由电源电路中VCC串接二极管后获得.电源电路、复位电路以及时钟电路参考osyno6188用户手册.RXD、TXD为串行总线接口,分别连接主控MCU的TXD、RXD端.(4)DS12C887与AT89C52接口电路设计.图3.10 DS12C887接口电路DS12C887的AD0-AD7为地址\数据复用总线,与控制器地址\数据总线(P0口)直接连接,R2为上拉电阻;MOT为总线模式选择引脚,接地选择INTEL总线连接方式;R/W在INTEL 总线模式下位写使能,接控制器读信号WR(P3.6)端;DS在INTEL总线模式下为读使能信号,接控制器读信号RD(P3.6)端;AS为地址锁存,接控制器地址锁存信号ALE(30脚)端;RST接电源拉高,片选CS直接接地使能。

用实时时钟芯片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的多功能时钟设计

中北大学大学生电子设计竞赛项目总结技术报告负责人:学号:学院、系:信息与通信工程学院专业:光电信息工程联系电话:E_m a i l: 1677882726@项目名称:基于DS12C887时钟芯片的多功能时钟设计指导教师:小组成员:赵策、高洁、黄康2013年 03 月 01 日目录一、设计背景 (3)二、主要研究内容 (3)三、总体思路与研究方案1、LCD1602模块 (4)2、DS18B20模块 (6)3、蜂鸣器 (9)4、独立键盘模块 (9)5、时钟芯片DS12C887模块 (15)四、主要研究成果 (17)五、存在问题即以后努力方向 (18)附件:设计原理图一、项目背景在本次全国大学生电子设计大赛人员选拨之际,我小组准备设计出一个多功能高精度时钟。

众所周知,电子时钟在日常生活中十分常见,本实验原利用单片机定时器中断系统来实现时钟设计,但考虑到走时不够精确,又不具有掉电保护功能,偶尔的掉电和晶振的误差都会造成时间的错乱,并且完全用程序计时也会占用大量的系统资源,影响其他系统的正常运行,与正常的时钟相比相去甚远,所以我们改用新的方案加以实现。

本方案采用时钟芯片DS12C887与单品机实验板相连,DS12C887芯片相比一些如DS1302等表贴式芯片体积较大,内部集成了可充电锂电池,同时内部还集成了32.768KHz 的标准晶振,一旦设定好时间,即使系统主电源掉电,该芯片仍然可以靠内部电源正常运行,当系统重新上电后,可继续给锂电池充电,这样可有效的保证了时间的延续性,并且精度高,运行稳定,使用方便,广泛应用于各种高精度的实时时钟系统中。

该芯片与晶振和电池集成在了一起,能自动产生世纪、年、月、日、时、分、秒等时间信息,少于31天的月份,月末日期自动调整,具有闰年补偿功能,有效期至2100年,对于一天的时间可有12小时制和24小时制两种模式,在12小时制中利用AM 和PM 来提示上午还是下午。

该时钟芯片内部有一个精密的温度补偿电路,用来监视Vcc 的状态,如果主电源有故障,会自动切换到备用电源。

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

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

摘要本系统利用单片机(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)我运用一款DS12C887芯片加上一个51单片机设计了一个综合时钟,此时钟的优点是具有单片机掉电情况下也能走,因为DS12C887芯片内置锂电池,可以自己走时间10年之久,单片机的作用只是读取DS12C887芯片里的寄存器内容。

(2)我又通过编程设计了一个单片机闹钟,并且还具有响铃功能,可以放出音乐。

(3)最后我又编了一个秒表,充分运用了单片机,做到功能最大化,但由于时间仓促秒表性能上做的不是很好。

硬件芯片介绍时钟DS12C887芯片其引脚分布如下MOT:接低电平,选择INTEL总线时序。

AD0~AD7:地址/地址数据复用总线脚。

DS:数据选择或读输入引脚。

该引脚有两种工作模式,选用Intel工作模式时,该引脚是读使能输入引脚,即Read Enable。

R/W:读/写输入引脚。

该引脚也有两种工作模式,选用Intel模式时,该引脚可作为写使能输入,即Write Enable。

IRQ:中断申请输出脚,低电平有效。

芯片有128字节寄存器,地址0x00~0x09共十个寄存器,分别存放秒,秒闹钟,分,分闹钟,时,时闹钟,星期,日,月,年。

LCD双行显示屏RW:显示的设置RS:光标设置EE:清屏设置高电平有效程序流程图主程序按键程序PROTUES电路图程序展示主函数:#include <reg51.h>#include <intrins.h>#include "char_lcd.h"#include "lcd_display.h"#include "key.h"uchar xdata *ds_addr=0x0000; void main(void){*(ds_addr+10)=0x20;*(ds_addr+11)=0x22;lcd_init();date_init();while(1){data_pro();data_hl();key();naozhong();naozhongon();watchon();}}LCD设置函数:#include <reg51.h>#include <intrins.h>#include "char_lcd.h"void lcd_init(){lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x01);}{bit busy;rs=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();busy=(bit)(P1&0x80);ep=0;return busy;}void lcd_wcmd(unsigned char cmd) {while(lcd_bz());rs=0;rw=0;ep=0;_nop_();_nop_();P1=cmd;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}// void lcd_pos(unsigned char pos) void lcd_pos(unsigned char pos) {lcd_wcmd(pos|0x80);}void lcd_wdat(unsigned char dat) {rs=1;rw=0;ep=0;_nop_();_nop_();ep=1;_nop_();_nop_();ep=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}void delay(uchar ms){uchar i;while(ms--){for(i=0; i<250; i++){_nop_();_nop_();_nop_();_nop_();}}}LCD设置函数头文件:#ifndef __char_lcd_h__#define __char_lcd_h__#define uchar unsigned char#define uint unsigned intsbit rs=P2^2;sbit rw=P2^1;sbit ep=P2^0;extern void lcd_init(void);extern bit lcd_bz(void);extern void lcd_wcmd(uchar cmd); extern void lcd_wdat(uchar dat); extern void lcd_pos(uchar pos); extern void delay(uchar ms);#endifLCD显示函数:#include <reg51.h>#include "lcd_display.h"#include "char_lcd.h"uchar code dis4[] = {"0123456789"};uchar code initdisp[] = {"Date:2000-00-00 Time:00:00:00"}; uchar code DT_lcdplace[] = {0x07,0x0a,0x0d,0x45,0x48,0x4b}; uchar code DTdata_addr[] = {9,8,7,4,2,0};uchar DTdata_tab[] = {0,0,0,0,0,0};uchar code chars[8][6] = {{"set "},{" "},{" year "},{" month"},{" day "},{" hour "},{"minute"},{"second"}}; uchar data_h,data_l;void data_wr(){uchar i;for(i=5; i>=0; i--){*(ds_addr+(DTdata_addr[i]))=DTdata_tab[i];}}void data_pro(){uchar i;for(i=0; i<6; i++){DTdata_tab[i]=*(ds_addr+DTdata_addr[i]);}data_hl();}void data_hl(){uchar i;for(i=0; i<6; i++){if(i==3){if((DTdata_tab[i]&0x80)!=0){DTdata_tab[i]=(DTdata_tab[i]&0x7f)&0x7f;if((DTdata_tab[i]&0x08)!=0)DTdata_tab[i]=DTdata_tab[i]+0x18;elseDTdata_tab[i]=DTdata_tab[i]+0x12;}}data_h=DTdata_tab[i]/16;data_l=DTdata_tab[i]%16;lcd_pos(DT_lcdplace[i]);lcd_wdat(data_h+48); //'0'=48lcd_wdat(data_l+48); //'0'=48}}void date_init(void) //diaplay date:{uchar i;lcd_pos(0x00);for(i=0; i<15; i++){lcd_wdat(initdisp[i]);}lcd_pos(0x40);for(i=16; i<29; i++){lcd_wdat(initdisp[i]);}}LCD显示函数头文件:#ifndef _lcd_display_h#define _lcd_display_h#define uchar unsigned char#define uint unsigned intextern uchar code dis4[];extern uchar code initdisp[];extern uchar code DT_place[];extern uchar code DT_lcdplace[];extern uchar code DTdata_addr[];extern uchar DTdata_tab[];extern uchar code chars[8][6];extern uchar data_h,data_l;extern uchar xdata *ds_addr;按键函数:#include <reg51.h>#include <intrins.h>#include "key.h"#include "char_lcd.h"#include "lcd_display.h"void key(void){uchar keyval=0;bit keyflag=0;if(keyset==0){delay(10);if(keyset==0){while(keyset==0);lcd_wcmd(0x0e);while(keyval!=6){lcd_pos(DT_lcdplace[keyval]);if(keyset==0){delay(10);if(keyset==0){keyval++;while(keyset==0);}}if(keyadd==0){delay(10);if(keyadd==0){keyflag=1;DTdata_tab[keyval]++;if((DTdata_tab[keyval]&0x0f)==0x0a){DTdata_tab[keyval]=DTdata_tab[keyval]+6;}while(keyadd==0);}}if(keysub==0){delay(10);if(keysub==0){keyflag=1;DTdata_tab[keyval]--;if((DTdata_tab[keyval]&0x0f)==0x0f){DTdata_tab[keyval]=DTdata_tab[keyval]-6;}while(keysub==0);}}if(keyflag==1){keyflag=0;datapro();*(ds_addr+0)=DTdata_tab[5]; //write modified data*(ds_addr+2)=DTdata_tab[4];*(ds_addr+4)=DTdata_tab[3];*(ds_addr+7)=DTdata_tab[2];*(ds_addr+8)=DTdata_tab[1];*(ds_addr+9)=DTdata_tab[0];data_hl();}}lcd_wcmd(0x0c);}}}void datapro(void) //modify year¡¢month¡¢day¡¢hour¡¢minute¡¢second data {if(DTdata_tab[5]==0x60) //modify second data{DTdata_tab[5]=0x00;}if(DTdata_tab[5]==0xf9){DTdata_tab[5]=0x59;}if(DTdata_tab[4]==0x60) //modify minute data{DTdata_tab[4]=0x00;}if(DTdata_tab[4]==0xf9){DTdata_tab[4]=0x59;}if(DTdata_tab[3]==0x12) //modify hour data{DTdata_tab[3]=0x80;}if(DTdata_tab[3]==0xf9){DTdata_tab[3]=0x91;}if(DTdata_tab[3]==0x24) //modify hour data{DTdata_tab[3]=0x00;}if(DTdata_tab[3]==0x23) //modify hour data{DTdata_tab[3]=0x91;}if(DTdata_tab[3]==0x22) //modify hour data {DTdata_tab[3]=0x90;}if(DTdata_tab[3]==0x21) //modify hour data {DTdata_tab[3]=0x89;}if(DTdata_tab[3]==0x20) //modify hour data {DTdata_tab[3]=0x88;}if(DTdata_tab[3]==0x19) //modify hour data {DTdata_tab[3]=0x87;}if(DTdata_tab[3]==0x18) //modify hour data {DTdata_tab[3]=0x86;}if(DTdata_tab[3]==0x17) //modify hour data {DTdata_tab[3]=0x85;}if(DTdata_tab[3]==0x16) //modify hour data {DTdata_tab[3]=0x84;}if(DTdata_tab[3]==0x15) //modify hour data {DTdata_tab[3]=0x83;}if(DTdata_tab[3]==0x14) //modify hour data {DTdata_tab[3]=0x82;}if(DTdata_tab[3]==0x13) //modify hour data {DTdata_tab[3]=0x81;}if(DTdata_tab[2]==0x32) //modify day data{DTdata_tab[2]=0x01;}if(DTdata_tab[2]==0x00){DTdata_tab[2]=0x31;}if(DTdata_tab[1]==0x13) //modify month data {DTdata_tab[1]=0x01;}if(DTdata_tab[1]==0x00){DTdata_tab[1]=0x12;}if(DTdata_tab[0]==0xa0) //modify year data{DTdata_tab[0]=0x00;}if(DTdata_tab[0]==0xf9){DTdata_tab[0]=0x99;}}void naozhong(void){uchar keyval=3;bit keyflag=0;if(keyalarm==0){delay(10);if(keyalarm==0){while(keyalarm==0);lcd_wcmd(0x0e);while(keyval!=6){lcd_pos(DT_lcdplace[keyval]);if(keyalarm==0){delay(10);if(keyalarm==0){keyval++;while(keyalarm==0);}}if(keyadd==0){delay(10);if(keyadd==0){keyflag=1;DTdata_tab[keyval]++;if((DTdata_tab[keyval]&0x0f)==0x0a){DTdata_tab[keyval]=DTdata_tab[keyval]+6;}while(keyadd==0);}}if(keysub==0){delay(10);if(keysub==0){keyflag=1;DTdata_tab[keyval]--;if((DTdata_tab[keyval]&0x0f)==0x0f){DTdata_tab[keyval]=DTdata_tab[keyval]-6;}while(keysub==0);}}if(keyflag==1){keyflag=0;datapro();*(ds_addr+1)=DTdata_tab[5]; //write modified data*(ds_addr+3)=DTdata_tab[4];*(ds_addr+5)=DTdata_tab[3];data_hl();}}lcd_wcmd(0x0c);}}}void naozhongon(void){if(keyon==1){delay(10);if(keyon==1){stop();}}if(keyon==0){delay(10);if(keyon==0){music();}}}unsigned int number;#define l_dao 262#define l_re 286#define l_mi 311#define l_fa 349#define l_sao 392#define l_la 440#define l_xi 494#define dao 523#define re 587#define mi 659#define fa 698#define sao 784#define la 880#define xi 987#define h_dao 1046#define h_re 1174#define h_mi 1318#define h_fa 1396#define h_sao 1567#define h_la 1760#define h_xi 1975void delay1(void){unsigned char i,j;for(i = 0;i < 250;i++){for(j = 0;j < 250;j++);}}//void music(void){unsigned char i,j;unsigned int code music[]={re,mi,re,dao,l_la,dao,l_la,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,sao,la,mi,sao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,l_la,dao,l_la,l_sao,l_re,l_mi, l_sao,re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,re,l_la,dao,re,l_la,dao,re,mi,re,0xff};unsigned char code musicJP[ ]={4,1,1,4,1,1,2,2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4,2,2,2,2,2,2,2, 10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10};EA = 1;ET0 = 1;TMOD = 0x00;i = 0;while(music[i]!=0xff){number = 460830 / music[i];TH0 = (8192-number) / 32;TL0 = (8192-number) % 32;TR0 = 1;for(j = 0;j < musicJP[i];j++)delay1();TR0 = 0;i++;if(keyoff==0){delay(10);if(keyoff==0){*(ds_addr+12)=0x00;break;while(keyoff==0);}}data_pro();data_hl();}}void Time0(void ) interrupt 1 using 1{sound=!sound;TH0=(8192-number)/32;TL0=(8192-number)%32;}void stop(void){sound=0;}按键函数头文件:#ifndef __key_h__#define __key_h__#define uchar unsigned char#define uint unsigned intsbit keyset=P3^2;sbit keyadd=P3^1;sbit keysub=P3^0;sbit keyalarm=P3^3;sbit keyoff=P3^5;sbit keyon=P2^6;sbit sound=P3^4;extern uchar code dis4[];extern uchar code initdisp[];extern uchar code DT_place[];extern uchar code DT_lcdplace[];extern uchar code DTdata_addr[];extern uchar DTdata_tab[];extern uchar xdata *ds_addr;extern void datapro(void);extern void key(void);extern void naozhong(void);extern void naozhongon(void);extern void music(void);extern void stop(void);extern void watch(void) ;extern void settime(void) ;extern void watchon(void);#endif秒表程序:#include <reg51.h>#include <intrins.h>#include "char_lcd.h"#include "lcd_display.h"#include "watch.h"uchar code table0[]={0x07,0x0a,0x0d,0x45,0x48,0x4b};uchar code table1[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99}; unsigned int second10,second1,second2;bit bdata flag;void watchon(void){if(sta_star==0){delay(10);if(sta_star==0){watch();}}}void delay2(){unsigned char i,j;for(i=45;i>0;i--)for(j=200;j>0;j--);}void settime(){second10++;if(second10==10){second10=0;second1++;if(second1==10){second1=0;second2++;if(second2==6)second2=0;}}}void dispact(){uchar data_h,data_l,data_s,data_0;data_0=0x00/16;data_s=table1[second10]/16;data_h=table1[second2]%16;data_l=table1[second1]/16;lcd_pos(table0[4]);lcd_wdat(data_h+48);delay2();lcd_wdat(data_l+48);lcd_pos(table0[5]);delay2();lcd_wdat(data_s+48);lcd_wdat(data_0+48);lcd_pos(table0[3]);lcd_wdat(data_0+48);lcd_wdat(data_0+48);}Time1 () interrupt 3{TH1=(65535-53172)/256;TL1=(65535-53172)%256;if(flag)settime();dispact();}void watch(void){TH1=(65535-53172)/256; TL1=(65535-53172)%256; flag=0;EA=1;TR1=1;ET1=1;do{if(!sta_end){if(flag==0)flag=1;else flag=0;}if(!reset){flag=0;second10=0;second1=0;second2=0;EA=0;TR1=0;ET1=0;break;}}while(1);}秒表程序头文件:#ifndef __watch_h__#define __watch_h__#define uchar unsigned char #define uint unsigned int sbit sta_end=P2^4;sbit reset=P2^5;sbit sta_star=P2^3;extern uchar code table0[];extern void watch(void) ; #endif。

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寄存器表示响应中断}下面是管脚和时序图寄存器的定义如下我爱帮帮,啵!嘻嘻。

基于DS12C887的单片机实时时钟设计

基于DS12C887的单片机实时时钟设计
17 DS/RD:数据选择或读输入脚,该引脚有两种工作模式,当MOT接VCC 时,选用Motorola工作模式,在这种工作模式中,每个总线周期的后一部分的DS为高电平,被称为数据选通,在读操作中,DS的上升沿使DS12C887将内部数据送往总线AD0~AD7上,以供外部读取,在写操作中,DS的下降沿将使总线AD0~AD7上的数据锁 存在DS12C887中;当MOT接GND时,选用Intel工作模式,在该模式中,该引脚是读允许输入脚,即Read Enable。
13 C——S—— :片选输入,低电平有效。
19 I——R——Q——:中断请求输入,低电平有效,该脚有效对DS12C887内的时钟、日历和RAM中的内容没有任何影响,仅对内部的控制寄存器有影响,在典型的应用中,RESET可以直接接VCC,这样可以保证DS12C887在掉电时,其内部控制寄存器不受影响。
18 RESET(复位输出):当该脚保持低电平时间大于200ms,保证DS12887有效复位。
4.实时时钟设计
本系统由硬件和软件两部分组成:
(1)硬件电路
图4-1硬件连接图
本系统采用的单片机是AT89S52单片机,它是一种带8K字节内嵌可编程闪存的低功耗高性能的八位微控制器,具有看门狗定时器、双数据指针、3个16位定时计数器、6个两级中断源结构以及掉电模式下的自动保存功能,而且价格便宜。显示模块用1602LCD,通过它实时显示DS12C887内部时间,DS12C887与单片机的典型连接如图2所示,DS12887的ADO~AD7引脚分别与AT89S52单片机的AD0~AD7相连, DS12887采用地址总线与数据总线复用方式,LCD1602接AT89S52单片机的DB0~DB7;MOT引脚接地,即DS12887选择INTEL时序。DS12887的片选引脚CS单片机AT89S52的12脚,DS1288的I——R——Q—— 引脚连于AT89S52的外部中断INT0即33引脚上,所以我们可通过编程利用中断源向CPU申请中断,每当符合中源中断条件时,I——R——Q—— 输出低电平,引起AT89S52的INTO中断。如果我们设置好内部闹钟寄存器的初值,则当当前时间与我们设置的闹铃时间匹配时,中断申请标志位IRQF置为1,由I——R——Q——向AT89S52提出中断,系统响应中断,以达到闹钟定时的目的。

单片机DS12C887时钟设计

单片机DS12C887时钟设计

目录摘要 (2)1 系统总体设计 (2)1.1 系统设计的主要内容和具体要求 (2)1.1.1主要内容: (2)1.1.2 具体技术要求: (2)1.2 方案论证 (2)2 系统硬件电路设计 (3)2.1单片机控制系统包括STC89C52单片机以及它的外围电路(晶振电路和复位电路)。

(3)2.1.1晶振电路 (4)2.1.2 复位电路 (4)2.2 DS12C887时钟电路 (5)2.2.1 器件介绍 (5)2.2.2 DS12C887与单片机的连接 (6)2.3 1602液晶显示屏 (6)2.4 USB供电电路 (7)2.5 键盘电路 (8)2.6闹铃电路 (9)3 系统软件程序设计 (9)3.1 主程序运行说明及流程图 (9)3.2 DS12C887使用说明及流程图 (11)3.3 1602操作说明及流程图 (11)3.4 键盘控制说明及流程图 (12)4 系统调试 (13)5 结论 (14)6 谢辞 (14)7 参考文献 (15)8 附录A:实时日历电子钟设计电路原理图 (15)9 附录B:实时日历电子钟设计程序代码 (15)摘要在日新月异的21世纪里,家用电子产品得到了迅速发展。

许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。

单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和玩具等。

本文设计的电子万年历属于小型智能家用电子产品。

利用单片机进行控制,实时时钟芯片DS12C887时钟芯片进行记时及掉电存储,外加键盘电路和显示电路,可实现时间的调整和显示。

电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。

因而,此设计具有相当重要的现实意义和实用价值。

关键词:单片机;DS12C887;智能1 系统总体设计1.1 系统设计的主要内容和具体要求1.1.1主要内容:本次设计的题目是基于ds12c887的高精度时钟的设计,可以正常的显示年、月、日、星期、时、分、秒。

基于单片机的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年以上。

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

基于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指令系统。

AT89C52单片机的定时/计数器既有定时器功能又有计数器功能,通过设置相关的特殊功能寄存器可以选择启动定时器功能或者计数器功能。

定时器系统在51系列单片机中是独立的硬件部分,它通过单片机内部控制线与晶振和CPU连接相互作用。

定时器在CPU设置开启定时功能后,在晶振的作用下开始自动计时,计数器计满后产生中断后,通知CPU处理中断。

AT89C52单片机内有一个由高增益放大器构成的振荡器,可以由内部产生时钟或外部输入时钟,RXD和TXD引脚为放大器的输入和输出端。

RXD和TXD引脚外接晶体振荡器时,单片机内部振荡器会产生自激振荡。

本系统选用晶振频率为11.0592MHz。

3DS12C887时钟芯片
5软件设计
本系统软件用C语言实现。

C语言具有结构简单、灵活方便,运算符和数据类型丰富,表达方式灵活,可移植性好等优点。

C程序由一组变量或函数的外部对象组成。

变量和函数提供了编制程序的手段,使C语言更容易读、写、修改和维护。

程序中函数的数目是不限的,但主函数只能有一个。

C语言可以建立库函数,每一个函数都能完成一定功能,用户可以随意调用。

C语言源程序由一个或多个源文件组成,每个源文件由一个或多个函数组成。

源程序中可以有预处理命令,通常放在源程序的最前面。

6结语
使用DS12C887时钟芯片的系统电路简单,应用灵活,外接元器件较少,工作时间长,电路连接方便,稳定可靠且价格低廉。

其内部具有充电锂电池,可在掉电后时钟继续运行,保证时间数据不丢失。

其内置的晶振可以使时间精确,误差极低。

本设计所用的1602液晶显示,相比以往数码管省去了大量不必要的电路,使设计更加简单、容易实现。

参考文献:
[1]薛峰,朱晓骏.单片机原理及应用[M].北京:北京理工大学出版社,2011.
[2]郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2012.
[3]胡锦,蔡谷明,梁先宇.单片机技术使用教程[M].北京:高等教育出版社,2003.
[4]刘建英,基于单片机时钟设计[J].内蒙古石油化工,2005(1).
[5]袁鹏,陈淑芳.实时时钟芯片DS12C887与51单片机的接口技术[J].科技信息,2011(29).
[6]刘伟强,张振东,张朋等.新型时钟日历芯片DS12C887的应用设计[J].电子元器件应用,2010(12).。

相关文档
最新文档