PCF8563传数据给单片机出错....

2019-03-24 19:00发布

目前单片机向8563送数据正确,但是单片机读取8563的数据有错误,先是FF,改了程序后又变成00了.........不知道是哪里有问题...恳请大家帮忙分析一下....O(∩_∩)O谢谢 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
xxx564335
2019-03-25 06:37
# include <reg52.h>
# include <intrins.h>
# define uchar unsigned char
#define XTAL 12000000     // CUP 晶振频率
#define baudrate 2400    // 通信波特率

sbit SDA=P1^7;
sbit SCL=P1^6;
sbit text=P0^1;

uchar min;
uchar hour;
uchar time_data;
uchar x;
uchar z;
uchar buff[3];
uchar b;

bit ack;

void     _Nop(uchar   i)               /*定义空指令*/
{
uchar   j;
for(j=0;j<i;j++);
}


void I2C_Start(void)
{
   SDA=1;
   _Nop(1);
   SCL=1;                                                                                               
   _Nop(5);
   SDA=0;
   _Nop(5);
   SCL=0;
   _Nop(2);
}

void I2C_Stop(void)
{
  SDA=0;
  _Nop(1);
  SCL=1;
  _Nop(5);
  SDA=1;
  _Nop(4);
}

void SendByte(uchar y)
{
  uchar BitCnt;
  for(BitCnt=0;BitCnt <8;BitCnt++)
   {
       uchar j;
    if((y<<j)&BitCnt)
        SDA=1;
         else  SDA=0;
        _Nop(1);
         SCL=1;
         _Nop(5);
         SCL=0;
   }
  _Nop(2);
  SDA=1;
  _Nop(2);
  SCL=1;
  _Nop(3);
  if(SDA==1)ack=0;
  else ack=1;
  SCL=0;
  _Nop(2);
}

uchar RcvByte()
{
  uchar retc;
  uchar BitCnt;
  retc=0;
  SDA=1;
  for(BitCnt=0;BitCnt<8;BitCnt++)
     {
           _Nop(1);
           SCL=0;
           _Nop(4);
           SCL=1;
           _Nop(2);
           retc=retc<<1;
           if(SDA==1)retc=retc+1;
           _Nop(2);
         }
SCL=0;
_Nop(2);
return(retc);
}                  

void Ack_I2C(uchar a)
{
  if(a==0)SDA=0;
         else SDA=1;
  _Nop(3);
  SCL=1;
  _Nop(5);
  SCL=0;
  _Nop(2);
}  

void ISendByte(uchar sla,uchar suba,uchar c)
{
  I2C_Start();
  SendByte(sla);
  _Nop(1);
  SendByte(suba);
  _Nop(1);
  SendByte(c);
  _Nop(1);
  I2C_Stop();
}

uchar IRcvByte(uchar sla,uchar suba,uchar y)
{

  I2C_Start();
  SendByte(sla);
  _Nop(10);
  SendByte(suba);
  _Nop(10);
  I2C_Stop();
  I2C_Start();
  SendByte(sla+1);
  _Nop(10);
  
  for(b=0;b<y;b++)
   {
   buff=RcvByte();
   if (b!=y-1) Ack_I2C(0);
  //z=RcvByte();
  Ack_I2C(1);
  I2C_Stop();
}
}          

/****************************串口初始化****************************/
void init(void)
{
        EA=1; // "中断总允许"
        ES=1;

        TMOD=0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率

        TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
    TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));

        SCON=0x50; // 设定串行口工作方式(UART为模式1,8位数据,允许接收)
        PCON=0x00; // 波特率不倍增

        TR1=1; // 启动定时器1                                  

}



void main()
{
text=0;
init();
ISendByte(0xa2,0x00,0x00);
ISendByte(0xa2,0x03,0x00);
//IsendByte(0xa2,0x04,0x06);
  while(1)
{
    min=IRcvByte(0xa2,0x03,0x03);
        //hour=IRvByte(0xa2,0x04);
    text=0;
        SBUF=buff;
        while(!TI);// 等特数据传送
        TI=0;      // 清除数据传送标志
               
}
       

}

一周热门 更多>