搜索
bottom↓
回复: 8

我的PCF8563T读回来的数据不对~~请高人指教。

[复制链接]

出0入0汤圆

发表于 2010-12-7 22:36:27 | 显示全部楼层 |阅读模式
我的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)
{
                Uchar  i = 0;
                SCL  =  1;
                Delay_US();
                while((SDA == 1) && (i < 100))    //如果数据线没有被设备拉低,表示设备未应答,等待一段时间。
                        {
                                        i++;                  //如果数据线被设备拉低则直接推出。
                        }
                SCL  =  0;
                Delay_US();
}

/*_______________________________________
名   称:写数据
说   明:
________________________________________*/
void        Write_Byte(Uchar Value)
{
                Uchar  i = 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)
{
                Uchar  Temp = 0;
                Uchar  i    = 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)
{
                Uchar  Temp = 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[Read_PCF8365T(0x08) / 10],1);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x08) % 10],1);
                                        SET_AddRess(0,2);
                                        FM12232_Send_Byte(Hz[0],1);
                                        FM12232_Send_Byte(Hz[1],1);
                                        SET_AddRess(0,3);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x07) / 10],1);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x07) % 10],1);
                                        SET_AddRess(0,4);
                                        FM12232_Send_Byte(Hz[2],1);
                                        FM12232_Send_Byte(Hz[3],1);
                                        SET_AddRess(0,5);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x05) / 10],1);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x05) % 10],1);
                                        SET_AddRess(0,6);
                                        FM12232_Send_Byte(Hz[4],1);
                                        FM12232_Send_Byte(Hz[5],1);


                                        SET_AddRess(1,0);
                                        FM12232_Send_Byte(Hz[6],1);
                                        FM12232_Send_Byte(Hz[7],1);
                                        SET_AddRess(1,1);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x04) / 10],1);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x04) % 10],1);
                                        SET_AddRess(1,2);
                                        FM12232_Send_Byte(Hz[10],1);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x03) / 10],1);
                                        SET_AddRess(1,3);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x03) % 10],1);
                                        FM12232_Send_Byte(Hz[10],1);
                                        SET_AddRess(1,4);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x02) / 10],1);
                                        FM12232_Send_Byte(Tab[Read_PCF8365T(0x02) % 10],1);
                                        SET_AddRess(1,5);
                                        FM12232_Send_Byte(Hz[8],1);
                                        FM12232_Send_Byte(Hz[9],1);
                                       
                        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-12-8 09:06:45 | 显示全部楼层
唉。怎么没人回答呢

出0入0汤圆

发表于 2010-12-8 09:16:12 | 显示全部楼层
呵呵,老问题,延时程序太短了,你的iic通讯速率太高了

出0入22汤圆

发表于 2010-12-8 09:35:59 | 显示全部楼层
8563读数据的时候要把无关位屏蔽掉,比如读1字节时间,当里面只有5字节有效位的时候最好读出来的时候和某个值 与运算 屏蔽掉那几个不用的位,我原来以为无用位是没影响的,实际上用的时候那几个位会不停的变化,害我也折腾好久!

出0入0汤圆

 楼主| 发表于 2010-12-8 10:41:22 | 显示全部楼层
回复【3楼】jiaowoxiaolu
-----------------------------------------------------------------------

thanks.

出0入0汤圆

发表于 2012-5-3 10:12:50 | 显示全部楼层
咨询下楼主,你的8365程序调通了吗?
我现在也在写8365的程序,只是CPU用的不一样,能不能学习下。

出0入0汤圆

发表于 2013-8-25 17:45:49 | 显示全部楼层

出0入0汤圆

发表于 2013-9-22 15:57:48 | 显示全部楼层
谢谢4l了,真的可以,还以为什么问题。手册上有一个注释,Bits labeled as N should always be written with logic 0

出0入0汤圆

发表于 2014-6-24 20:06:11 | 显示全部楼层
真心感谢4楼!以为是程序或者时序有问题导致读出错误数据呢,没想到无关位还不是固定为0的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表