我的PCF8563T读回来的数据不对~~请高人指教。
我的PCF8563T读会来的数据不对~~(间歇性的)时间能正常显示,但是 月日时会周期性的出现十位+4,也就象今天2010年12月7日他一会儿会变成2010年62月47日,过一会就回复正常。
还有就是时。
年分秒都没出先过这样的问题。
麻烦大家帮我看下。程序如下:
#include"PCF8365T.h"
/*_______________________________________
名 称:延时
说 明:
________________________________________*/
void Delay_US(void)
{
;;
}
/*_______________________________________
名 称:总线启动
说 明:串行时钟控制线在高电平期间数据线
从H到L的跳变启动总线
________________________________________*/
void Start_IIC(void)
{
SDA =1;
SCL=1;
Delay_US();
SDA=0;
Delay_US();
}
/*_______________________________________
名 称:总线停止
说 明:串行时钟控制线在高电平期间数据线
从L到H的跳变启动总线
________________________________________*/
void Stop_IIC(void) //停止信号
{
SDA=0;
SCL=1;
Delay_US();
SDA=1;
Delay_US();
}
/*_______________________________________
名 称:应答
说 明:
________________________________________*/
void Response_IIC(void)
{
Uchari = 0;
SCL=1;
Delay_US();
while((SDA == 1) && (i < 100)) //如果数据线没有被设备拉低,表示设备未应答,等待一段时间。
{
i++; //如果数据线被设备拉低则直接推出。
}
SCL=0;
Delay_US();
}
/*_______________________________________
名 称:写数据
说 明:
________________________________________*/
void Write_Byte(Uchar Value)
{
Uchari = 0;
for (i = 0; i < 8;i++)
{
SCL=0; //时钟为低的时候数据有效
SDA=Value & 0x80;
Delay_US();
SCL=1;
Delay_US();
Value <<= 1;
}
SCL=0;
Delay_US();
SDA=1; //释放总线
Delay_US();
}
/*_______________________________________
名 称:读数据
说 明:
________________________________________*/
Uchar Read_IIC(void)
{
UcharTemp = 0;
Uchari = 0;
SCL = 0;
Delay_US();
for (i = 0;i < 8;i++)
{
SCL=1; //SCL高电平期间读数据
Delay_US();
if (SDA)
{
Temp |= 0x80 >> i;
}
SCL=0;
Delay_US();
}
return Temp;
}
/*_______________________________________
名 称:写一数据到PCF8365T
说 明:
________________________________________*/
void Write_PCF8365T(Uchar Address, Uchar Value)
{
Start_IIC(); //起动总线
Write_Byte(0xa2); //器件地址,最低位0为写操作
Response_IIC(); //等待应答
Write_Byte(Address); //写单元地址
Response_IIC(); //等待应答
Write_Byte(Value); //写数据
Response_IIC(); //等待应答
Stop_IIC(); //停止总线
}
/*_______________________________________
名 称:读数据
说 明:
________________________________________*/
Uchar Read_PCF8365T(Uchar AddRess)
{
UcharTemp = 0;
Start_IIC(); //启动总线
Write_Byte(0xA2); //器件地址,最低位0为写操作
Response_IIC(); //等待应答
Write_Byte(AddRess); //单元地址
Response_IIC(); //等待应答
Start_IIC(); //开始总线
Write_Byte(0xA3); //AT24C02地址,最低位1读操作
Response_IIC(); //等待应答
Temp=Read_IIC(); //读数据
//读完数据,无应答
SCL = 1; //主机发送给从机
Delay_US();
SDA = 1;
SCL = 0;
Delay_US();
Stop_IIC(); //停止总线
Temp = ((Temp / 16) * 10) + (Temp % 16);
return Temp; //返回数据值
}
void PCF8365T_Init(void)
{
Write_PCF8365T(0x08,0x10); //10年
Write_PCF8365T(0x07,0x12); //12月
Write_PCF8365T(0x06,0x01); //星期一
Write_PCF8365T(0x05,0x07); //06日
Write_PCF8365T(0x04,0x20); //14点
Write_PCF8365T(0x03,0x14); //24分
Write_PCF8365T(0x02,0x00); //00秒
Write_PCF8365T(0x00,0x10); //普通模式、芯片时钟运行、电源复位功能失效
}
#include"AT89X52.h"
#include"PCF8365T.h"
#include"FM12232.h"
Uchar code Tab[]=
{
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
};
Uchar code Hz[]= {"年月日【】:"};
void main(void)
{
FM12232_Init();
// PCF8365T_Init();
while(1)
{
SET_AddRess(0,0);
FM12232_Send_Byte('2',1);
FM12232_Send_Byte('0',1);
SET_AddRess(0,1);
FM12232_Send_Byte(Tab,1);
FM12232_Send_Byte(Tab,1);
SET_AddRess(0,2);
FM12232_Send_Byte(Hz,1);
FM12232_Send_Byte(Hz,1);
SET_AddRess(0,3);
FM12232_Send_Byte(Tab,1);
FM12232_Send_Byte(Tab,1);
SET_AddRess(0,4);
FM12232_Send_Byte(Hz,1);
FM12232_Send_Byte(Hz,1);
SET_AddRess(0,5);
FM12232_Send_Byte(Tab,1);
FM12232_Send_Byte(Tab,1);
SET_AddRess(0,6);
FM12232_Send_Byte(Hz,1);
FM12232_Send_Byte(Hz,1);
SET_AddRess(1,0);
FM12232_Send_Byte(Hz,1);
FM12232_Send_Byte(Hz,1);
SET_AddRess(1,1);
FM12232_Send_Byte(Tab,1);
FM12232_Send_Byte(Tab,1);
SET_AddRess(1,2);
FM12232_Send_Byte(Hz,1);
FM12232_Send_Byte(Tab,1);
SET_AddRess(1,3);
FM12232_Send_Byte(Tab,1);
FM12232_Send_Byte(Hz,1);
SET_AddRess(1,4);
FM12232_Send_Byte(Tab,1);
FM12232_Send_Byte(Tab,1);
SET_AddRess(1,5);
FM12232_Send_Byte(Hz,1);
FM12232_Send_Byte(Hz,1);
}
} 唉。怎么没人回答呢 呵呵,老问题,延时程序太短了,你的iic通讯速率太高了 8563读数据的时候要把无关位屏蔽掉,比如读1字节时间,当里面只有5字节有效位的时候最好读出来的时候和某个值 与运算 屏蔽掉那几个不用的位,我原来以为无用位是没影响的,实际上用的时候那几个位会不停的变化,害我也折腾好久! 回复【3楼】jiaowoxiaolu
-----------------------------------------------------------------------
thanks. 咨询下楼主,你的8365程序调通了吗?
我现在也在写8365的程序,只是CPU用的不一样,能不能学习下。 {:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:} 谢谢4l了,真的可以,还以为什么问题。手册上有一个注释,Bits labeled as N should always be written with logic 0 真心感谢4楼!以为是程序或者时序有问题导致读出错误数据呢,没想到无关位还不是固定为0的
页:
[1]