51单片机+PCF8563的问题
我用51单片机接8563数据写不进去
读出来的都是ff
好像芯片都不工作的样子
下面是电路图
http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_710330F5BLK1.jpg
PCF8563电路图 (原文件名:PCF8563.jpg)
有没有人出现过同样问题,求解答。
还有,晶振那里需要接电容吗 #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(0x0f,0x00);
Write_PCF8365T(0x08,0x11); //10年
Write_PCF8365T(0x07,0x02); //12月
Write_PCF8365T(0x06,0x02); //星期一
Write_PCF8365T(0x05,0x01); //06日
Write_PCF8365T(0x04,0x20); //14点
Write_PCF8365T(0x03,0x10); //24分
Write_PCF8365T(0x01,0x00);
Write_PCF8365T(0x02,0x00); //00秒
Write_PCF8365T(0x01,0x00);
Write_PCF8365T(0x00,0x00); //普通模式、芯片时钟运行、电源复位功能失效
} 那个CLKO默认是有脉冲输出的,你可以测量一下,具体频率看手册吧 谢谢楼上各位
问题已经解决了
是我在应答ack那里没写好
程序改了之后就正常了 感谢楼主 我记得那个芯片可以产生可变频率!
现在都用DS1302,比较便宜!
还有一款ds12c887里面集成电池!不过好像是并口 楼主,能不能把您的8365的程序给我一份呢? 晶振那可以接一个104到地的 lee_20121202 发表于 2013-4-3 22:17
晶振那可以接一个104到地的
104的太大了 看看!!! yjgg 发表于 2013-4-4 07:06 static/image/common/back.gif
104的太大了
不好意思,记错了,是15皮
页:
[1]