📄 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 + -