STM32对时钟芯片PCF8563的编程

合集下载

时钟由FPC8563产生,程序如下-推荐下载

时钟由FPC8563产生,程序如下-推荐下载

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit scl1=P2^0;//定义数码管时钟线sbit sda1=P2^1;//定义数码管数据线sbit scl3=P2^4;//定义数码管时钟线sbit sda3=P2^5;//定义数码管数据线sbit scl4=P2^6;//定义数码管时钟线sbit sda4=P2^7;//定义数码管数据线sbit scl=P0^6;//定义8563 I2C的时钟线sbit sda=P0^7; //定义8563 I2C的数据线uchar a,miao,shi,fen,number, b;uint day,week,month,year;uchar code tab[]={0x11,0x7d,0x23,0x29,0x4d,// 0 1 2 3 4 //0x89,0x81,0x3d,0x01,0x09, // 5 6 7 8 9 //0x05,0xc1,0x93,0x61,0x83,0x87 }; // A B C D E F void delay(){ ;; }//=========8563起始信号子程序========== void start(){sda=1;delay();scl=1;delay();sda=0;delay();}//==========8563终止信号子程序========= void stop(){sda=0;delay();scl=1;delay();sda=1;delay();}//=========8563应答信号子============== void respons(){uchar i; scl=1;delay();while((sda==1)&&(i<250))i++; //若无应答,重新开始发送地址scl=0;delay();}//======8563总线初始化子=========void init(){sda=1;delay();scl=1;delay();}//===========写入1字节子程==============void write_byte(uchar date){uchar i,temp;temp=date; //写入数据datefor(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY; //往数据线送date最高位,循环8次送完datedelay();scl=1;delay();scl=0;delay();}sda=1; //释放数据总线,以便读取应答信号delay();}//===========读取1字节子程序=========== uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++) //读回时是一位一位的所以要读8次{scl=1; // scl置1数据才稳定才可以读取数据delay();k=(k<<1)|sda; //sda送过来的数据送到k的最底位,循环8次从最高位读完sda上的数据scl=0;delay();}return k; //程序执行完返回k的值}//============延时子程序=============void delay1(uchar x){uchar a,b;for(a=x;a>0;a--)for(b=100;b>0;b--);}//===========写一8位数据子程序======== void write_add(uchar address,uchar date){start(); //调用起始信号子程序,开始写入信号write_byte(0xa2); //找芯片所在地址respons(); //调用应答信号write_byte(address);//找芯片内部存储器地址respons();write_byte(date);// 写入数据,写进芯片内部存储器respons();stop(); //调用终止信号子程序,终止信号写入}//===========读一8位数据子程序======= uchar read_add(uchar address){uchar date;start(); //调用起始信号子程序write_byte(0xa2); //取芯片地址respons();write_byte(address);//取芯片内部存储器地址respons();start(); //调用起始信号子程序,开始读取信号write_byte(0xa3);//芯片读地址respons();date=read_byte();//把读取字节子程序的返回值给datestop();return date; // 程序执行完返回date的值}//===============写时间子程序=========== void write_8563(uchar w_miao,uchar w_fen,uchar w_ shi,uchar w_day,uchar w_week,uchar w_month,uchar w_year){ init();start();write_add(0x00,0x00);write_add(0x01,0x00);write_add(0x02, w_miao);delay1(100);write_add(0x03,w_fen);delay1(100);write_add(0x4,w_shi);delay1(100);write_add(0x05,w_day);delay1(100);write_add(0x06,w_week);delay1(100);write_add(0x7,w_month);delay1(100);write_add(0x8,w_year);delay1(100);}//===============读时间子程序==========void read_8563(){miao=read_add(0x02)&0x7f;//获取秒数据miao=((miao&0xf0)>>4&0x0f)*10+(miao&0x0f);/ /BCD码转换成10进制数if(miao>=60){miao=0;}fen=read_add(0x03)&0x7f;//获取分钟fen=((fen&0xf0)>>4&0x0f)*10+(fen&0x0f);//BCD 码转换成10进制数if(fen>=60){fen=0;}shi=read_add(0x04)&0x3f;//获取小时shi=((shi&0xf0)>>4&0x0f)*10+(shi&0x0f);//BCD 码转换成10进制数if(shi>=24){shi=0;}day=read_add(0x05)&0x3f;//获取日数据day=(( day&0xf0)>>4&0x0f)*10+( day&0x0f);// BCD码转换成10进制数if( day>=31){ day=0;}week=read_add(0x06)&0x07;//获取星期if(week>6){week=0;}month=read_add(0x07)&0x1f;//获取月month=((month&0xf0)>>4&0x0f)*10+(month&0x0 f);//BCD码转换成10进制数if(month>=24){month=0;}year=read_add(0x08)&0xff;//获取年shi=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BC D码转换成10进制数delay1(100);}/******************************************* ******************************************************** *************///============数码管移位子程========void shift1(){uchar i,t;number=tab[b];scl1=0;for(i=0;i<8;i++){t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000sda1=t; // 往数据线送最高位scl1=1; //上跳 number=number<<1; //左移一位scl1=0; //下跳}}void shift3(){uchar i,t;number=tab[b];scl3=0;for(i=0;i<8;i++){t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000sda3=t; // 往数据线送最高位scl3=1; //上跳number=number<<1; //左移一位scl3=0; //下跳}}void shift4(){uchar i,t;number=tab[b];scl4=0;for(i=0;i<8;i++){t=number&0x80; //与、判断,0 1, 0x80为二进制数10000000sda4=t; // 往数据线送最高位scl4=1; //上跳number=number<<1; //左移一位scl4=0; //下跳}}//============数码管显示程序======== void dispaly(){b=miao%10;//秒个位shift3();b=miao/10;//秒十位shift3();b=fen%10;shift4();b=fen/10;shift4();b=shi%10;shift4();b=shi/10;shift4();b=week%10;//秒个位shift1();b=day%10;shift1();b=day/10;shift1();b=month%10;shift1();b=month/10;shift1();b=year%10; //年个位shift1();b=(year%100)/10;//年十位shift1();b=(year%1000)/100;//年百位shift1();b=year/1000;shift1();delay1(500);}//===========主程序===============void main(){init();delay1(500);write_8563(0x50,0x59,0x23,0x11,0x01,0x09,0x2008);/ /初始化秒分时,日,星期,月,年delay1(500); //调用延时函数while(1){read_8563(); //读取秒时分dispaly(); //显示秒分时}}你单独能读出时,分,秒说明你在8563的时序读写上没错.能显示,说明显示部分没问题.当然如果你要读年也可以,你再仔细看一下8563的PDF,年的百位千位的读取可以通过07H 月/世纪寄存器来读值计算.也就是最高位第7位,有个标志C,你可以读取它来判断百位和千位的值的.当年寄存器由99变化为00时,C就有变化了.这样你软件上稍作处理就可以了.至于你说同时读取年月日星期时分秒时时小时读不出来,你仔细看一下你的程序:shi=read_add(0x04)&0x3f;//获取小时shi=((shi&0xf0)>>4&0x0f)*10+(shi&0x0f);//BCD码转换成10进制数if(shi>=24){shi=0;}year=read_add(0x08)&0xff;//获取年shi=((year&0xf0)>>4&0x0f)*10+(year&0x0f);//BCD 码转换成10进制数(shi应为year)delay1(100);"shi"这个变量你在读取小时的时候已经用到了,为什么读取年的时候还要用它呢,按程序执行的顺序那你不是把以前读取的小时值给覆盖了吗.所以你应该重新定义一个变量来存放年的10进制值啊.所以你一起读的时候不会出来小时也就正常了.加入按键设置时间秒加一程序如下,miao为秒,key为按键为什么不能实现按键秒加 1if(key2==0){ delay1(10)if(key2==0){ while(!key);//等待松键write_add(0x00, 0x20);//芯片时钟停止运行miao=read_add(0x02)&0x7f;//读取秒数据miao=((miao&0xf0)>>4&0x0f)*10+(mi ao&0x0f);//BCD码转换成10进制数miao=miao++; //秒加一if(miao>=60){miao=0;}write_add(0x02,miao);//写秒数据miao=read_add(0x02)&0x7f;//读取秒数据miao=((miao&0xf0)>>4&0x0f)*10+(mi ao&0x0f);//BCD码转换成10进制数}}write_add(0x00, 0x00);//芯片时钟运行时钟由FPC8563产生,程序如下 display0(); //调用显示程序。

PCF8563驱动(STM32F103系列)

PCF8563驱动(STM32F103系列)
功能描述: 从PCF8563读出全部时间值
*********************************************************************************************************/
* 函数名称: PCF8563_I2C_Start(void)
* 功能描述: PCF8563_I2C启动信号
*********************************************************************************************************/
* 函数名称: PCF8563_I2C_Stop(void)
* 功能描述: PCF8563_I2C停止信号
*********************************************************************************************************/
/*********************************************************************************************
* File:PCF8563.c
* Author:
* Desc:
* History:
*********************************************************************************************/
void Delay_us(int Time)
{
while(Time--);

PCF8563时钟读取芯片程序 STM32

PCF8563时钟读取芯片程序 STM32

//FM24CL16引脚定义
#define PCF_Part GPIOC
#define PCF_SCL GPIO_Pin_9
#define PCF_SDA GPIO_Pin_10
#define SCL_H GPIO_SetBits(PCF_Part,PCF_SCL);
07h 月/世纪 C - - 01~12 BCD 码格式数
08h 年 00~99 BCD 码格式数
09h 分钟报警 AE 00~59 BCD 码格式数
0Ah 小时报警 AE - 00~23 BCD 码格式数
0BH 日报警 AE - 01~31 BCD 码格式数
0CH 星期报警 AE - - - - 0~6
#include "PCF8563.h"
u8 c8563_Store[7]={0x50,0x28,0x15,0x05,0x04,0x02,0x15}; //2015.1.1 1时1分1秒
u8 g8563_Store[7];
extern char rtc_num[6];
////上午时间段、下午
return ack;
}
/********************************************
内部函数.输入数据
出口:B
********************************************/
delay_us(10); //延时
SCL_L; //拉低时钟线
delay_us(10); //延时
delay_us(10); //延时
SDA_L; //产生下降沿
delay_us(10); //延时

PCF8563芯片时序程序

PCF8563芯片时序程序

PCF8563芯片时序程序实时时钟,日历芯片 PCF8563 的驱动方实时时钟,日历芯片 PCF8563 的驱动方法PCF8563是低功耗的CMOS 实时时钟,日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C 总线接口串行传递。

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

它在实际的开发中有着广泛的应用,如移动电话、便携仪器、传真机、电池电源产品等。

其特性如下:1、低工作电流:典型值为0.25μA(VDD=3.0V,Tamb=25?时)。

2、世纪标志3、大工作电压范围:1.0,5.54、低休眠电流;典型值为0.25μA(VDD=3.0V,Tamb=25?)5、 400KHz 的I2C 总线接口(VDD=1.8,5.5V 时)。

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

7、报警和定时器。

8、掉电检测器。

9、内部集成的振荡器电容。

10、片内电源复位功能。

11、I2C 总线从地址:读,0A3H;写,0A2H。

12、开漏中断引脚。

PCF8563的引脚配置图:引脚功能详述如下:名称引脚编号功能描述OSCI 1 振荡器输入OSCO 2 振荡器输出/INT 3 中断输出(开漏;低电平有效)VSS 4 地SDA 5 串行数据I/OSCL 6 串行时钟输入CLKOUT 7 时钟输出 (开漏)VDD 8 正电源PCF8563的功能框图:功能描述:PCF8563有16 个,位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC 提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C 总线接口。

所有16 个寄存器设计成可寻址的8 位并行寄存器,但不是所有位都有用。

前两个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,内存地址02H,08H 用于时钟计数器(秒~年计数器),地址09H,0CH 用于报警寄存器(定义报警条件),地址0DH 控制CLKOUT 管脚的输出频率,地址0EH 和0FH 分别用于定时器控制寄存器和定时器寄存器。

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)

STM32对时钟芯片PCF8563的编程

STM32对时钟芯片PCF8563的编程

这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。

使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。

全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。

我这里使用的IIC的SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h和IIC.C。

只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~Delay_nus(20):这是一个延迟20us的函数。

IIC.h:#ifndef _IIC_H_#define _IIC_H_#include "stm32f10x.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//*#define I2C_Speed 100000#define I2C1_SLAVE_ADDRESS7 0xA0#define I2C_PageSize 256 *///SCL PA0//SDA PA1#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)#define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0)#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)//返回0,和1#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)u8 IIC_ReadByte(void);void IIC_WriteByte(u8 byte);void IIC_WaitAck(void);void IIC_Stop(void);void IIC_Start(void);void IIC_Init(void);void I2C_Ack(void);void I2C_NoAck(void);//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

PCF8563日历时钟芯片原理及应用设计

PCF8563日历时钟芯片原理及应用设计

PCF8563日历时钟芯片原理及应用设计PCF8563是一款实时时钟芯片,用于保存日期、时间和闹钟功能,并在需要时提供准确的时间。

它集成有时钟芯片、电历寄存器和电压降器,可以通过I2C总线进行控制和通信。

下面将详细介绍PCF8563的原理以及应用设计。

一、PCF8563的工作原理二、PCF8563的应用设计1.实时时钟系统:PCF8563广泛应用于各种实时时钟系统,例如电子钟、温度计、保险柜等。

它可以提供准确的时间,并可以进行一定的时钟校准,以确保时间的准确性。

2.日历显示:PCF8563可以与液晶显示器或LED显示器等进行连接,实现日期和时间的显示。

通过读取芯片中的日期和时间寄存器,可以将日期和时间信息显示在屏幕上。

3.闹钟功能:PCF8563内置有闹钟功能,可以设置闹钟时间和日期,并在闹钟触发时发出中断信号。

通过与外部蜂鸣器或报警器等连接,可以实现闹铃功能。

4.计时器功能:PCF8563可以用作计时器,例如测量一些过程的时间。

通过读取和记录时钟寄存器中的时间值,可以实现计时功能,并根据需要进行时钟校准。

5.电池电量监测:PCF8563可以监测电池电量,并在电池电量低于一定阈值时发出警告信号。

这对于需要长时间运行的系统非常有用,可以在电池电量低时及时更换电池。

三、总结PCF8563是一款功能强大的实时时钟芯片,可以提供准确的日期和时间,并具有闹钟和计时功能等。

它可以与各种外部设备进行通信,实现多种应用设计。

无论是日历显示系统还是闹钟功能系统,PCF8563都能够提供稳定和准确的时间支持。

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可用程序
DB 10100100B ;5
DB 00100100B ;6
DB 11101010B ;7
DB 00100000B ;8
DB 10100000B ;9
DB 01100000B ;A
DB 00100101B ;b
DB 00111100B ;C
DB 00100011B ;d
;******拆分子程序 结束***********
;******显示子程序***********
DISPLAY:
MOV DPTR,#TAB
MOV A,LED0
MOVC A,@A+DPTR
setb p2.7
ACALL SHIFT
MOV A,LED1
MOVC A,@A+DPTR
setb p2.4
ACALL SHIFT1
;MOV A,#0FFH
;ACALL SHIFT2
MOV A,LED2
MOVC A,@A+DPTR
setb p2.5
ACALL SHIFT2
MOV A,LED3
MOVC A,@A+DPTR
setb p2.6
ACALL SHIFT3
;SDA BIT P0.2 ;164的数据线
LED0 EQU 40H ;保存秒个位数据
LED1 EQU 41H ;保存秒十位数据
LED2 EQU 42H ;保存分个位数据
LED3 EQU 43H ;保存分十位数据
LED4 EQU 44H ;保存时个位数据
;*********延时子程序********
DELAY:
MOV R1,#03FH

PCF8563时钟代码

PCF8563时钟代码
}
//---------------------------------------------------------------------------
//开始PCF8563T驱动程序
/**--------------------------------------------------------------------------------
I2CSendByte(0xA2);
re=WaitAck();
I2CSendByte(timetype);
WaitAck();
I2CSendByte(value);
WaitAck();
I2CStop();
}
/**--------------------------------------------------------------------------------
PCF8563与AT89C51在5V下完全工作正常,同一块PCF8563与F149在3.7V下,却始终无法读写,PCF8563无应答信号,程序也几乎一样,延时也做了调整,如下:
/**————————————————————
I2C总线驱动程序(用两个普通IO模拟I2C总线)
包括100Khz(T=10us)的标准模式(慢速模式)选择,
调用方式:void I2CStop(void) ﹫2001/07/0 4
函数说明:私有函数,I2C专用
---------------------------------------------------------------------------------*/
void I2CStop(void)

PCF8563 的51汇编程序

PCF8563 的51汇编程序

PCF8563 的51汇编程序PCF8563是Philips公司推出的一款带I2C总线具有极低功耗的多功能时钟/日历芯片,具有四种报警功能和定时功能;内部时钟电路、内部振荡电路、内部低电压检测以两线制I2C总线通信方式,不但使用外围电路简洁,而且增加了芯片的可*性。

PCF8563的SCL为时钟输入端,数据随时钟信号同步输入器件或从器件输出;SDA为双向引脚,用于串行数据的输入输出;INT是中断信号输出端,可通过设置报警寄存器按指定时间在该脚产生报警信号,低电平有效;SDA、SCL、INT均为漏极开路,必须上拉电阻;X1、X2分别为反相放大器的输入、输出端;可在X1端接入32.768kHz的石英晶振,配置成片内振荡器。

本系统PCF8563与89C51接口采用图2所示接口方案。

图2中,在X1、X2端接入32.768kHz的石英晶振,将时钟源配置为片内振荡器。

VDD与地之间国入1个1μF的大电容供电维持时钟芯片,锂电池(3.6V)同时开始工作,给时钟芯片供电,使时钟芯片工作不受影响。

PCF8563与89C51接口采用3根口线,PCF8563的INT脚产生周期为1s的脉冲中断信号给89C51的INT0引脚,89C51产生中断后,通过I2C总线读取PCF8563的基准时间。

PCF8563中共有16个寄存器,其中00~01H为控制寄存器,09~0CH为报警寄存器,0DH为时钟输出寄存器,0E~0FH为定时器功能寄存器,02~08H为秒~年时间寄存器。

表1、表2列出了各寄存器概况及对应的内存地址和功能。

按I2C总线规约,PCF8563的从地址:读地址SLAR为A3H、写地址SLAW为A2H,PCF8563I2C通信实现有字节写/读两种状态。

适用80C51的虚拟I2C总线软件包。

本系统直接调用该I2C总线软件包的数据读写子程序(其中WRNBYT为N字节的子程序,RDNBYT为读取N字节的字节),来实现PCF8563的I2C总线操作。

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做时钟的C程序

PCF8563做时钟的C程序

用PCF8563做实时时钟的C源程序#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit pcf8563_scl=P0^4;sbit pcf8563_sda=P0^3;ucharnum[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0 x37,0x38,0x39}; //数字表sbit clk=P2^0;sbit dio=P2^1;sbit cfd=P2^2; //充放电开关,sbit en=P2^3;sbit rw=P2^4;sbit rs=P2^5;sbit deng=P2^6; //测试灯sbit adcs=P2^7;bit busy=0;uchar sg;uchar sd;uchar fg;uchar fd;uchar mg;uchar md;uchar hou=0;uchar min=0;uchar sec=0;uchar subadd;uchar dat;uchar number;void start_pcf8563();void send_pcf8563_byte();void LcdIni(void);void WrOp(uchar dat);void WrDat(uchar dat);void ChkBusy(void);void display0(void);void display1(void);void stop_pcf8563();void receive_pcf8563_byte();void spit_time();void LcdIni()//初始化LCD{WrOp(0x01);WrOp(0x38);WrOp(0x0c);WrOp(0x06);} void WrOp(uchar dat)//写LCD显示地址{P1 =dat;rs=0;rw=0;en=0;ChkBusy();en=1;}void WrDat(uchar dat)//写LCD显示数据{P1=dat;rs=1;rw=0;en=0;ChkBusy();en=1;}void ChkBusy() //检查LCD是否忙{P1=0xff;rs=0;rw=1;en=0;_nop_();en=1;while(P1&0x80);}void display0() //显示必要的背景{WrOp(0x80);WrDat('T');WrOp(0x81);WrDat(':');WrOp(0x84);WrDat(':');WrOp(0x87);WrDat(':');}void spit_time(){sg=(int)hou/10;sd=(int)hou%10;fg=(int)min/10;fd=(int)min%10;mg=(int)sec/10;md=(int)sec%10;}void display1()//显示时间六位{uchar temp6;uchar temp5;uchar temp4;uchar teMP3;uchar temp2;uchar temp1;WrOp(0x82);temp6=num[sg];WrDat(temp6);WrOp(0x83);temp5=num[sd];WrDat(temp5);WrOp(0x85);temp4=num[fg];WrDat(temp4);WrOp(0x86);teMP3=num[fd];WrDat(teMP3);WrOp(0x88);temp2=num[mg];WrDat(temp2);WrOp(0x89);temp1=num[md];WrDat(temp1);}void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节{uchar aa;pcf8563_scl=0;for(aa=0;aa<8;aa++){if((bb&0x80)==0x80){pcf8563_sda=1;}else{pcf8563_sda=0;}pcf8563_scl=1;pcf8563_scl=0;bb=bb<<1;}_nop_();_nop_();pcf8563_sda=1;pcf8563_scl=1;busy=0;if(pcf8563_sda){busy=1;}else{_nop_();_nop_();pcf8563_scl=0;busy=0;}}void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(subadd);if(!busy){Send_pcf8563_byte(dat);}}stop_pcf8563();}void read_pcf8563() //读当时的时,分,钞{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(0x02);if(!busy){start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();sec=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();min=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();hou=number&0x3f;}}stop_pcf8563();}void receive_pcf8563_byte() //从PCF8563接受一个字节{uchar CC;pcf8563_sda=1;number=0;for(CC=0;cc<8;cc++){number<<=1;pcf8563_scl=0;pcf8563_scl=1;_nop_();_nop_();number= number|pcf8563_sda;}pcf8563_scl=0;_nop_();_nop_();}void start_pcf8563() //开启PCF8563IIC {pcf8563_sda=1;pcf8563_scl=1;pcf8563_sda=0;//SCL为低,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void stop_pcf8563() //关闭PCF8563IIC {pcf8563_sda=0;pcf8563_scl=1;pcf8563_sda=1;//SCL为高,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void main(void){LcdIni(); //初始化屏display0(); //显示必要的背影write_pcf8563(0x02,sec); //写钞write_pcf8563(0x03,min); //写分write_pcf8563(0x04,hou); //写时while(1){read_pcf8563();//读当前时间spit_time(); //切害时间,为显示做准备display1(); //显示当前时间}}。

PCF8563程序

PCF8563程序

} /**输出数据->pcf8563 void writeData(uchar address,uchar mdata) { Start(); writebyte(0xa2); /*写命令*/ writebyte(address); /*写地址*/ writebyte(mdata); /*写数据*/ Stop(); } /*输入数据<-pcf8563 uchar ReadData(uchar address) /*单字节*/ { uchar rdata; Start(); writebyte(0xa2); /*写命令*/ writebyte(address); /*写地址*/ Start(); writebyte(0xa3); /*读命令*/ rdata=Readbyte(); writenoack(); Stop(); return(rdata); } void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/ { uchar i; Start(); writebyte(0xa2); /*写命令*/ writebyte(address); /*写地址*/ Start(); writebyte(0xa3); /*读命令*/ for(i=0;i<count;i++) { buff[i]=Readbyte(); if(i<count-1) WriteACK(); } writenoack(); Stop();
} /*内部函数,读入时间到内部缓冲区 void P8563_Read() { uchar time[7]; ReadData1(0x02,0x07,time); g8563_Store[0]=time[0]&0x7f; /*秒*/ g8563_Store[1]=time[1]&0x7f; /*分*/ g8563_Store[2]=time[2]&0x3f; /*小时*/ g8563_Store[3]=time[4]&0x07; /*星期*/ } /*读入时间到内部缓冲区----外部调用 void P8563_gettime() { P8563_Read(); if(g8563_Store[0]==0) P8563_Read(); /*如果为秒=0,为防止时间变化,再读一次 */ } /**写时间修改值 void P8563_settime() { uchar i; for(i=2;i<=4;i++) { writeData(i,g8563_Store[i-2]); } writeData(6,g8563_Store[3]); } /**P8563的初始化-----外部调用 void P8563_init() { uchar i; if((ReadData(0xa)&0x3f)!=0x8) /*检查是否第一次启 动,是则初始化时间*/ { for(i=0;i<=3;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/ P8563_settime(); writeData(0x0,0x00); writeData(0xa,0x8); /*8:00报警*/ writeData(0x1,0x12); /*报警有效*/

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寄存器被读取,所有的寄存器的内容被冻结。

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),// 因为对于读和写操作来说都必须先写存储器地址。

PCF8563程序

PCF8563程序

#include "8563.h"void main(){// pcf8563_write(); //对时while(1){pcf8563_read(); //读时钟display_8563();}}#ifndef _DINGYI_H__#define _DINGYI_H__#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar xdata wu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar xdata du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, //0/1/2/3/4/50x7d,0x07,0x7f,0x6f,0x77,0x7c, //6/7/8/9/a/b0x39,0x5e,0x79,0x71,0x73,0x38, //c/d/e/f/P/L0x76,0x40,0x80}; //H/-/. void delay_1ms(uint z){uchar i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void delay(uint z){while(z--);}void delay8() //用于IIC{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}#endif#ifndef __8563_H__#define __8563_H__#include "dingyi.h"sbit sda_iic=P3^6;sbit scl_iic=P3^7;uchar time1[7]={0x28,0x37,0x11,0x24,0x05,0x06,0x11}; //秒分时日周月年uchar disp[13];//-------------------------------------------//时钟8563是IIC总线形式//-------------------------------------------void init_iic() //iic初始化{sda_iic=1;scl_iic=1;}void start() //起始信号{scl_iic=1;sda_iic=1;delay8();sda_iic=0;delay8();}void stop() //停止信号{scl_iic=1;sda_iic=0;delay8();sda_iic=1;delay8();}void ack() //应答//数据为低,时钟的一个正跳变{sda_iic=0;scl_iic=0;delay8();scl_iic=1;delay8();scl_iic=0;delay8();}void noack()//非应答//数据为高,时钟的一个正跳变{sda_iic=1;scl_iic=0;delay8();scl_iic=1;delay8();scl_iic=0;delay8();}void write_iic_byte(uchar dat) //写一个字节//高位在前{uchar i;scl_iic=0;for(i=0;i<8;i++){sda_iic=(bit)(dat&0x80);dat<<=1;scl_iic=1;delay8();scl_iic=0;}}uchar read_iic_byte() //读一个字节{uchar i,value;scl_iic=0;delay8();sda_iic=1;//释放总线for(i=0;i<8;i++){scl_iic=1;value<<=1;if(sda_iic)value|=0x01;scl_iic=0;delay8();}return value;}void write_8563(uchar addr,add,dat) //写{init_iic();start();write_iic_byte(addr);ack();write_iic_byte(add);ack();write_iic_byte(dat);ack();stop();}uchar read_8563(uchar addr,add) //读{uchar value;init_iic();start();write_iic_byte(addr-1);ack();write_iic_byte(add);ack();start();write_iic_byte(addr);ack();value=read_iic_byte();noack();stop();return value;}void WRITE_IIC(uchar n,addr,add,uchar *p )//页写{uchar i;init_iic();start();write_iic_byte(addr);//0xa0ack();write_iic_byte(add);ack();for(i=0;i<n;i++){write_iic_byte(*p++);ack();}stop();}uchar READ_IIC(uchar n,addr,add, uchar *p) //连续读{uchar i;init_iic();start();write_iic_byte(addr-1);ack();write_iic_byte(add);ack();start();write_iic_byte(addr);ack();for(i=0;i<n-1;i++){*p=read_iic_byte();p++;ack();}*p=read_iic_byte();noack();stop();return 1;}void pcf8563_write() //写时钟{write_8563(0xa2,0,0); //写//STOP=0;芯片时钟运行WRITE_IIC(7,0xa2,2,time1);}void pcf8563_read() //读时钟{uchar miao,fen,shi,ri,zhou,yue,nian;READ_IIC(7,0xa3,2,time1);miao=time1[0]&0x7f; //注意高位有些不要fen =time1[1]&0x7f;shi =time1[2]&0x3f;ri =time1[3]&0x3f;zhou=time1[4]&0x07;yue =time1[5]&0x1f; //高位C注意nian=time1[6]&0xff;disp[0]=miao%16;disp[1]=miao/16;disp[2]=19;disp[3]=fen%16;disp[4]=fen/16;disp[5]=19;disp[6]=shi%16; disp[7]=shi/16;disp[8]=zhou%16;disp[9]=ri%16; disp[10]=ri/16; disp[11]=19;disp[12]=yue%16; disp[13]=yue/16; disp[14]=19;disp[15]=nian%16; disp[16]=nian/16; }void display_8563() {uchar i;for(i=0;i<8;i++){P2=wu[i];P0=du[disp[i]];delay(50);P0=0;}}#endif。

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

这是用STM32对PCF8563编程的程序、模拟IIC,经验证可用~移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个Word文档里。

使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。

全局变量: u8 PCF8563_Time[7]; 程序初始的值是给PCF8563设置的时间,程序中读取返回的值是PCF8563当时的时间。

我这里使用的IIC的SCL,SDA的引脚分别为PA.0 PA.1,具体看IIC.h 和IIC.C。

只要修改好两个引脚的初始化配套你手上的板子这,就能成功移植~Delay_nus(20):这是一个延迟20us的函数。

IIC.h:#ifndef _IIC_H_#define _IIC_H_#include "stm32f10x.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//*#define I2C_Speed 100000#define I2C1_SLA VE_ADDRESS7 0xA0#define I2C_PageSize 256 *///SCL PA0//SDA PA1#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)#define SCL_L() GPIO_ResetBits(GPIOA, GPIO_Pin_0)#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)//返回0,和1#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)u8 IIC_ReadByte(void);void IIC_WriteByte(u8 byte);void IIC_WaitAck(void);void IIC_Stop(void);void IIC_Start(void);void IIC_Init(void);void I2C_Ack(void);void I2C_NoAck(void);//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

#endifIIC.c:#include "IIC.h"#include "delay.h"/**/void IIC_Init(void){GPIO_InitTypeDef GPIO_InitStructure;/* Configure I2C1 pins: SCL and SDA */RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出,可以在不用改变成输入的情况下读取IO的电平GPIO_Init(GPIOA, &GPIO_InitStructure);SCL_H(); //拉高SDA_H();}void IIC_Start(void){/* SDA_H();SCL_H();delay_nus(20);SDA_L();delay_nus(20);*/SDA_H();SCL_H();delay_nus(20);SDA_L();delay_nus(20);SDA_L();delay_nus(20);}void IIC_Stop(void){SCL_L(); //1delay_nus(20);// 2SDA_L(); // 3. 1,2,3这三行不可缺少delay_nus(20);SCL_H();delay_nus(20);SDA_H();delay_nus(20);}void IIC_WaitAck(void){u16 k;SCL_L();SDA_H();delay_nus(20);SCL_H();k = 0;while((Read_SDA()!= 0) && (k < 60000))k++;delay_nus(20);SCL_L();delay_nus(20);}void IIC_WriteByte(u8 byte){u8 i = 0;for(i = 0; i < 8; i++){SCL_L();delay_nus(20);if(byte & 0x80){SDA_H();}else{SDA_L();}delay_nus(20);SCL_H();delay_nus(20);byte<<=1;}SCL_L();delay_nus(20);}u8 IIC_ReadByte(void){u8 i,ReadByte;SDA_H();for(i = 0; i < 8; i++){ReadByte <<= 1;SCL_L();delay_nus(20);SCL_H();delay_nus(20);if(Read_SDA()){ReadByte |= 0x01;}else{ReadByte &= ~(0x01);}}return ReadByte;}void I2C_Ack(void){SCL_L();delay_nus(20);SDA_L();delay_nus(20);SCL_H();delay_nus(20);SCL_L();delay_nus(20);}void I2C_NoAck(void){SCL_L();delay_nus(20);SDA_H();delay_nus(20);SCL_H();delay_nus(20);SCL_L();delay_nus(20);}PCF8563.h:#ifndef _PCF8563_H_#define _PCF8563_H_#include "IIC.h"#define ReadCode 0xa3#define WriteCode 0xa2void PCF8563_Init(void);u8 PCF8563_ReaDAdress(u8 Adress);void PCF8563_WriteAdress(u8 Adress, u8 DataTX);//取回7个字节的数据:秒,分,时,天,星期,月份,年份。

//全局变量extern u8 PCF8563_Time[7];void PCF8563_ReadTimes(void);//在CLKOUT上定时1S输出一个下降沿脉冲void PCF8563_CLKOUT_1s(void);#endifPCF8563.c:#include "PCF8563.h"//全局变量,程序初始的值就是要初始化的时间,//用途:1:初始化时间。

2:读取返回时间// 秒,分,时,天,星期,月份,年份。

u8 PCF8563_Time[7] = {50, 59, 23, 31, 6, 12, 12};void PCF8563_Init(void){IIC_Init();//十进制码转换成BCD码PCF8563_Time[0] = ((PCF8563_Time[0]/10) << 4) | (PCF8563_Time[0]%10);PCF8563_Time[1] = ((PCF8563_Time[1]/10) << 4) | (PCF8563_Time[1]%10);PCF8563_Time[2] = ((PCF8563_Time[2]/10) << 4) | (PCF8563_Time[2]%10);PCF8563_Time[3] = ((PCF8563_Time[3]/10) << 4) | (PCF8563_Time[3]%10);// PCF8563_Time[4] = ((PCF8563_Time[4]/10 << 4)) | (PCF8563_Time[4]%10); //星期不用转换PCF8563_Time[5] = ((PCF8563_Time[5]/10 << 4)) | (PCF8563_Time[5]%10);PCF8563_Time[6] = ((PCF8563_Time[6]/10 << 4)) | (PCF8563_Time[6]%10);PCF8563_CLKOUT_1s();PCF8563_WriteAdress(0x00, 0x20); //禁止RTC source clock//初始化PCF8563的时间PCF8563_WriteAdress(0x02, PCF8563_Time[0]);PCF8563_WriteAdress(0x03, PCF8563_Time[1]);PCF8563_WriteAdress(0x04, PCF8563_Time[2]);PCF8563_WriteAdress(0x05, PCF8563_Time[3]);PCF8563_WriteAdress(0x06, PCF8563_Time[4]);PCF8563_WriteAdress(0x07, PCF8563_Time[5]);PCF8563_WriteAdress(0x08, PCF8563_Time[6]);PCF8563_WriteAdress(0x00, 0x00); //Enable RTC sorce clock}u8 PCF8563_ReaDAdress(u8 Adress){u8 ReadData;IIC_Start();IIC_WriteByte(0xa2);IIC_WaitAck();IIC_WriteByte(Adress);IIC_WaitAck();IIC_Start();IIC_WriteByte(0xa3);IIC_WaitAck();ReadData = IIC_ReadByte();IIC_Stop();return ReadData;}void PCF8563_WriteAdress(u8 Adress,u8 DataTX)IIC_Start();IIC_WriteByte(0xa2);IIC_WaitAck();IIC_WriteByte(Adress);IIC_WaitAck();IIC_WriteByte(DataTX);IIC_WaitAck();IIC_Stop();}//取回八个字节的数据:秒,分,时,天,星期,月份,年份。

相关文档
最新文档