[求助] 51和pcf8563做的数码时钟,用串口调试助手看不到发送的数据!

xxx564335   2012-9-6 07:34 楼主
这是从单片机向PCF8563传递数据的程序,用示波器检测SDA管脚有波形显示,但是看不懂传进去的数是不是对的,所以想用串口调试助手看看,可是连上串口后,在电脑上显示不出来发送的数据,不知道是不是程序哪里有问题,恳请各位帮忙看一下,非常感谢~新人一个,有许多地方都很迷茫..........

# include
# include
# define Min 0x03
# define Hou 0x04
# 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 hou;
uchar time_data[3];
bit ack;
void     _Nop(uchar   i)               /*定义空指令*/
{
uchar   j;
for(j=0;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 c)
{
  uchar BitCnt;
  for(BitCnt=0;BitCnt <8;BitCnt++)
   {
       uchar j;
    if((c< 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();
  time_data[0]=sla;
  time_data[1]=suba;
  time_data[2]=c;
}
uchar IRcvByte(uchar sla,uchar suba)
{
  uchar c;
  I2C_Start();
  SendByte(sla);
  _Nop(10);
  SendByte(suba);
  _Nop(10);
  I2C_Stop();
  I2C_Start();
  SendByte(sla+1);
  _Nop(10);
  c=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 send_char(void)
{
    uchar i;
while(i < 3)
{
  SBUF=time_data;
  while(!TI);// 等特数据传送
  TI=0;      // 清除数据传送标志
  i++;
}
}
void main()
{
init();
while(1)
{
  ISendByte(0xA2,0x03,0x00);
  send_char();
  }

}

回复评论 (5)

调通过stm32 的代码,模拟的i2c

一般主要是I2C时序错误,如果是拼凑代码找错误很难的,找个示波器看。

自己做过了下次就不难了,当初我也调了很久,不要再网上找乱七八糟的代码,或者关于i2c的乱七八糟的代码。

记住官方的东西最可靠,看一下i2c总线规范。
点赞  2012-9-6 12:01
规范来了,好好看

不行的话在上传代码
点赞  2012-9-6 12:02

回复 沙发 lyzhangxiang 的帖子

O(∩_∩)O谢谢你,我找到错误了...串行传输数据的那个子函数调用不进去,我直接把那个函数里的内容放到主函数里就好了。
点赞  2012-9-6 14:52
顺便说一句,串口助手不能调试I2C
点赞  2012-9-7 22:02
还好
点赞  2012-9-12 19:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复