PCF8563时钟芯片驱动详解1概述PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。当然作为时钟芯片,PCF8563亦解决了2000年问题。因而,PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。2原理图38563源代码//******************************************************//define//*****************************************************#definePCF8563_ADDR0xa2//PCF8563设备地址#definePCF8563_ENABLE0x00//设置#definePCF8563_SUBADDR0x02//时间地址#definePCF8563_NUMB0x07//时间个数#definePCF8563_LOOPTIME0x02//循环次数#definePCF8563_SECMASK0x7f//second#definePCF8563_MINMASK0x7f//minute#definePCF8563_HRMASK0x3f//hour#definePCF8563_DAYMASK0x3f//day#definePCF8563_WKMASK0x07//week#definePCF8563_MOMASK0x1f//month#definePCF8563_YRMASK0xff//year/*voidDELAY_US(Uint16i){Uint16m,n;for(m=0;mi;m++){for(n=0;n5;n++)SCL_HSDA_HCOUT_HVCC15pFC200.1μFC2110μFC22BT13.0VBatteryD181N4148D171N4148OSCI1OSCO2INT3VSS4SDA5SCL6COUT7VCC8U16PCF856312Y132.768{_nop_();}}}*//**********************************************************函数名称:voidDELAY_MS(Uint16i)**功能描述:延时函数**输入:延时毫秒数**输出:无********************************************************///延时函数单位msvoidDELAY_MS(Uint16i){Uint16m,n;for(m=0;mi;m++){for(n=0;n1000;n++){_nop_();}}}/**********************************************************函数名称:InitCrt()**功能描述:SD2405的初始化**输入:无**输出:无********************************************************/voidInitCrt(){//设备地址I2cDeviceAdd=PCF8563_ADDR;}/**********************************************************函数名称:CrtGetDateTime(structSYSTEM_TIME*Time)**功能描述:读取时间**说明:将从PCF8563中读取的时间放入Time指向的结构中**输入:无**输出:无********************************************************/voidCrtGetDateTime(structSYSTEM_TIME*Time){Uint8buf[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(structSYSTEM_TIME*Time)**功能描述:设置时间**说明:将Time指向的结构中日期时间参数设置到sd24.5中**输入:无**输出:无********************************************************/voidCrtSetDateTime(structSYSTEM_TIME*Time){Uint8buf[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//-----------------------------------------------------------------------------#includec8051f020.h//SFRdeclarations#includestdio.h#includeking.h#includeDYSJ.h#includeI2C.H#defineSMB_FREQUENCY10000L//TargetSCLclockrate/********************************************************************************函数名称:voidSPI0_Init()**功能描述:I2C初始化程序**说明:1.置下降沿有效2.置工作时钟2MHz3.**输入:无**输出:无*******************************************************************************/voidI2C_Init(){SMB0CN=0x44;//EnableSMBuswithACKsonacknowledgecycleSMB0CR=-80;//257-(SYSCLK/(2*SMB_FREQUENCY));EIE1|=2;//SMBusinterruptenable//EA=1;//GlobalinterruptenableI2cSM_BUSY=0;//FreeSMBusforfirsttransfer.}/********************************************************************************函数名称:voidSM_Send(Uint8byte_address,Uint8*SendBuf,Uint8count)**功能描述:I2C写入程序**说明:1.等待空闲2.写入数据3.等待结束**输入:地址byte_address、写入数据缓冲区*SendBuf、数量count**输出:无*******************************************************************************/voidSM_Send(Uint8byte_address,Uint8*SendBuf,Uint8count){ET0=0;//禁止中断ET2=0;//禁止中断while(I2cSM_BUSY);//等待空闲I2cSM_BUSY=1;//置忙SMB0CN=0x44;//SMBusenabled,ACKonacknowledgecycleI2cSendCount=count;//置写入数量I2cRecCount=0;//读出数量清零I2cSendDPTR=SendBuf;//SMBusenabled,ACKonacknowledgecycleI2CWRITE;//Chipselect+WRITEI2cMemAdd=byte_address;STO=0;STA=1;//启动传输FeedWatchdog();while(I2cSM_BUSY);//等待空闲ET0=1;//允许中断ET2=1;//允许中断}/********************************************************************************函数名称:voidSM_Receive(Uint8byte_address,Uint8*ReadBuf,Uint8count)**功能描述:I2C读取程序**说明:1.等待空闲2.置地址3.读取数据3.等待结束**输入:地址byte_address、读取数据缓冲区*SendBuf、数量count**输出:无*******************************************************************************/voidSM_Receive(Uint8byte_address,Uint8*ReadBuf,Uint8count){ET0=0;//禁止中断ET2=0;//禁止中断while(I2cSM_BUSY);//等待空闲I2cSM_BUSY=1;//置忙SMB0CN=0x44;//SMBusenabled,ACKonacknowledgecycleI2cSendCount=0;//置写入数量I2CWRITE;//Chipselect+WRITEI2cMemAdd=byte_address;//值地址偏移I2cRecCount=count;//要接收的数据个数I2cRecDPTR=ReadBuf;//指向要接收的数据区STO=0;STA=1;//StarttransferFeedWatchdog();while(I2cSM_BUSY);//等待空闲ET0=1;//允许中断ET2=1;//允许中断}/********************************************************************************函数名称:voidSMBUS_ISR(void)