电路设计,软件开发,专业项目团队承接电子产品开发!


ISPRO下载型编程器
火爆销售中

RS232/TTL转换器
全IC串口窃电

RS232/TTL转换线
全IC串口窃电

ByteBlasterMV Cable
CPLD/FPGA并口下载线

ByteBlaster II Cable ISPRO下载型编程器
支持S51/AVR/PIC
超级51开发板套件
前卫实用超值

PC/MCU/CPLD
三合一学习套件

全新万年历方案
AVR单片机开发板
 

Min51单片机仿真机
迷你型

ARM7开发板
仅售260元!
 

RS-232/RS-485双向接口电平转换器  

51单片机升级STM32
火爆销售中
MPLAB-ICD2
火爆销售中
LED51开发板
玩具又名图文显示棒

面板模块/开发板
经济危机明智决择

       

GSM MODEM GSM猫

SMS短信模块 工业级/全自动
火爆销售中

大功率数传电台

高速数传电台

您当前位置:电子技术资料 -> 外围驱动 -> 时钟 ->

祝您阅读愉快!

ISPRO下载型编程器

RS232 TO TTL转换器
↑↑本文相关产品介绍↑↑

PCF8563实时时钟IC驱动代码


类别:技术文章
来源:未知
作者:未知
关键字:PCF8563
加入日期:2010-8-3

//一秒从8563CLK接到51,避免读的麻烦。
//中国电子网 www.EC66.com
/*PCF8563实时时钟IC*/
#include <reg52.h>
#include <intrins.h>

#include <Timer.h>
#include <Const.h>

#include <BcdMath.h>
#include <absacc.h>

sbit I2C_SDA=P1^0;
sbit I2C_SCK=P1^1;

unsigned char idata g8563_Store[6];
/*时间默认值*/
unsigned char code c8563_Store[]={0,0x22,0x21,0x7,0x10,0x01}; /*01-
10-07 21:22:00*/

/********************************************
内部函数,延时1uS
********************************************/
void In1uSDelay()
{
_nop_();
}

/********************************************
内部函数,I2C开始
********************************************/
void InI2C_Start()
{
I2C_SDA=1;
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SDA=0;
In1uSDelay();
I2C_SCK=0;
}

/********************************************
内部函数,I2C结束
********************************************/
void InI2C_Stop()
{
I2C_SCK=1;
In1uSDelay();
In1uSDelay();
In1uSDelay();
In1uSDelay();
I2C_SDA=0;
In1uSDelay();
I2C_SDA=1;
In1uSDelay();
}

/********************************************
内部函数,输入ACK
********************************************/
void InI2C_ReadACK()
{
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SCK=0;
In1uSDelay();
}

/********************************************
内部函数,输出ACK=1
********************************************/
void InI2C_WriteACK()
{
In1uSDelay();
I2C_SCK=1;
In1uSDelay();
I2C_SDA=1;
In1uSDelay();
I2C_SCK=0;
In1uSDelay();
}

/********************************************
内部函数.输出数据字节
入口:B=数据
********************************************/
void InI2C_Write()
{
unsigned char i=8;
do{
ACC=B;
I2C_SDA=ACC7;
ACC+=ACC;
B=ACC;
_nop_();
_nop_();
I2C_SCK=1;
In1uSDelay();
I2C_SCK=0;
}while(--i);
}

/********************************************
内部函数.输入数据
出口:B
********************************************/
void InI2C_Read()
{
unsigned char i=8;
do{
I2C_SCK=1;
ACC=B;
ACC+=ACC;
ACC0=I2C_SDA;
B=ACC;
I2C_SCK=0;
In1uSDelay();
}while(--i);
}

/********************************************
输出数据->pcf8563
********************************************/
void I2C_WriteData(unsigned char mLocation,unsigned char mData)
{
InI2C_Start();

B=0xa2;
InI2C_Write(); /*写命令*/
InI2C_ReadACK();

B=mLocation;
InI2C_Write(); /*写地址*/
InI2C_ReadACK();

B=mData;
InI2C_Write(); /*写数据*/
InI2C_ReadACK();

InI2C_Stop();
}

/********************************************
输入数据<-pcf8563
********************************************/
unsigned char I2C_ReadData(unsigned char mLocation)
{
InI2C_Start();

B=0xa2;
InI2C_Write(); /*写命令,设置地址*/
InI2C_ReadACK();

B=mLocation;
InI2C_Write(); /*写地址*/
InI2C_ReadACK();

InI2C_Start();

B=0xa3;
InI2C_Write(); /*读命令*/

_nop_();
_nop_();
InI2C_ReadACK();
_nop_();
_nop_();

InI2C_Read();
InI2C_WriteACK();

InI2C_Stop();
return(B);
}

/********************************************
天以后是取8563天以后的数据
********************************************/
void P8563_ReadDay()
{
g8563_Store[DAY]=I2C_ReadData(5)&0x3f;
g8563_Store[MONTH]=I2C_ReadData(7)&0x1f;
g8563_Store[YEAR]=I2C_ReadData(8);
}

/********************************************
内部函数,读入时间到内部缓冲区
********************************************/
void InP8563_Read()
{
g8563_Store[SECOND]=I2C_ReadData(2)&0x7f;
g8563_Store[MINUTE]=I2C_ReadData(3)&0x7f;
g8563_Store[HOUR]=I2C_ReadData(4)&0x3f;
P8563_ReadDay();
}

/********************************************
读入时间到内部缓冲区
********************************************/
void P8563_ReadTime()
{
InP8563_Read();
if(g8563_Store[0]==0){
InP8563_Read(); /*如果为秒=0,为防止时间变化,再读一次*/
}
}

/********************************************
写时间修改值
********************************************/
void P8563_WriteTime()
{
unsigned char i;

for(i=0;i<4;i++){
I2C_WriteData(i+2,g8563_Store[i]);
}
for(i=4;i<6;i++){
I2C_WriteData(i+3,g8563_Store[i]);
}
}

/********************************************
P8563的初始化,将CLOOUT设置为1HZ,检查是否第一次启动,是则初始化时间
********************************************/
void P8563_Init()
{
unsigned char i;

I2C_WriteData(0xd,0x83);

if((I2C_ReadData(0xc)&0x7)!=0x5){
for(i=0;i<6;i++)g8563_Store[i]=c8563_Store[i]; /*初始化*/
P8563_WriteTime();
I2C_WriteData(0xc,0x5);
}
}

您可能还会关注的相关技术资料:

中国电子网
www.EC66.com
QQ:34740080 EMAIL:iloveaoe@163.com
最佳浏览:1024*768
Copyright (C) 2001-2010 EC66.COM All Rights Reserved
Aoe/帝国 制作维护
粤ICP备18061901号