找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1703|回复: 4
打印 上一主题 下一主题
收起左侧

求助:stc单片机程序改arduino时,iic通讯调试不通?

[复制链接]
跳转到指定楼层
楼主
ID:82043 发表于 2020-6-22 21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学习arduino,需要从rx8025中读取时间,但是读出来的时间都是0;

被注释的程序是stc的程序,能正常使用,尝试改成arduino的iic通讯,一直调试不通。

麻烦帮我看看》》

//还有部分其他程序,但到时调用这两个函数,应该无关吧!!!!




/**************************************
写一个字节数据到指定地址
**************************************/
void R8025T_WriteOneByte(unsigned char  Addr,unsigned char  Data)
{
            /*以下是stc单片机程序
               IIC_Start();
               IIC_SendByte(R8025T_Address);
               IIC_SendByte(Addr);
               IIC_SendByte(Data);
               IIC_Stop();
               */

    //以下是自己写的arduino程序
    Wire.beginTransmission(R8025T_Address);
    Wire.write(Addr);
    Wire.write(Data);
    Wire.endTransmission();
}
/**************************************
在指定地址读一个字节数据
**************************************/
unsigned char  R8025T_ReadOneByte(unsigned char  Addr)
{
    unsigned char  Data;

                  /*以下是stc单片机程序
                  IIC_Start();                    //起始信号
                  IIC_SendByte(R8025T_Address);     //发送设备地址+写信号
                  IIC_SendByte(Addr);               //发送存储单元地址
                  IIC_Start();                      //起始信号
                  IIC_SendByte(R8025T_Address+1);   //发送设备地址+读信号
                  Data = IIC_RecvByte();
                  IIC_SendACK(1);
                  IIC_Stop();                       //停止信号
                  return(Data);
                 */


    Wire.beginTransmission(R8025T_Address);
    Wire.write(Addr);   
    Wire.beginTransmission(R8025T_Address+1);
    Wire.requestFrom(R8025T_Address+1,1);
    Data=Wire.available();
    Wire.endTransmission();
    return (Data);  
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82043 发表于 2020-6-22 21:03 | 只看该作者
现附上调用的程序
回复

使用道具 举报

板凳
ID:82043 发表于 2020-6-22 21:04 | 只看该作者
/******************************************************************************* * 函数名 : BCD2HEX * 描述    : BCD转为HEX * 参数    : -bcd_data:传入BCD格式的数据 * 返回值 : 十六进制数 *******************************************************************************/ unsigned char  BCD2HEX(unsigned char  bcd_data)   {          unsigned char temp;   temp=(bcd_data>>4)*10+bcd_data&0x0f;     return temp; }  /******************************************************************************* * 函数名 : HEX2BCD * 描述    : HEX转为BCD   * 参数    : -hex_data:传入十六进制格式的数据 * 返回值 : BCD码 *******************************************************************************/ unsigned char  HEX2BCD(unsigned char  hex_data)   {        unsigned char  temp;      temp=((hex_data/10)<<4) + (hex_data%10);        return temp;   } /******************************************************************************* * 函数名 : Reset_Time * 描述    : 设置出厂时间 * 参数    : 无 * 返回值 : 无 *******************************************************************************/ void Reset_Time(void) {   //R8025T_WriteOneByte(0x07, 0x00);//不使用   //R8025T_WriteOneByte(0x0E, 0x20);//设置24小时制,可能只有R8025SA才行。    //写入出厂时间 00:00:00    R8025T_WriteOneByte(0, HEX2BCD(33) ); //写入R8025T 秒   R8025T_WriteOneByte(1, HEX2BCD(35) ); //写入R8025T 分   R8025T_WriteOneByte(2, HEX2BCD(20) ); //写入R8025T 时  }  void Get_Time(void) {   BUF[0] = R8025T_ReadOneByte(0);   BUF[1] = R8025T_ReadOneByte(1);   BUF[2] = R8025T_ReadOneByte(2); //  DateTime[0] = BCD2HEX(BUF[0]);//读分   DateTime[1] = BCD2HEX(BUF[1]);//读秒   DateTime[2] = BCD2HEX(BUF[2]);//读时    //说明:DateTime[2],BUF[0],DateTime[1]分别存放十六进制的时、分、秒   // 为什么BUF[0]存放分的值,而不是DateTime[0],原因不明。 }
回复

使用道具 举报

地板
ID:82043 发表于 2020-6-23 07:52 | 只看该作者
3205440665 发表于 2020-6-22 21:04
/******************************************************************************* * 函数名 : BCD2HEX ...

另外一部分程序


/*******************************************************************************
* 函数名 : BCD2HEX
* 描述    : BCD转为HEX
* 参数    : -bcd_data:传入BCD格式的数据
* 返回值 : 十六进制数
*******************************************************************************/
unsigned char  BCD2HEX(unsigned char  bcd_data)  
{   
   
  unsigned char temp;
  temp=(bcd_data>>4)*10+bcd_data&0x0f;
    return temp;
}

/*******************************************************************************
* 函数名 : HEX2BCD
* 描述    : HEX转为BCD  
* 参数    : -hex_data:传入十六进制格式的数据
* 返回值 : BCD码
*******************************************************************************/
unsigned char  HEX2BCD(unsigned char  hex_data)  
{   
    unsigned char  temp;
    temp=((hex_data/10)<<4) + (hex_data%10);
  
    return temp;  
}
/*******************************************************************************
* 函数名 : Reset_Time
* 描述    : 设置出厂时间
* 参数    : 无
* 返回值 : 无
*******************************************************************************/
void Reset_Time(void)
{
  //R8025T_WriteOneByte(0x07, 0x00);//不使用
  //R8025T_WriteOneByte(0x0E, 0x20);//设置24小时制,可能只有R8025SA才行。

  //写入出厂时间 00:00:00
  R8025T_WriteOneByte(0, HEX2BCD(33) ); //写入R8025T 秒
  R8025T_WriteOneByte(1, HEX2BCD(35) ); //写入R8025T 分
  R8025T_WriteOneByte(2, HEX2BCD(20) ); //写入R8025T 时
}

void Get_Time(void)
{
  BUF[0] = R8025T_ReadOneByte(0);
  BUF[1] = R8025T_ReadOneByte(1);
  BUF[2] = R8025T_ReadOneByte(2);
//  DateTime[0] = BCD2HEX(BUF[0]);//读分
  DateTime[1] = BCD2HEX(BUF[1]);//读秒
  DateTime[2] = BCD2HEX(BUF[2]);//读时
  //说明:DateTime[2],BUF[0],DateTime[1]分别存放十六进制的时、分、秒
  // 为什么BUF[0]存放分的值,而不是DateTime[0],原因不明。
}
回复

使用道具 举报

5#
ID:65956 发表于 2020-6-23 08:32 | 只看该作者
IIC通讯能不能成功最关键就是时序,时序搞对了就没有问题,查查自子函数的IIC延时时间对应和晶振对应关系,这样就应没问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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