分享

单片机I/O口模拟I2C总线通讯

 lixinhecom 2017-07-21

 

#include         //  包含51单片机寄存器定义的头文件
#include       //包含_nop_()函数定义的头文件
#define  uchar  unsigned  char
#define  uint  unsigned  int
sbit SDA=P2^1;          //将串行数据总线SDA位定义在为P3.4引脚
sbit SCL=P2^0;         //将串行时钟总线SDA位定义在为P3.3引脚
void  delayms()
{
   uchar  i,j;
   for(i=10;i>0;i--)
      for(j=33;j>0;j--);
}
void  delayx(uchar x)
{
   uchar  i;
   for(i=x;i>0;i--)
   delayms();
}
void  delay()
{
   _nop_();
   _nop_();
   _nop_();
   _nop_();
}

void  start()
{
  SCL=1;
  SDA=1;
  delay();
  SDA=0;
  delay();
  SCL=0;
}

void  stop()
{
  SCL=1;
  SDA=0;
  delay();
  SDA=1;
  delay();
  SCL=0;
  SDA=0;
}

bit  writebyte(uchar y)
{
  uchar i;
  bit ACK;
  for(i=0;i<8;i++)
  {
   SCL=0;
   delay();
   y=y<<1;
   SDA=CY;
   _nop_();
   _nop_();
   SCL=1;
   delay();
   SCL=0;    //必须将其置低电平为下一次SDA数据传送做准备
  }
  SDA=1;
  delay();
  SCL=1;
  delay();
  ACK=SDA;
  SCL=0;  //为下面SDA改变做改变
  return  ACK;


}
uchar  readbyte()
{
   uchar i,k;
   for(i=0;i<8;i++)
   {
      SCL=1;
   delay();
   k=(k<<1)|(uchar)SDA;
   _nop_();
   _nop_();
   SCL=0;
   delay();

   }
   return  k;

}

void  writeset(uchar  address,uchar  dat)
{
  SCL=1;
  SDA=1;
  start();
  writebyte(0xa0);
  writebyte(address);
  writebyte(dat);
  stop();
  delayx(5);

}
uchar  read_byte( )
{
  uchar  x;
  start();
  writebyte(0xa1);
  x=readbyte();
  stop();
  return  x;

}

uchar  readset(uchar  address)
{
  start();
  writebyte(0xa0);
  writebyte(address);
  return  (read_byte());

}
void  main()
{
  while(1)
  {
   SCL=1;
   SDA=1;
   writeset(0X36,0XAA);
   P1=readset(0X36);
  }
}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多