PCF8563实时时钟高精度调整方法

合集下载

PCF8563C语言可调时钟日历

PCF8563C语言可调时钟日历

/*PCF8563可调时钟日历定义P0口为段输出端口定义P1口为位输出端口用74HC573驱动数码管四按键可调时间日期*/#include<reg52.h>#define uchar unsigned char#define uint unsigned intbit dao1S=0。

//到1秒标志位bit dao2MS=0。

// 到2毫秒标志位bit dao10MS=0。

//到10毫秒标志位bit dao05s=0。

bit dao500MS=0。

sbit dula1=P3^5。

// 定义日期段选sbit wela1=P3^2。

//定义日期位选sbit dula2=P3^4。

// 定义时间星期段选sbit wela2=P3^3。

//定义时间星期位选sbit shanshuo=P2^4。

uchar num,num1,num2,main_flag。

sbit key1=P2^0。

sbit key2=P2^1。

sbit key3=P2^2。

sbit key4=P2^3。

bit set,xiaoshi,fenzhong,miaozhong,xingqi,nianfen,yuefen,rifen。

sbit scl=P3^0。

//定义8563 I2C的时钟线sbit sda=P3^1。

//定义8563 I2C的数据线#define led_data P0 //定义P0口为段输出端口#define led_wei P1 //定义P1口为位输出端口char a,miao,shi,fen,number, b,ms,mg,fs,fg,ss,sg,count。

char day,week,month,year。

uchar tabtime[]={0,0,0,0,0,0,0,0}。

//时间星期缓冲区uchar tabdata[]={0,0,0,0,0,0,0,0} 。

//日期缓冲区uchar weitime[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}。

PCF8563调试

PCF8563调试
ucTimeBuff[0]=0x02;
I2CRead(PCF8563+1, ucTimeBuff, 1, ucTimeBuff, 7,NULL); /* 读取外部PCF8563时钟 */
while(1) {
if(I2CGetFlag() == I2C_READ_END) {
break;
}
OSTimeDly(1);
ucTimeBuff[6] = HEC_to_BCD(pTime->Day);
ucTimeBuff[7] = HEC_to_BCD(pTime->Week);
ucTimeBuff[8] = HEC_to_BCD(pTime->Month);
if (pTime->Year >= 2000){
ucTimeBuff[8] |= 0x80;
return 0;
}
/*********************************************************************************************************
** Function name: pcf8563GetTime
** Descriptions: 获取PCF8563的时间
ucTimeBuff[2] = 0x12; //控制/状态寄存器2
ucTimeBuff[3] = HEC_to_BCD(pTime->Second);
ucTimeBuff[4] = HEC_to_BCD(pTime->Minute);
ucTimeBuff[5] = HEC_to_BCD(pTime->Hour);
INT32S pcf8563GetTime (PCF8563_Time *pTime)

8563时钟显示和红外遥控修改时钟完整资料

8563时钟显示和红外遥控修改时钟完整资料

遥控器整个遥控器共有21个按键,本产品用到的按键是数字0-9,功能键 F1、F2、F3、F4、ENTER(确定用)、CANCEL(取消)。

/*=========================================================== 此程序包含如下功能:1、时钟功能2、显示时和分3、秒用发光二极管显示,闪烁周期为1s============================================================*/#include <STC12C5620AD.h>#include "intrins.h"#include "define.h"#include "function.h"#include "variable.h"#include <math.h> //Keil library#include <stdio.h> //Keil library#include <stdlib.h>bit b_work_pause=false; //工作暂停指示:=1暂停中,=0 工作中bit b_work_rest=false;bit b_add_number;bit best_pingbi=0;unsigned long second_rest_total=0; //休息的总秒数unsigned long second_pause_total=0; //暂停的总秒数unsigned long second_start_pause=0; //暂停开始的时间extern uchar switch_disply[4];extern uchar ir_xiugai[8];extern bit timestep_flag ;static int time_counter_his=0,comp_date_two=0;int zhongjian_two=0;extern void SectorErase(unsigned int addr);extern bit b_tick_flag,b_second_event,b_minute_event,b_tick_flash;extern bit b_spi;extern bit b_key_input,b_key_timer,b_dig_test;extern uchar xdata key_wait_second;extern uchar xdata rec_data;extern uchar num_byte;idata uchar displayarray[32];extern uchar idata MENULEVEL;extern bit b_clock_flash;//时钟秒的闪烁周期uchar time_clock_counter=0;idata uchar monitor_counter=0x00;idata uchar work_days_count;idata uchar now_days;uchar timesecond_changedis=0;/*==============================*/void Cpu_Init(void);void Cpu_re_set(void);void read_ID(void);void SendCharCom(unsigned char);void ret_error(unsigned char);void answer_ID(void);void display(void);extern void my_Read_ds3231_temp(void);uchar xdata chk_sum,chk_sum_IPB; //数据包的校验码bit b_ready_ID=0;bit b_ready_PC=0;extern bit b_dig_test;extern bit b_data_menu;extern bit b_modify_time; //修改时间extern bit b_time_table; //修改时间表extern bit b_input_plan; //开始使用,将输入目标值extern bit b_start_calcute; //开始计算显示数据xdata struct SHFSD_SECOND{uchar plan[4]; //我们已经安全工作天数uchar now[4]; //中国安全工作天数uchar dachenlv[4]; //保持最后记录天数uchar sg_time[8]; //最近一次事故发生时间uchar systerm_time[14]; //系统时间}SHFSDKB;uchar tick_count=0x00;uchar xdata ps_temp[50],ps_count=0;uchar idata times=0;uchar idata keycode=0,keycode0=0,keycode1=0; //ps2_key用于存放接收到的键码bit BF=0; //标识是否有字符被收到void SendCharCom(unsigned char ch){ES=0;EN485=1;SBUF=ch;while(0==TI);WDT_CONTR = 0x3C;TI=0;EN485=0;Delayms(1);ES=1;}void SendStringCom(unsigned char *str,unsigned int strlen){xdata unsigned int k=0;do{SendCharCom(*(str+k));k++;}while(k<strlen);}void Serial_Init(void){//////串口初始化SCON=0x50;///SCON: serail mode 1, 8-bit UART, enable ucvr//TMOD|=0x21;//TMOD: timer 1, mode 2, 8-bit reload,timer 0 is 16 bit counterPCON =0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:4800fosc=11.0592MHzTH1=0xfd;//Baud:2400 fosc=11.0592MHz// EA=1; 下一句已经包含IE|=0x90,EA为IE中一位//IE|=0x90;//Enable Serial InterruptTR1=1;// timer 1 run //TR1是TCON中的一位ES=1;ET1=0;PS=1;IT0=1; //边沿触发EX0=1; //开INT0中断PX0=1;#if 0SCON=0x50;///SCON: serail mode 1, 8-bit UART, enable ucvrTMOD|=0x21;//TMOD: timer 1, mode 2, 8-bit reloadPCON|=0x00;//SMOD=0;//如果SMOD=0即PCON=0x80,则此时Baud:4800 fosc=11.0592MHzTH1=0xfd;//Baud:2400 fosc=11.0592MHz// EA=1; 下一句已经包含IE|=0x90,EA为IE中一位IE|=0x90;//Enable Serial InterruptTR1=1;// timer 1 run //TR1是TCON中的一位//TI=1;#endif}void status_init(void){uchar i;for(i=0;i<4;i++){SHFSDKB.plan[i]=0; //save to sector1;SHFSDKB.now[i]=0; //save to sector2;SHFSDKB.dachenlv[i]=0;}for(i=0;i<12;i++){ SHFSDKB.systerm_time[i]=0;}}void main(void){//Cpu_Init(); //输出端口的初始化及相关变量的初始y化Time_Init();Ds3231_init();IR_init();//EEPROMinit();Serial_Init();EA=1;//SendCharCom(0x55); //启动标志status_init();Delayms(100);Delayms(100);while(1){#if 1WDT_CONTR = 0x3C;TimerService();EN485=0;key_scan();WDT_CONTR = 0x3C;// SwitchInput();if((b_tick_flash == true)&&(MENULEVEL!=0x00)) //如果有红外按键输入激活菜单{WDT_CONTR = 0x3C;b_tick_flash=false;Display_flash();}if(b_second_event==true){b_second_event=false;LED=~LED;WDT_CONTR = 0x3C;if(MENULEVEL==0x00){WDT_CONTR = 0x3C;display();}}if(b_minute_event==true){b_minute_event=false;WDT_CONTR = 0x3C;}if(b_clock_flash==true){b_clock_flash=0; // 20ms的周期time_clock_counter++;if(time_clock_counter>=25)//秒的指示灯,闪烁周期1s{time_clock_counter=0;LEDSECOND=~LEDSECOND;}}#endif}}/*======================================*//*==== 主要是对一些输出端口的初始化=====*//*======================================*/void Cpu_Init(void){/*先对输出端口的初始化*/P3M0 = 0x85; //(10000101)P3M1 = 0x3a; //(00111010)P2M0 = 0x00; //准双向口P2M1 = 0x01; //准双向口P2^0==testP1M0 = 0x00; //全部作为输入口P1M1 = 0x00;/*初始化端口*/P3 = 0xff;P2 = 0xff;P1 = 0xff;P0 = 0xff;/* 对系统变量的初始化,清楚中断标志*//*对串口发送中断清0*//*初始化看门狗*/WDT_CONTR = 0x3C;/*其它的*/PCON = 0x00;}/*====================================================*/ /*=== 以下函数为对CPU端口的重新设置,以防干扰损坏===*/ void Cpu_re_set(void){TMOD = 0x21 ; //定时器0模式1,定时器1模式2TH1 = BPS9600; //TH1的值永远是1200BPS的值/* 以下为对SCON寄存器的重新设置*/// SM0 = 0;// SM1 = 1;REN = 0;ES = 0;EA = 1;}void read_time3232d(){uchar *p,temp[7];uchar i;p = Read_ds3231(); //读出当前时钟数WDT_CONTR = 0x3C;for(i=0;i<7;i++)temp[i] = *p++;SHFSDKB.systerm_time[13]=temp[0]&0x0f;SHFSDKB.systerm_time[12]=(temp[0]&0xf0)>>4;//秒钟,此工程没有秒不显示。

使用实时时钟模块的高精度对时

使用实时时钟模块的高精度对时

·低于 1 秒计时器重置待命
[扩充寄存器②]
*1
Reg(2F)h←(41)h Write
(ECP=0,EHL=1,ET1=0,ET0=0,ERST=1)
·年月日的设定
[Bank1]
Reg(6)h←(14)h Write[年]
Reg(5)h←(04)h Write[月]
*2
Reg(4)h←(18)h Write[日]
很多爱普生的实时时钟模块搭载了 RESET 功能,可使用软件对上述低于 1 秒的误差进行调节。但是,使用软件调节时间的方 法会因软件处理时间而产生时间偏差。这对需要以精确时间实现同步的用户来说,这个误差也须解决。为此,4803 系列和 8803 系列又搭载了使用硬件调节时间的 ERST 功能。
本次说明内建 TCXO 数字式实时时钟模块 4803 系列与 8803 系列所搭载的用于调节低于 1 秒时间的 RESET 功能及 ERST 功 能,并使用时序图等以具体实例进行说明。
技术说明
使用实时时钟模块的高精度对时
搭载秒以下时间调节功能的爱普生实时时钟模块之解说
【序文】 近年,随着电波手表的普及以及可从 NTP 时间服务器获取标准时间等,获取极为准确的时间已不再繁琐劳神。因此,用于金
融、交通管理、电力控制、安全及体育等应用系统设计一般均以可参照正确时间为基础。这类处理系统在数据输入、输出部分必 须设置为数众多的终端设备,且这些终端设备也需要有正确的时间。为了回应上述需求,爱普生向市场提供了内建以高稳定频率 振荡的石英晶体单元的实时时钟模块。
·SEC 寄存器的设定(清除进位信息) [Bank1] Reg(0)h←(00)h Write[秒]
·低于 1 秒计时器重置待命
[Bank3]

提高计算机时钟精确度的几种解决方案

提高计算机时钟精确度的几种解决方案

提高计算机时钟精确度的几种解决方案在现代社会中,计算机时钟精确度的问题已经成为一个重要的话题。

准确的计算机时钟对于各种应用场景都至关重要,例如金融交易、通信网络同步等。

然而,由于硬件和软件方面的限制,计算机时钟的精确度往往无法达到理想水平。

本文将介绍一些提高计算机时钟精确度的解决方案。

1. 使用更精准的时钟源计算机的时钟源通常是一个石英晶体振荡器,它的精确度受到多种因素的影响,如温度、电压等。

为了提高时钟精确度,可以使用更高质量的晶体振荡器,或者采用更稳定的时钟源,如原子钟。

这样可以减小时钟的漂移和抖动,提高时钟的精确度。

2. 使用硬件时钟校正技术硬件时钟校正技术可以通过对时钟信号进行补偿和校正,来提高时钟的精确度。

常见的硬件时钟校正技术包括时钟相位锁定环(PLL)和温度补偿技术。

时钟相位锁定环可以通过调整时钟频率和相位来校正时钟信号,从而提高时钟的稳定性和精确度。

温度补偿技术可以根据晶体振荡器的温度特性,对时钟信号进行补偿,以减小温度对时钟精确度的影响。

3. 使用软件时钟校正算法除了硬件时钟校正技术,软件时钟校正算法也可以提高时钟的精确度。

软件时钟校正算法可以通过对时钟信号进行延迟补偿和频率校正,来减小时钟的漂移和抖动。

常见的软件时钟校正算法包括时间戳校正算法和时钟同步算法。

时间戳校正算法可以通过对数据包的时间戳进行校正,来减小时钟的漂移误差。

时钟同步算法可以通过与网络中其他计算机的时钟进行同步,来提高时钟的精确度。

4. 提高时钟同步精度时钟同步是保证计算机时钟精确度的关键。

常见的时钟同步协议包括网络时间协议(NTP)和精确时间协议(PTP)。

NTP是一种分层的时钟同步协议,它通过与网络中的参考时钟同步,来提高计算机时钟的精确度。

PTP是一种硬件时钟同步协议,它可以通过对时钟信号进行精确的同步,来实现纳秒级的时钟同步精度。

5. 优化操作系统时钟管理操作系统的时钟管理对于计算机时钟精确度也起着重要的作用。

实时时钟芯片PCF8563及其应用

实时时钟芯片PCF8563及其应用

中断输 出( 有效 ) 低


内含 上 电 复 位 电 路 、 荡 与 分 频 电 路 , 接 3 . 振 外 2 7 8 Hz 英 晶 振 ; 6k 石 工 作 电压 范 围宽 , 据 保 持 和 时钟 工 作 电 压 l 数 ~
5 5 1C 总线 工 作 电压 18 . V; . V,2 . ~5 5
此 外 P F 5 3内部 集 成 有 电 压 低 检 测 器 , 在 秒 寄 C 86 并 存 器 的 最 高 位 可 作 出指 示 , 过 查 询 该 位 可 知 数 据 通 是 否 可 靠 , 而 提 醒 及 时 校 准 时钟 。 从
i eal n d t i .
K y r s Clc / ln a ,2 - u ,e itr t r e wo d : o k Cae d r 1C b s rgse ,i . me
P F 5 3是 一 种 低 功 耗 的 时 钟 / C 86 日历 芯 片 , 采 用 IC 总 线 接 口 , 广 泛 用 于 移 动 电 话 、 携 式 仪 。 可 便 器 、 真机等产品 中。 传 形 式 。其 引脚 功 能 如 表 l所 示 。
关 键 词 :时 钟/日历 芯 片 1C 总线 寄存 器 定 时 器 2
PCF85 3 Re ltm e Cl c Ca e a nd Is App i a i n 6 a — i 0 k/ l nd r a t lc to
Ab ta t sr c : P CF8 6 sa r a—i eco k/ ae d ro t ie o O p w e o s m p i n, 5 3 i e lt m l c , ln a p i z d f rl W o rc n u c m t o i c u i g a a m n i e u c in ,a p o r m m a l l c u p ta d i t r n l d n l r a d tm rf n to s r g a b e co k o t u n n e — r p u p tf n to s Po e - n r s ta d o cl t r cr u ta e a s n e r t u to t u u c in . w ro e e n s il o ic i r lo i t g a — a e . n t i a e , h e t r s a d u i g m e h d fP d I h s p p r t e f a u e n sn t o s o CF8 6 r n r d c d 5 3 a eito u e

pcf8563芯片

pcf8563芯片

pcf8563芯片
PCF8563芯片是由NXP Semiconductors(飞利浦)公司设计和制造的一款低功耗实时时钟(RTC)芯片。

RTC芯片是一种
用于精确计时和日期追踪的集成电路,广泛应用于各种电子设备中,如计算机、手机、数码相机、电视等。

PCF8563芯片采用高集成度设计,具有很小的封装尺寸,外接简单,使用方便。

它采用了I2C总线接口,能够直接与微控制器通信,实现对芯片的配置和读取。

PCF8563芯片具有以下主要特点:
1. 低功耗:该芯片的工作电流非常低,使用电池供电可以实现长时间的运行。

在不使用时,它可以通过进入低功耗模式来进一步降低功耗。

2. 高精度:PCF8563芯片具有高精确度的实时时钟功能。

其时钟频率可以通过外部晶体或电阻电容网络进行调整。

它可以提供精确的年、月、日、小时、分钟和秒钟信息,并且具有闰年修正功能。

3. 自动日历调节:芯片可以自动调整日期,包括每个月的天数、星期和闰年。

它还可以通过闹钟功能提供特定时间的警报。

4. 定时器和计时器功能:该芯片还具有定时器和计时器功能,可以实现定时触发或计时操作。

通过配置寄存器,可以设置定时器的周期和计时器的起始时间。

5. 温度补偿:PCF8563芯片内置了温度传感器,可以对温度进行补偿,提高时钟的稳定性和精度。

总结起来,PCF8563芯片是一款低功耗、高精度的实时时钟芯片,具有自动日历调节、定时器和计时器功能以及温度补偿等特点。

它广泛应用于各种电子设备中,为设备提供准确的时间和日期追踪功能。

PCF8563T

PCF8563T

PCF8563 I 2C 实时时钟/日历芯片1.概述PCF8563是低功耗的CMOS 实时时钟/日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I 2C 总线接口串行传递。

最大总线速度为400Kbits/s ,每次读写数据后,内嵌的字地址寄存器会自动产生增量。

2.特性* 低工作电流:典型值为0.25μA (VDD=3.0V ,Tamb=25℃时)。

* 世纪标志* 大工作电压范围:1.0~5.5* 低休眠电流;典型值为0.25μA(V DD =3.0V,T amb =25℃)* 400KHz 的I 2C 总线接口(VDD=1.8~5.5V 时)。

* 可编程时钟输出频率为:32.768KHz ,1024Hz ,32Hz ,1Hz 。

* 报警和定时器。

* 掉电检测器。

* 内部集成的振荡器电容。

* 片内电源复位功能。

* I 2C 总线从地址:读,0A3H ;写,0A2H 。

* 开漏中断引脚。

3.应用z 移动电话 z 便携仪器 z 传真机z 电池电源产品4.简明参考数据表1 简明参考数据符号 描 述条 件 最小值最大值 单 位 I 2C 总线无效; T amb =25℃ 1.0 5.5 VV DD 工作电压I 2C 总线有效; fSCL=400kHz T amb =-40~+85℃ 1.8 5.5 V fSCL=400kHz - 800 μA fSCL=100kHz - 200 μA fSCL=0Hz; T amb =25℃ V DD =5V - 550 nA I DD工作电流; 定时器和CLKOUT 失效 V DD =2V-450nAT amb 工作温度范围-40 +85 ℃ T stg储存温度-65 +150 ℃5.订单信息表2 订定单信息包 装型 号名称 描 述版本 PCF8563P DIP8 塑料双列直插式封装;8脚(300mil) SOT97-1 PCF8563T SO8 小塑料封装;8脚;宽3.9mm SOT96-1 PCF8563TS TSSOP8 小塑料薄型封装;8脚;宽3.0mmSOT505-16.方框图图1 方框图7.管脚配置7.1管脚12348765PCF8563P PCF8563TPCF8563TS V DDCLKOUT OSCO SCLSDAV SSOSCI图2 管脚配置SDASCLCLKOUTV DD图3 二极管保护图7.2管脚描述表3管脚描述符号管脚号描述OSCI 1 振荡器输入OSCO 2 振荡器输出/INT 3 中断输出(开漏;低电平有效)V SS 4 地SDA 5 串行数据I/OSCL 6 串行时钟输入CLKOUT 7 时钟输出(开漏)V DD8 正电源8. 功能描述PCF8563有16个8位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C 总线接口。

I2C实践(二)-PCF8563T实时时钟

I2C实践(二)-PCF8563T实时时钟

实验五、I2C实践(二)-PCF8563T实时时钟实验目的:在这一课里,我们继续复习I2C驱动的编写,并通过FPGA/CPLD来驱动PCF8563T实时时钟,读出时间信息。

实验原理:(1)PCF8563T实时时钟简介PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片PCF8563 的多种报警功能、定时器功能、时钟输出功能、以及中断输出功能能完成各种复杂的定时服务甚至可为单片机提供看门狗功能;内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V) 以及两线制I2C总线通讯方式不但使外围电路极其简洁而且也增加了芯片的可靠性。

同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。

当然作为时钟芯片PCF8563 亦解决了2000 年问题因而PCF8563 是一款性价比极高的时钟芯片它已被广泛用于电表、水表、气表、电话传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

特性●宽电压范围1.0-5.5V 复位电压标准值Vlow=0.9V●超低功耗典型值为0.25 A VDD=3.0V,Tamb=25●可编程时钟输出频率为32.768KHz 1024Hz 32Hz 1Hz●四种报警功能和定时器功能●内含复位电路振荡器电容和掉电检测电路●开漏中断输出●400kHz I2C 总线(VDD=1.8 5.5V) 其从地址读0A3H;写0A2H(2)PCF8563T实时时钟管脚与硬件接口PCF8563 的管脚排列及描述如图及表所示PCF8563与FPGA的接口电路如图所示,由于SDA,SCL与INT,CLKOUT为开漏输出,必须加上拉电阻,由于主要掌握器件配置的原理,所以未安装电池,直接采用核心板3.3V供电。

(3)PCF8563T实时时钟寄存器PCF8563 有16 个8位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz 的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC 提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C总线接口。

时钟芯片PCF8563应用手册

时钟芯片PCF8563应用手册

6,4,2,1,0 0
缺省值置逻辑 0
2 控制/状态寄存器
表 5 控制/状态寄存器 位描述 地址 01H
Bit
符号
描述
7,6,5
0
缺省值置逻辑 0
TI/TP=0:当 TF 有效时 INT 有效 (取决于 TIE 的状态) TI/TP=1:INT
4
TI/TP 脉冲有效,参见表 6 (取决于 TIE 的状态) 注意 若 AF 和 AIE 都
广州周立功单片机发展有限公司 Tel (020)38730976 38730977 Fax 38730925
PCF8563 日历时钟芯片原理及应用设计
一 概述
PCF8563 是 PHILIPS 公司推出的一款工业级内含 I2C 总线接口功能的具有极低功耗的多功能时钟/日 历芯片 PCF8563 的多种报警功能 定时器功能 时钟输出功能以及中断输出功能能完成各种复杂的定时 服务 甚至可为单片机提供看门狗功能 内部时钟电路 内部振荡电路 内部低电压检测电路 1.0V 以 及两线制 I2C 总线通讯方式 不但使外围电路及其简洁 而且也增加了芯片的可靠性 同时每次读写数据 后 内嵌的字地址寄存器会自动产生增量 当然作为时钟芯片 PCF8563 亦解决了 2000 年问题 因而 PCF8563 是一款性价比极高的时钟芯片 它已被广泛用于电表 水表 气表 电话 传真机 便携式仪器 以及电池供电的仪器仪表等产品领域
0
1
0
00
九月
0
1
0
01
十月
1
0
0
00
十一月 1
0
0
01
十二月 1
0
0
10
表 16 年寄存器位描述 地址 08H

PCF8563 实时时钟 日历 产品数据手册说明书

PCF8563 实时时钟 日历 产品数据手册说明书

PCF8563实时时钟/日历第11版——2015年10月26日产品数据手册1. 简介PCF8563是一款低功耗的CMOS1实时时钟/日历芯片,支持可编程时钟输出、中断输出和低压检测。

所有地址和数据通过双线双向I2C总线串联传输,最高速率:400 kbps。

每次读写数据字节后,寄存器地址自动累加。

2. 特性和优势◼基于32.768kHz的晶振,提供年、月、日、星期、时、分和秒计时◼Century flag◼时钟工作电压:1.0 - 5.5 V(室温)◼低备用电流;典型值为0.25 μA(V DD = 3.0 V,T amb =25 °C)◼400 kHz 双线I2C总线接口(V DD = 1.8 - 5.5 V)◼可编程时钟输出(32.768 kHz、1.024 kHz、32 Hz和1Hz)◼报警和定时器功能◼集成晶振电容器◼内部上电复位(POR)◼I2C总线从机地址:读:A3h;写:A2h◼开漏中断管脚3. 应用◼移动电话◼便携式仪器◼电子计量◼电池驱动产品1. 有关本资料表所使用的缩略语及首字母缩略语的定义,请参考第18节。

4. 订购信息表1. 订购信息[1] 不推荐用于新产品设计。

替代零件为PCF8563T/5。

[2] 不推荐用于新产品设计。

替代零件为PCF8563TS/5。

5. 标示表2. 标记代码6. 功能框图图1. PCF8563功能框图7. 引脚配置信息7.1 引脚配置图2. HVSON10的引脚配置(PCF8563BS) 图3. SO8的引脚配置(PCF8563T)图4. TSSOP8的引脚配置(PCF8563TS)7.2 引脚说明表3. 引脚说明[1] 晶粒芯片焊盘(外露式焊盘)通过高电阻(非导电的)芯片附着连接到VSS,并应进行电气隔离。

将外露式焊盘焊接到电气隔离的PCB铜焊盘上,以获得更好的传热效果,这是一种较好的工程实践,但由于RTC不会消耗太多功率,因此并不需要这样做。

PCF8563时钟芯片驱动程序

PCF8563时钟芯片驱动程序

PCF8563时钟芯片驱动详解1概述PCF8563是PHILIPS公司推出的一款工业级含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。

PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。

部时钟电路、部振荡电路、部低电压检测电路(1.0V)以及两线制I2C 总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。

同时每次读写数据后,嵌的字地址寄存器会自动产生增量。

当然作为时钟芯片,PCF8563亦解决了2000年问题。

因而,PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

2原理图3 8563源代码//******************************************************//define//*****************************************************#define PCF8563_ADDR 0xa2 // PCF8563设备地址#define PCF8563_ENABLE 0x00 // 设置#define PCF8563_SUBADDR 0x02 // 时间地址#define PCF8563_NUMB 0x07 // 时间个数#define PCF8563_LOOPTIME 0x02 // 循环次数#define PCF8563_SECMASK 0x7f // second#define PCF8563_MINMASK 0x7f // minute#define PCF8563_HRMASK 0x3f // hour #define PCF8563_DAYMASK 0x3f // day #define PCF8563_WKMASK 0x07 // week #define PCF8563_MOMASK 0x1f // month #define PCF8563_YRMASK 0xff // year/*void DELAY_US(Uint16 i){ Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<5;n++){_nop_();}}}*//********************************************************** 函数名称: void DELAY_MS(Uint16 i)** 功能描述: 延时函数** 输入:延时毫秒数** 输出:无********************************************************///延时函数单位msvoid DELAY_MS(Uint16 i){ Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<1000;n++){_nop_();}}}/********************************************************** 函数名称: InitCrt()** 功能描述: SD2405的初始化** 输入:无** 输出:无********************************************************/void InitCrt(){//设备地址I2cDeviceAdd = PCF8563_ADDR;}/******************************************************** ** 函数名称: CrtGetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 读取时间** 说明:将从PCF8563中读取的时间放入Time指向的结构中** 输入:无** 输出:无********************************************************/ void CrtGetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;SM_Receive (PCF8563_SUBADDR , buf, PCF8563_NUMB);Time->time.ucSecond = buf[0]; //秒Time->time.ucMinute = buf[1]; //分Time->time.ucHour = buf[2]; //时屏蔽最高位Time->date.ucDay = buf[3]; //日Time->Week = buf[4]; //星期Time->date.ucMonth = buf[5]; //月Time->date.ucYear = buf[6]; //年}/******************************************************** ** 函数名称: CrtSetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 设置时间** 说明:将Time指向的结构中日期时间参数设置到sd24.5中** 输入:无** 输出:无********************************************************/ void CrtSetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;//写入设置(时钟工作、关闭复位、关闭测试模式)buf[0] = PCF8563_ENABLE;SM_Send (0, buf, 0);//写入日期时间buf[0] = Time->time.ucSecond; //秒buf[1] = Time->time.ucMinute; //分buf[2] = Time->time.ucHour|0x80; //时置为24小时格式buf[3] = Time->date.ucDay; //日buf[4] = Time->Week; //星期buf[5] = Time->date.ucMonth; //月buf[6] = Time->date.ucYear; //年SM_Send (PCF8563_SUBADDR, buf, PCF8563_NUMB);}4 新华龙C8051F022的IIC驱动程序//----------------------------------------------------------------------------- // Includes//-----------------------------------------------------------------------------#include <c8051f020.h> // SFR declarations#include <stdio.h>#include <king.h>#include <DYSJ.h>#include <I2C.H>#define SMB_FREQUENCY 10000L // Target SCL clock rate/****************************************************************************** ** 函数名称:void SPI0_Init()** 功能描述:I2C初始化程序** 说明:1. 置下降沿有效2. 置工作时钟2MHz3.** 输入:无** 输出:无******************************************************************************* /void I2C_Init(){SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle SMB0CR = -80; //257 - (SYSCLK / (2 * SMB_FREQUENCY));EIE1 |= 2; // SMBus interrupt enable// EA = 1; // Global interrupt enableI2cSM_BUSY = 0; // Free SMBus for first transfer.}/****************************************************************************** ** 函数名称:void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count)** 功能描述:I2C写入程序** 说明:1. 等待空闲2. 写入数据3. 等待结束** 输入:地址byte_address、写入数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count){ET0 = 0; //禁止中断ET2 = 0; //禁止中断while (I2cSM_BUSY); // 等待空闲I2cSM_BUSY = 1; // 置忙SMB0CN = 0x44; // SMBus enabled, ACK on acknowledge cycle I2cSendCount = count; // 置写入数量I2cRecCount = 0; // 读出数量清零I2cSendDPTR = SendBuf; // SMBus enabled, ACK on acknowledge cycle I2CWRITE; // Chip select + WRITEI2cMemAdd = byte_address;STO = 0;STA = 1; // 启动传输FeedWatchdog();while (I2cSM_BUSY); // 等待空闲ET0 = 1; //允许中断ET2 = 1; //允许中断/****************************************************************************** ** 函数名称:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)** 功能描述:I2C读取程序** 说明:1. 等待空闲2. 置地址3. 读取数据3. 等待结束** 输入:地址byte_address、读取数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count){ET0 = 0; //禁止中断ET2 = 0; //禁止中断while (I2cSM_BUSY); // 等待空闲I2cSM_BUSY = 1; // 置忙SMB0CN = 0x44; // SMBus enabled, ACK on acknowledge cycle I2cSendCount = 0; // 置写入数量I2CWRITE; // Chip select + WRITEI2cMemAdd = byte_address; //值地址偏移I2cRecCount = count; //要接收的数据个数I2cRecDPTR = ReadBuf; //指向要接收的数据区STO = 0;STA = 1; // Start transferFeedWatchdog();while (I2cSM_BUSY); // 等待空闲ET0 = 1; //允许中断ET2 = 1; //允许中断}/****************************************************************************** ** 函数名称:void SMBUS_ISR (void) interrupt 7** 功能描述:I2C中断服务程序** 说明:1. 选择器件地址2. 置读写地址3. 读取或写入数据3. 置结束标志** 输入:无** 输出:无******************************************************************************* /void SMBUS_ISR (void) interrupt 7{switch (SMB0STA) // Status code for the SMBus (SMB0STA register){// 主发送器/接收器:起始条件已发送// 在该状态发送的COMMAND 字的R/W 位总是为0(W),// 因为对于读和写操作来说都必须先写存储器地址。

保证PCF8563 实时时钟精度的设计方法

保证PCF8563 实时时钟精度的设计方法

-3-
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 MuRata TZB04 微调电容 Farnell 元件 Philips Components CV05 微调电容 Farnel 元件 Philips Components 多层陶瓷电容 选择一个石英
度系数对精度几乎没有影响 最大的影响来自石英晶体的温度系数 32kHz 的石英晶体通常属于音叉类型 下 AT-cuts 铃声的最大频率波形相对照 得出温度升高或降低时频率都会下降 这对手表的影 而且几乎稳定 响不大 因为手腕的温度大约是 28
图 2 比较了不同的传播和变调的大小
图2 (a) (b) (c) 拉的范围足够大 如果 C6 大 可以补偿 偏差也大
广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925
保证 PCF8563 实时时钟精度的设计方法
目录
1 2 3 4 5 6 7 8 9 10 11 12 13
介绍 ........................................................................................................................ 2 比较 ........................................................................................................................ 2 特性 ........................................................................................................................ 2 上电复位 ................................................................................................................. 2 振荡器 ..................................................................................................................... 2 振荡器调谐 ............................................................................................................. 5 Y2K......................................................................................................................... 6 初始化 ..................................................................................................................... 6 警告 ........................................................................................................................ 7 定时器 ................................................................................................................... 7 PC 板的布线 ......................................................................................................... 8 部分电路关闭 保护二极管 .............................................................................. 8 保持低功耗的提示 ................................................................................................ 9

跟我学51单片机_十二_实时时钟_日历芯片PCF8563

跟我学51单片机_十二_实时时钟_日历芯片PCF8563

证准确的时钟/日历数据。 其余位表示的是BCD 格式的当前秒数值,值为00~
表2寄存器概况
地址
寄存器名称
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
00H
控制/状态寄存器1
TEST
0
STOP
0
TESTC
0
0
0
01H
控制/状态寄存器2
0
0
0
TI/TPLeabharlann AFTFAIE
TIE
0DH
CLKOUT 频率寄存器



00~59BCD 码格式数



01~31BCD 码格式数
06H
星期





0~6
07H
月/世纪
C


01~12 BCD 码格式数
08H

00~99 BCD 码格式数
09H
分钟报警
AE
00~59 BCD 码格式数
0AH
小时报警
AE

00~23 BCD 码格式数
0BH
日报警
AE

01~31 BCD 码格式数
表1 PCF8563的管脚功能 符号 OSCI OSCO /INT VSS SDA SCL
CLKOUT VDD
管脚号 1 2 3 4 5 6 7 8
功能描述 振荡器输入 振荡器输出 中断输出(开漏,低电 平有效)
地 串行数据 I/O 串行时钟输入 时钟输出 (开漏)
正电源
制作入门
当PCF8563内部的一个寄存器被读时所有计数器的内容被 锁存,因此在传送条件下可以禁止对时钟日历芯片的错读。

PCF8563实时时钟日历芯片详细资料(中文版——权威)

PCF8563实时时钟日历芯片详细资料(中文版——权威)

PCF8563实时时钟⽇历芯⽚详细资料(中⽂版——权威)PCF8563 实时时钟⽇历芯⽚选型指南1. 概述PCF8563是低功耗的CMOS实时时钟⽇历芯⽚。

它提供⼀个可编程时钟输出⼀个中断输出和掉电检测器所有的地址和数据,通过I2C总线接⼝串⾏传递最⼤总线速度为400Kbits/s,每次读写数据后内嵌的字地址寄存器会⾃动产⽣增量。

2. 特性低⼯作电流典型值:0.25 A,VDD=3.0V Tamb=25 时;世纪标志;⼤⼯作电压范围:1.0V--5.5V;低休眠电流典型值为:0.25 A(VDD=3.0V,Tamb=25 );400KHz 的I2C 总线接⼝:VDD=1.8 5.5V 时;可编程时钟输出频率为:32.768KHz、1024Hz、32Hz、1Hz;报警和定时器;内部集成的振荡器电容⽚内电源复位功能掉电检测器;I2C 总线从地址:读0A3H 写0A2H;开漏中断引脚。

3. 应⽤复费率电度表IC、卡⽔表IC、卡煤⽓表便携仪器传真机移动电话电池电源产品4.简明参考数据8.功能描述PCF8563内有16个8位的地址递增寄存器,⼀个32.768 kHz⽚上集成电容振荡器,⼀个实时时钟源(RTC)的分频器,可编程的时钟输出,⼀个定时器,报警器,⼀个低压检测器和400KHz的I2C接⼝。

所有16个寄存器被设计成可寻址的8位并⾏寄存器,虽然不是所有的位都有效。

前两个寄存器(内存地址00H和01H),⽤于控制与/或状态寄存器。

内存地址02H⾄08H是时钟功能的计数器,⽤于(秒、分、时、⽇、⽉、年计数器)。

内存地址09H⾄0CH包含定义报警的条件的报警寄存器。

内存地址0DH控制CLKOUT的输出频率。

0EH和0FH分别是定时控制器和定时器。

秒、分钟、⼩时、天、⽉、年、以及每分钟报警、⼩时报警、⽇报警寄存器都以BCD 格式编码。

平⽇和星期报警寄存器不以BCD格式编码。

当⼀个RTC寄存器被读取,所有的寄存器的内容被冻结。

STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序

STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序

敬告:没有51单片机基础的人请慎重下载高质量实用性51单片机STC15W系列程序(3),STC8A系列可参考STC15单片机PCF8563时钟芯片LCD1602显示4×4键盘设置时间程序/**************************************************/ main主函数程序:#include "Library.h"unsigned char code orgval[7]={0x00,0x00,0x00,0x20,0x01,0x04,0x20,};unsigned char set_buf[13]={0,0,0,0,0,0,1,0,0,0,0,0,0,}; unsigned char t_buf[7];unsigned char t_rec[7];unsigned char time_buf[15];unsigned char x_value;unsigned char y_value;bit enter_flag;bit tmr200ms_flag=0;void Write_original(unsigned char *originalval);void Timer0_config(unsigned int ms);void Display_time(unsigned char *tm_buf);void main(){unsigned char sec_bkp;unsigned char testbuf[7];P1M1 &= 0x3F; P1M0 &= 0x3F;P2M1 &= 0x3F; P2M0 &= 0x3F;P5M1 &= 0xF3; P5M0 &= 0xF3;P4M1 &= 0x0F; P4M0 &= 0x0F;P2M1 &= 0xE5; P2M0 &= 0xE5;P0M1 = 0x00; P0M0 = 0x00;Timer0_config(1);LCD1602_init();EA = 1;//F0 = 0;//LCD1602_wbyte(0,0,"hi",sizeof("hi")-1);//test LCD1602//P0 = 0xFF;Read_time(0x02,testbuf);if(testbuf[0]&0x80){Write_original(orgval);}while(1){Key_driver();if(tmr200ms_flag){tmr200ms_flag=0;Read_time(0x02,t_rec);//Display_time(t_buf);//test}if(enter_flag==0){if(sec_bkp!=t_rec[0]){sec_bkp = t_rec[0];Display_time(t_rec);}}}}void Display_time(unsigned char *tm_buf){time_buf[0] = ((tm_buf[2])>>4)+'0';time_buf[1] = ((tm_buf[2])&0x0F)+'0';time_buf[2] = ':';time_buf[3] = ((tm_buf[1])>>4)+'0';time_buf[4] = ((tm_buf[1])&0x0F)+'0';time_buf[5] = ':';time_buf[6] = ((tm_buf[0])>>4)+'0';time_buf[7] = ((tm_buf[0])&0x0F)+'0';LCD1602_wbyte(0,0,time_buf,8);time_buf[0] = 0x02 + '0';time_buf[1] = 0x00 + '0';time_buf[2] = (tm_buf[6]>>4)+'0';time_buf[3] = (tm_buf[6]&0x0F)+'0';time_buf[4]= '-';time_buf[5] = (tm_buf[5]>>4)+'0';time_buf[6] = (tm_buf[5]&0x0F)+'0';time_buf[7]= '-';time_buf[8] = (tm_buf[3]>>4)+'0';time_buf[9] = (tm_buf[3]&0x0F)+'0';LCD1602_wbyte(0,1,time_buf,10);time_buf[0] = (tm_buf[4]&0x0F)+'0';LCD1602_wbyte(10,0,time_buf,1);}void Write_original(unsigned char *originalval) {Display_time(originalval);Write_time(0x02,originalval);}void KeyAction(unsigned char kc){unsigned int tmp;if(kc==0x26)//up{}else if(kc==0x28)//down{}else if(kc==0x25)//left:set x,y{if(enter_flag){if(y_value==0){if(x_value<10){x_value++;if(x_value==7){x_value = 10;}}else{x_value = 0;y_value = 1;}}else if(y_value==1){if(x_value<9){x_value++;}else{x_value = 0;y_value = 0;}}Setcursor(x_value,y_value);}}else if(kc==0x27)//right:set value{if(enter_flag){if(y_value==0){if(x_value==0||x_value==1){if(x_value==0){if(set_buf[0]<2){set_buf[0]++;}else{set_buf[0]=0;}}else if(x_value==1){if(set_buf[1]<9){set_buf[1]++;}else{set_buf[1]=0;}}if((set_buf[0]==2)&&(set_buf[1]>3)){set_buf[1] = 0;}t_buf[2] =( set_buf[0]<<4) |( set_buf[1]&0x0F);}else if(x_value==3||x_value==4){if(x_value==3){if(set_buf[2]<5){set_buf[2]++;}else{set_buf[2]=0;}}else if(x_value==4){if(set_buf[3]<9){set_buf[3]++;}else{set_buf[3]=0;}}t_buf[1] =(set_buf[2]<<4 )|( set_buf[3]&0x0F);}else if(x_value==6||x_value==7){if(x_value==6){if(set_buf[4]<5){set_buf[4]++;}else{set_buf[4]=0;}}else if(x_value==7){if(set_buf[5]<9){set_buf[5]++;}else{set_buf[5]=0;}}t_buf[0] = (set_buf[4]<<4 )|( set_buf[5]&0x0F);}else if(x_value==10){if(set_buf[6]<7){set_buf[6]++;}else{set_buf[6] = 0x01;}t_buf[4] = set_buf[6]&0x0F; }}else if(y_value==1){if(x_value==2||x_value==3){if(x_value==2){if(set_buf[7]<9){set_buf[7]++;else{set_buf[7]=0;}}else if(x_value==3){if(set_buf[8]<9){set_buf[8]++;}else{set_buf[8]=0;}}t_buf[6] = (set_buf[7]<<4)|( set_buf[8]);}else if(x_value==5||x_value==6){if(x_value==5){if(set_buf[9]<1){set_buf[9]++;else{set_buf[9]=0;}}else if(x_value==6){if(set_buf[10]<9){set_buf[10]++;}else{set_buf[10]=0;}if((set_buf[9]==1)&&(set_buf[10]>2)){set_buf[10] = 0;}}t_buf[5] = (set_buf[9]<<4)| set_buf[10];}else if(x_value==8||x_value==9){if(x_value==8){if(set_buf[11]<3){set_buf[11]++;}else{set_buf[11]=0;}}else if(x_value==9){if(set_buf[12]<9){set_buf[12]++;}else{set_buf[12]=0;}if((set_buf[11]==3)&&(set_buf[12]>0)&&((t_buf[5]==0x04)| |(t_buf[5]==0x06)||(t_buf[5]==0x09)||(t_buf[5]==0x11))){set_buf[12] = 0;}elseif((set_buf[11]==3)&&(set_buf[12]>1)){set_buf[12] = 0;}}t_buf[3] = (set_buf[11]<<4)|set_buf[12];}if((t_buf[5]==0x02)&&(t_buf[3]>=0x29)){tmp = set_buf[7]*10 + set_buf[8];tmp = tmp + 2000;if((tmp%4==0)&&(tmp%100!=0)){t_buf[3] = 0x29;}else{t_buf[3] = 0x28;}}if(((t_buf[5]==0x04)||(t_buf[5]==0x06)||(t_buf[5]==0x09) ||(t_buf[5]==0x11))&&(t_buf[3]==0x31)){t_buf[3]=0x30;}}Display_time(t_buf);}}else if(kc==0xC0)//esc{OffCursor();Setcursor(0,0);enter_flag = 0;}else if(kc==0x0D)//enter{if(enter_flag==0){enter_flag = 1;OnCursor();Setcursor(0,0);}else{enter_flag = 0;OffCursor();Setcursor(0,0);Write_time(0x02,t_buf); }}else{}}void Timer0_config(unsigned int ms){unsigned long tmp;tmp = (MAIN_Fosc*ms)/1000;tmp = 65536 - tmp;TL0 = (unsigned char)tmp;TH0 = (unsigned char)(tmp>>8);TMOD &= 0xF0;AUXR |= 0x80;ET0 = 1;TR0 = 1;}void Timer0_interrupt() interrupt 1{static unsigned int tmr200ms=0;Key_scan();tmr200ms++;if(tmr200ms>500){tmr200ms = 0;tmr200ms_flag=1; }}/**************************************************/ PCF8563程序及简要说明:/*****************************1.IIC-bus slave address:read A3h and write A2h2.16 8-bit registers3.Binary coded Decimal->BCD4.registers describe1>Control_status_1 address 00h-> 0000 00002>Control_status_2 address 01h-> 0000 00003>VL_seconds address 02h-> VL 000(5) 0000(9)defualt VL = 14>Minutes address 03h-> x 000(5) 0000(9)5>Hours address 04h-> xx 00(2) 0000(9)6>Days address 05h-> xx 00(3) 0000(9)7>Weekdays address 06h-> xxxx x000(6):000->sunday 110->saturday8>Century_months address 07h-> 0xx 0(1) 0000(9)9>Years address 08h-> 0000(9) 0000(9)->99Access time for read/write operations->start->slave address->data/data...->stop->10>~13> alarm registers omitted:default value,min_alarm->0b1000 0000, hour_alarm->0b1000 0000,day_alarm->0b1000 0000,week_alarm->0b1000 0000,14> clkout control register omitted:default value,0b1000 0000,15>Timer_control address 0Eh->default value,0b0000 0000,16>Tiemr address 0Fh->default value,0b0000 0000*******************************/ #include "Library.h"//struct t_truct//{// unsigned char sec;// unsigned char min;// unsigned char hor;// unsigned char day;// unsigned char mon;// unsigned int year;// unsigned char week;//};void Delay1us() //@11.0592MHz {unsigned char i;_nop_();_nop_();i = 8;while (--i);}void IIC_start(){SDA = 1;SCL = 1;Delay1us();SDA = 0;Delay1us();SCL = 0;}void IIC_stop(){SCL = 0;SDA = 0;Delay1us();SCL = 1;Delay1us();SDA = 1;Delay1us();}unsigned char IIC_readAck(){unsigned char val;unsigned char mask;SDA = 1;for(mask=0x80;mask!=0;mask>>=1) {Delay1us();SCL = 1;if(SDA)val |= mask;elseval &= ~mask;Delay1us();SCL = 0;}SDA = 0;Delay1us();SCL = 1;Delay1us();SCL= 0;return val;}unsigned char IIC_readNack(){unsigned char val;unsigned char mask;SDA = 1;for(mask=0x80;mask!=0;mask>>=1) {SCL = 1;Delay1us();if(SDA)val |= mask;elseval &= ~mask;SCL = 0;Delay1us();}SDA = 1;Delay1us();SCL = 1;Delay1us();SCL= 0;return val;}bit IIC_write(unsigned char dat) {unsigned char mask;bit ack;for(mask=0x80;mask!=0;mask>>=1) {//Delay1us();if((dat&mask)==0)SDA = 0;elseSDA = 1;Delay1us();SCL = 1;Delay1us();SCL = 0; ////////}SDA = 1;Delay1us();//SCL = 0;SCL = 1;ack = SDA;Delay1us();// SCL = 1;// Delay1us();SCL = 0;return ~ack;}void Read_time(unsigned char addr,unsigned char *tm_buf) { do{IIC_start();if(IIC_write(0xA2))break;IIC_stop();}while(1);IIC_write(addr);IIC_start();//or IIC_stop()IIC_write(0xA3);tm_buf[0] = IIC_readAck();tm_buf[1] = IIC_readAck();tm_buf[2] = IIC_readAck();tm_buf[3] = IIC_readAck();tm_buf[4] = IIC_readAck();tm_buf[5] = IIC_readAck();tm_buf[6] = IIC_readNack();IIC_stop();}void Write_time(unsigned char addr,unsigned char *tm_buf) {do{IIC_start();if(IIC_write(0xA2))break;IIC_stop();}while(1);IIC_write(addr);IIC_write(tm_buf[0]);IIC_write(tm_buf[1]);IIC_write(tm_buf[2]);IIC_write(tm_buf[3]);IIC_write(tm_buf[4]);IIC_write(tm_buf[5]);IIC_write(tm_buf[6]);IIC_stop(); }/**************************************************/4×4键盘程序:#include "Library.h"/**********************************if enter key down 3second ,into time setting mode,else calculator mode**********************************/unsigned char code keycode[4][4]={{0x31,0x32,0x33,0x26},//up{0x34,0x35,0x36,0x28},//down{0x37,0x38,0x39,0x25},//left{0x30,0xC0,0x0D,0x27},//right};unsigned char keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};//bit enter3s;//down 3svoid Key_scan(){static unsigned char keyout = 0;static unsigned char keybuf[4][4]={{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},{0x0F,0x0F,0x0F,0x0F},};unsigned char i;keybuf[keyout][0]=(keybuf[keyout][0]<<1)|keyin_1;keybuf[keyout][1]=(keybuf[keyout][1]<<1)|keyin_2;keybuf[keyout][2]=(keybuf[keyout][2]<<1)|keyin_3;keybuf[keyout][3]=(keybuf[keyout][3]<<1)|keyin_4;for(i=0;i<4;i++){if((keybuf[keyout][i]&0x0F)==0x00){keysta[keyout][i] = 1;}else if((keybuf[keyout][i]&0x0F)==0x0F){keysta[keyout][i] = 0;}}keyout++;keyout &= 0x03;switch(keyout){case 0:keyout_4=1;keyout_1=0;break;case 1:keyout_1=1;keyout_2=0;break;case 2:keyout_2=1;keyout_3=0;break;case 3:keyout_3=1;keyout_4=0;break;default:break;}}void Key_driver(){unsigned char i,j;static unsigned char stabkp[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};for(i=0;i<4;i++){for(j=0;j<4;j++){if(stabkp[i][j]!=keysta[i][j]){if(stabkp[i][j]==0){KeyAction(keycode[i][j]); }}stabkp[i][j] = keysta[i][j]; }}}/**************************************************/ LCD1602程序:#include "Library.h"void LCD1602_rsta(){unsigned char tmp;P0 = 0xFF;//this is a mustrs = 0;rw = 1;do{en = 1;//Delay1us();tmp = P0;//Delay1us();en = 0;}while(tmp&0x80);}void LCD1602_wdat(unsigned char dat){LCD1602_rsta();rs=1;rw=0;P0 = dat;en = 1;//Delay1us();en = 0;}void LCD1602_wcmd(unsigned char cmd){LCD1602_rsta();rs=0;rw=0;P0 = cmd;en = 1;//Delay1us();en = 0;}void Setcursor(unsigned char x,unsigned char y){if(y==0)x = x + 0x00;else if(y==1)x = x + 0x40;LCD1602_wcmd(x|0x80);}void LCD1602_wbyte(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len){Setcursor(x,y);while(buf_len>0){LCD1602_wdat(*buf++); buf_len--;}}void OnCursor(){LCD1602_wcmd(0x0F);}void OffCursor(){LCD1602_wcmd(0x0C);}void LCD1602_init(){// Delay15ms();// LCD1602_wcmd(0x38);// Delay5ms();LCD1602_wcmd(0x38);// LCD1602_wcmd(0x08);LCD1602_wcmd(0x06);LCD1602_wcmd(0x0C);LCD1602_wcmd(0x01);}/**************************************************/Library.h#ifndef _Library_H#define _Library_H#include "STC15.h"#include "intrins.h"#define MAIN_Fosc 11059200L//PCF8563sbit SCL = P1^6;sbit SDA = P1^7;//sbit SDA = P5^3;//sbit SCL = P5^2;void Read_time(unsigned char addr,unsigned char *tm_buf); void Write_time(unsigned char addr,unsigned char *tm_buf); void Delay1us();//4x4Keysbit keyin_1 = P2^7;sbit keyin_2 = P2^6;sbit keyin_3 = P5^3;sbit keyin_4 = P5^2;sbit keyout_1 = P4^7;sbit keyout_2 = P4^6;sbit keyout_3 = P4^5;sbit keyout_4 = P4^4;void Key_driver();void Key_scan();void KeyAction(unsigned char kc);//LCD1602sbit rs = P2^4;sbit rw = P2^3;sbit en = P2^1;void LCD1602_init();void LCD1602_wbyte(unsigned char x,unsigned char y,unsigned char *buf,unsigned char buf_len);void OnCursor();void OffCursor();void Setcursor(unsigned char x,unsigned char y);void LCD1602_wdat(unsigned char dat);#endif。

PCF8563时钟芯片驱动程序

PCF8563时钟芯片驱动程序

PCF8563时钟芯片驱动详解1概述PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。

PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。

内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。

同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。

当然作为时钟芯片,PCF8563亦解决了2000年问题。

因而,PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

2原理图3 8563源代码//******************************************************//define//*****************************************************#define PCF8563_ADDR0xa2// PCF8563设备地址#define PCF8563_ENABLE0x00// 设置#define PCF8563_SUBADDR0x02// 时间地址#define PCF8563_NUMB0x07// 时间个数#define PCF8563_LOOPTIME0x02// 循环次数#define PCF8563_SECMASK 0x7f// second#define PCF8563_MINMASK 0x7f// minute#define PCF8563_HRMASK 0x3f// hour#define PCF8563_DAYMASK 0x3f// day#define PCF8563_WKMASK 0x07// week#define PCF8563_MOMASK 0x1f// month#define PCF8563_YRMASK 0xff// year/*void DELAY_US(Uint16 i){Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<5;n++){_nop_();}}}*//******************************************************** ** 函数名称: void DELAY_MS(Uint16 i)** 功能描述: 延时函数** 输入:延时毫秒数** 输出:无********************************************************///延时函数单位msvoid DELAY_MS(Uint16 i){Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<1000;n++){_nop_();}}}/******************************************************** ** 函数名称: InitCrt()** 功能描述: SD2405的初始化** 输入:无** 输出:无********************************************************/ void InitCrt(){//设备地址I2cDeviceAdd = PCF8563_ADDR;}/******************************************************** ** 函数名称: CrtGetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 读取时间** 说明:将从PCF8563中读取的时间放入Time指向的结构中** 输入:无** 输出:无********************************************************/ void CrtGetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;SM_Receive (PCF8563_SUBADDR , buf, PCF8563_NUMB);Time->time.ucSecond = buf[0];//秒Time->time.ucMinute = buf[1];//分Time->time.ucHour = buf[2];//时屏蔽最高位Time->date.ucDay = buf[3];//日Time->Week = buf[4];//星期Time->date.ucMonth = buf[5];//月Time->date.ucYear = buf[6];//年}/******************************************************** ** 函数名称: CrtSetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 设置时间** 说明:将Time指向的结构中日期时间参数设置到sd24.5中** 输入:无** 输出:无********************************************************/ void CrtSetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;//写入设置(时钟工作、关闭复位、关闭测试模式)buf[0] = PCF8563_ENABLE;SM_Send (0, buf, 0);//写入日期时间buf[0] = Time->time.ucSecond;//秒buf[1] = Time->time.ucMinute;//分buf[2] = Time->time.ucHour|0x80;//时置为24小时格式buf[3] = Time->date.ucDay;//日buf[4] = Time->Week;//星期buf[5] = Time->date.ucMonth;//月buf[6] = Time->date.ucYear;//年SM_Send (PCF8563_SUBADDR, buf, PCF8563_NUMB);}4 新华龙C8051F022的IIC驱动程序//-----------------------------------------------------------------------------// Includes//-----------------------------------------------------------------------------#include <c8051f020.h> // SFR declarations#include <stdio.h>#include <king.h>#include <DYSJ.h>#include <I2C.H>#define SMB_FREQUENCY 10000L // Target SCL clock rate/****************************************************************************** ** 函数名称:void SPI0_Init()** 功能描述:I2C初始化程序** 说明:1. 置下降沿有效2. 置工作时钟2MHz3.** 输入:无** 输出:无******************************************************************************* /void I2C_Init(){SMB0CN = 0x44;// Enable SMBus with ACKs on acknowledge cycle SMB0CR = -80; //257 - (SYSCLK / (2 * SMB_FREQUENCY));EIE1 |= 2;// SMBus interrupt enable//EA = 1;// Global interrupt enableI2cSM_BUSY = 0;// Free SMBus for first transfer.}/****************************************************************************** ** 函数名称:void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count)** 功能描述:I2C写入程序** 说明:1. 等待空闲2. 写入数据3. 等待结束** 输入:地址byte_address、写入数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count){ET0 = 0;//禁止中断ET2 = 0;//禁止中断while (I2cSM_BUSY);// 等待空闲I2cSM_BUSY = 1;// 置忙SMB0CN = 0x44;// SMBus enabled, ACK on acknowledge cycleI2cSendCount = count;// 置写入数量I2cRecCount = 0;// 读出数量清零I2cSendDPTR = SendBuf;// SMBus enabled, ACK on acknowledge cycleI2CWRITE;// Chip select + WRITEI2cMemAdd = byte_address;STO = 0;STA = 1;// 启动传输FeedWatchdog();while (I2cSM_BUSY);// 等待空闲ET0 = 1;//允许中断ET2 = 1;//允许中断}/****************************************************************************** ** 函数名称:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)** 功能描述:I2C读取程序** 说明:1. 等待空闲2. 置地址3. 读取数据3. 等待结束** 输入:地址byte_address、读取数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count){ET0 = 0;//禁止中断ET2 = 0;//禁止中断while (I2cSM_BUSY);// 等待空闲I2cSM_BUSY = 1;// 置忙SMB0CN = 0x44;// SMBus enabled, ACK on acknowledge cycleI2cSendCount = 0;// 置写入数量I2CWRITE;// Chip select + WRITEI2cMemAdd = byte_address;//值地址偏移I2cRecCount = count;//要接收的数据个数I2cRecDPTR = ReadBuf;//指向要接收的数据区STO = 0;STA = 1;// Start transferFeedWatchdog();while (I2cSM_BUSY);// 等待空闲ET0 = 1;//允许中断ET2 = 1;//允许中断}/****************************************************************************** ** 函数名称:void SMBUS_ISR (void) interrupt 7** 功能描述:I2C中断服务程序** 说明:1. 选择器件地址2. 置读写地址3. 读取或写入数据3. 置结束标志** 输入:无** 输出:无*******************************************************************************/void SMBUS_ISR (void) interrupt 7{switch (SMB0STA) // Status code for the SMBus (SMB0STA register){// 主发送器/接收器:起始条件已发送// 在该状态发送的COMMAND 字的R/W 位总是为0(W),// 因为对于读和写操作来说都必须先写存储器地址。

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

广州周立功单片机发展有限公司 Tel: (020)38730976 38730977 Fax: 38730925 PCF8563实时时钟高精度调整方法
一、概述
PCF8563是PHILIPS公司设计生产的经典工业级实时时钟芯片(RTC),I2C总线接口,具有功耗低、精度高等特点,广泛应用于电表、水表、气表、电话等产品。

本文将介绍如何调整PCF8563时钟精度的方法。

二、电路原理
图1 PCF8563高精度调整
三、相关说明
如图1所示,R3、R4为I2C总线上拉电阻,若总线速度高于100KHz,电阻阻值要更小。

由于PCF8563的中断输出及时钟输出均为开漏输出,所以要外接上拉电阻(如图1的R1、R2),若不使用这两个信号,对应的上拉电阻可以不用。

对于PCF8563芯片,需外接时钟晶振32768Hz(如图1的X1),推荐使用5ppm或更稳定的晶振。

PCF8563典型应用电路推荐使用15pF的晶振匹配电容,实际应用时可以作相应的调整,以使RTC获得更高精度的时钟源。

一般晶振匹配电容在15pF~21pF之间调整(相对于5ppm精度的32768Hz晶振),15pF电容时时钟频率略偏高,21pF电容时时钟频率略偏低。

四、操作方法
1.
设置PCF8563时钟输出有效(CLKOUT),输出频率为32.768KHz。

使用高精度频率计测量CLKOUT输出的频率。

2.
根据测出的频率,对JC1、JC2、JC3作短接或断开调整。

频率比32768Hz偏高时, 3.
加大电容值;频率比32768Hz偏低时,减小电容值。

说明:图1中的C1、C2、C3的值在1pF~5pF之间,根据实际情况确定组合方式,以便于快速调整。

推荐使用(3pF、3pF、3pF)、(1pF、2pF、3pF)、(2pF、3pF、4pF)。

- 1 -。

相关文档
最新文档