3957|5

15

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

这是从单片机向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();
  }

}
此帖出自51单片机论坛

最新回复

还好  详情 回复 发表于 2012-9-12 19:33
点赞 关注
 

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

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

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

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

记住官方的东西最可靠,看一下i2c总线规范。
此帖出自51单片机论坛

点评

O(∩_∩)O谢谢你,我找到错误了...串行传输数据的那个子函数调用不进去,我直接把那个函数里的内容放到主函数里就好了。  详情 回复 发表于 2012-9-6 14:52
 
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

板凳
 
规范来了,好好看

不行的话在上传代码

I2C_规范.pdf

296.51 KB, 下载次数: 15

此帖出自51单片机论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 沙发 lyzhangxiang 的帖子

O(∩_∩)O谢谢你,我找到错误了...串行传输数据的那个子函数调用不进去,我直接把那个函数里的内容放到主函数里就好了。
此帖出自51单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 
顺便说一句,串口助手不能调试I2C
此帖出自51单片机论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

6
 
还好
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表