⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8563-

📁 里面包括很多的驱动程序的
💻
字号:
用【 小 | 中 | 大 】字体浏览 
初学者:怎样调试PCF8563? [ttl.mos] [12次] 01-12-12 下午 04:00:07
新作的板子,用“版主的程序”从时钟PCF8563读不出时间,从串口发回的时间数为7个
0x01,各位估计问题在哪里?我从哪里入手。 

用我的试试。俺的一秒从8563CLK接到51,避免读的麻烦。 [《农民运动讲习所》现任所长] [25次] 01-12-12 下午 05:38:40 
/*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);
    }
}


再麻烦所长!几个头文件在那里找? [ttl.mos] [4次] 01-12-13 上午 10:58:05 
所长:以下几个头文件怎么写?
#include <Timer.h>
#include <Const.h>
#include <BcdMath.h>
一并发给在下,不胜感激! 

cut .h [《农民运动讲习所》现任所长] [0次] 01-12-13 下午 12:07:21 
 

 
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2002 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -