求助:PCF8563无法读出数据

2020-01-13 18:27发布

本帖最后由 墨逸、 于 2019-3-8 15:09 编辑

如题,读出的数据一直是 2045-25-45  45:45:45
板子上的参数和原理图完全一致

  1. #include "mcu.h"

  2. u8        Time_data[7]={0X00,0X44,0X13,0X08,0X05,0X03,0X19};//初始化数组

  3. //===================================================
  4. void iic_delay(unsigned int t)
  5. {
  6.    unsigned int a;

  7.    for(a=1;a<=t;a++);       
  8.              
  9. }       
  10.                   
  11. //===================================================
  12. void iic_clock(void)
  13. {
  14.    iic_scl=0;
  15.    iic_delay(3);                 
  16.    iic_scl=1;
  17.    iic_delay(3);
  18.    iic_scl=0;
  19.    iic_delay(3);
  20. }

  21. //===================================================
  22. // void waitask()
  23. // {
  24. //    iic_sda=1;
  25. //    iic_scl=1;
  26. //    iic_delay(3);
  27. //    wait:
  28. //    if(iic_sda==1)goto wait;
  29. //    iic_scl=0;
  30. // }

  31. //===================================================
  32. // void noask()
  33. // {
  34. //    iic_sda=1;                //无应答产生
  35. //    iic_clock();
  36. // }

  37. //===================================================
  38. //启动器件子程序
  39. //*******************************************/
  40. void start_iic()
  41. {     
  42.     iic_sda=1;
  43.         iic_scl=1;
  44.         iic_sda=0;
  45.     iic_delay(3);
  46.         iic_scl=0;
  47.         iic_delay(3);
  48.   }
  49. ///*******************************************
  50. //停止器件子程序
  51. //*******************************************/
  52. void stop_iic()
  53. {  
  54.     iic_scl=0;
  55.     iic_sda=0;       
  56.         iic_scl=1;
  57.         iic_delay(3);
  58.         iic_sda=1;           
  59. }
  60. ///*******************************************
  61. //主机发送一个字节数据
  62. //*******************************************/
  63. void iic_SendByte(unsigned char bytedata)
  64. {  
  65.    unsigned char i;
  66.       
  67.    for(i=0;i<8;i++)
  68.    {                     
  69.                 if(bytedata & 0x80)  iic_sda=1;
  70.                 else                 iic_sda=0;
  71.                 iic_clock();
  72.                 bytedata<<=1;
  73.          }   
  74. }
  75. ///**************************************************
  76. //主机接收一个字节数据子程序
  77. //***************************************************/
  78. unsigned char iic_ReceiveByte(void)
  79. {
  80.    char i,bytedata=0;

  81.    iic_sda=1;
  82.    for(i=0;i<8;i++)
  83.       {                    
  84.                 bytedata<<=1;
  85.                 if(iic_sda) bytedata |= 0x01;
  86.                 iic_clock();                           
  87.                 }                        
  88.    return bytedata;
  89. }

  90. //================================================================
  91. void Wrbyte(unsigned char dat)//写一个字节
  92. {
  93.   iic_SendByte(dat);
  94.   iic_sda=1;   //写完一个字节后释放总线
  95.   iic_scl=1;   //加上脉冲, 相当于应答信号
  96.   iic_scl=0;
  97. }
  98. //================================================================
  99. unsigned char Rebyte(void)           //读一个字节
  100. {
  101.    unsigned char a;

  102.    a=iic_ReceiveByte();
  103.    iic_sda=1;           //写完一个字节后释放总线
  104.    iic_scl=0;           //加上脉冲, 相当于应答信号
  105.    return(a);
  106. }


  107. //==========读取时间==========
  108. void Read_8563(uchar * Time_tmp)
  109. {
  110.         uchar i;

  111.         for(i=0;i<7;i++)
  112.         {
  113.                 start_iic();
  114.                 Wrbyte(Wr_8563);   //写操作器件地址  
  115.                 Wrbyte(i+0x02);    //写入单元地址  
  116.                 start_iic();
  117.                 Wrbyte(Re_8563);   //读操作器件地址  
  118.                 switch(i)
  119.                 {
  120.                  case 0: Time_tmp[0]=(Rebyte())&0x7f;break;//获取秒数据
  121.                  case 1: Time_tmp[1]=(Rebyte())&0x7f;break;//获取分钟
  122.                  case 2: Time_tmp[2]=(Rebyte())&0x3f;break;//获取小时
  123.                  case 3: Time_tmp[3]=(Rebyte())&0x3f;break;//获取日
  124.                  case 4: Time_tmp[4]=(Rebyte())&0x07;if(Time_tmp[4]==0)Time_tmp[4]=7;break;//获取星期
  125.                  case 5: Time_tmp[5]=(Rebyte())&0x1f;break;//获取月
  126.                  case 6: Time_tmp[6]=(Rebyte())&0x7f;break;//获取年                          
  127.                  default:break;       
  128.                 }
  129.                 stop_iic();
  130.         }
  131.         for(i=0;i<7;i++)
  132.                 Time_tmp[i]=Time_tmp[i]/16*10+Time_tmp[i]%16;//BCD码转换成16进制
  133. }

  134. //==================================================================
  135. void set_8563(uchar * Time_tmp)
  136. {
  137.         unsigned char i;
  138.         for(i=0;i<7;i++)
  139.         {
  140.                 Time_tmp[i]=Time_tmp[i]/10*16+Time_tmp[i]%10;
  141.                 start_iic();
  142.                 Wrbyte(Wr_8563);//选择器件
  143.                 Wrbyte(0x02+i);//选择单元地址
  144.                 Wrbyte(Time_tmp[i]);//写入数据
  145.                 stop_iic();
  146.         }
  147. }


复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
墨逸、
2020-01-14 10:18
ziruo2002ab 发表于 2019-3-8 15:29
你要确认芯片来源没问题就当我没说 。调试期间嘛,千万不要省着么点钱。 ...

现在怀疑芯片问题了

刚刚又换了一块芯片,结果其读出的数据疑似是随机的

2008-10-00  14:48:51
2002-11-31  30:60:60
2050-00-08  11:40:04
2052-11-20  20:08:50
2054-08-00  04:02:13
2070-00-08  10:50:40
2052-00-02  13:52:71
2060-08-10  00:54:48
2004-02-12  31:70:60
2050-10-14  08:53:40
2013-12-30  20:60:08
2040-14-14  00:04:02
2071-10-20  08:50:54

一周热门 更多>