tianzhiying 发表于 2012-1-4 22:19:03

51单片机+PCF8563的问题

我用51单片机接8563
数据写不进去
读出来的都是ff
好像芯片都不工作的样子
下面是电路图
http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_710330F5BLK1.jpg
PCF8563电路图 (原文件名:PCF8563.jpg)
有没有人出现过同样问题,求解答。
还有,晶振那里需要接电容吗

hepday 发表于 2012-1-5 09:39:37

#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);   //普通模式、芯片时钟运行、电源复位功能失效

}

Flyback 发表于 2012-1-5 09:47:55

那个CLKO默认是有脉冲输出的,你可以测量一下,具体频率看手册吧

tianzhiying 发表于 2012-1-5 10:34:05

谢谢楼上各位
问题已经解决了
是我在应答ack那里没写好
程序改了之后就正常了

wang2028513 发表于 2012-1-6 09:39:17

感谢楼主

my_friend 发表于 2012-1-8 10:34:22

我记得那个芯片可以产生可变频率!
现在都用DS1302,比较便宜!
还有一款ds12c887里面集成电池!不过好像是并口

易冰 发表于 2012-5-3 10:16:27

楼主,能不能把您的8365的程序给我一份呢?

lee_20121202 发表于 2013-4-3 22:17:15

晶振那可以接一个104到地的

yjgg 发表于 2013-4-4 07:06:49

lee_20121202 发表于 2013-4-3 22:17
晶振那可以接一个104到地的

104的太大了

WangF 发表于 2013-4-4 18:37:06

看看!!!

lee_20121202 发表于 2013-4-5 22:49:39

yjgg 发表于 2013-4-4 07:06 static/image/common/back.gif
104的太大了

不好意思,记错了,是15皮
页: [1]
查看完整版本: 51单片机+PCF8563的问题