官方淘宝店 易迪拓培训 旧站入口
首页 > 仿真设计 > 射频仿真设计学习 > 关于MC44BS373CA的I2C与单片机的通信问题

关于MC44BS373CA的I2C与单片机的通信问题

05-08
大家好,有问题想请教大家,在使用80C51单片机IO口模拟I2C总线与调制芯片MC44BS373CA的I2C总线口通信时,出现了问题,单片机接受不到MC44BS373CA的应答信号,下面是调试使用的程序,不知道哪里出现了问题,请大家帮帮忙啊,看看是不是程序出现了错误,不甚感激哦!
#include<reg51.h>
#include"intrins.h"
#define false 0
#define ture  1
sbit sda=P1^2;              //数据
sbit scl=P1^3;             //时钟
bit ack;                   //应答信号
//************************************************************************//
//                                延时子程序                             //
//**********************************************************************//
void delay(int x,int y)
{
  int i,j;
  for(i=0;i<x;i++)
  {
  for(j=0;j<y;j++);
  }
}
//************************************************************************//
//                                i2c开始信号                            //
//**********************************************************************//
void i2c_start()
{
sda=1;
scl=1;
delay(2,2);
sda=0;
delay(2,2);              //i2c初始化
scl=0;
_nop_();                //准备发送数据
}
//********************************************************************//
//                           i2c结束信号                            //
//******************************************************************//
void i2c_stop()
{
scl=0;
sda=0;
delay(2,2);
scl=1
delay(2,2);
sda=1;
delay(2,2);
}
//********************************************************************//
//                          i2c接收应答信号                          //
//******************************************************************//
bit i2c_ack()
{
  unsigned char error=255;
  sda=1;
  delay(2,2);
  scl=1;
  delay(2,2);
  while(sda)
   {
     error=error-1;
     if(error<=0)
     {
      i2c_stop();
      return(false);
     }
   }
   scl=0;
   _nop_();
   return (ture);
}
//********************************************************************//
//                         i2c发送8字节                              //
//******************************************************************//
void i2c_sendbyte(unsigned char x)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    scl=0;
    if((x<<i)&0x80) sda=1;       //发送
    else sda=0;
    _nop_();
    _nop_();
    scl=1;
    delay(2,2);
    }
   scl=0;
}
//*********************************************************************//
//                         i2c发送单个字节                            //
//*******************************************************************//
unsigned char i2c_send(unsigned char add,c1,c0,fm,fl)
{
    i2c_start();
    i2c_sendbyte(add);        //发送x
    ack=i2c_ack();
   if(ack)
   {i2c_sendbyte(c1);
    ack=i2c_ack();
     if(ack){i2c_sendbyte(c0);
      ack=i2c_ack();
        if(ack){i2c_sendbyte(fm);
         ack=i2c_ack();
          if(ack){i2c_sendbyte(fl);
           ack=i2c_ack();
            if(ack){i2c_stop();return (1); }
            else return(0);
          }
           else return(0);
          }
        else return(0);
      }
     else return(0);
    }
   else return(0);
}
//********************************************************************//
//                             主函数                                //
//******************************************************************//
void main()
{
   unsigned char result=1;
   result=i2c_send(0xCA,0x80,0x18,fm,fl);
  if(result==0)
  { result=i2c_send(0xCA,0x80,0x18,fm,fl);
  }
}

相关程序 http://catv888.taobao.com
QQ: 306099455

Top