编程william hill官网
直播中

罗兰君

7年用户 234经验值
私信 关注
[问答]

如何用普通C51实现I2C基本电平模拟函数和通用函数

用普通C51实现的I2C基本电平模拟函数和通用函数

回帖(1)

杨波

2021-4-25 16:22:45
  下面是用普通C51实现的I2C基本电平模拟函数和通用函数。
  /*电平模拟函数和基本读写函数
  voidIIC_Start(void);
  voidIIC_Stop(void);
  voidSEND_0(void);
  voidSEND_1(void);
  bitCheck_Acknowledge(void);
  voidWrite_Byte(ucharb)reentrant;
  bitWrite_N_Bytes(uchar*buffer,ucharn)reentrant;
  bitRead_N_Bytes(ucharSlaveAdr,ucharn,uchar*buffer);
  ucharRead_Byte(void)reentrant;
  */
  #include
  #include
  #include
  #include“aiic_51.h”
  ***itSCL=P1^6;
  ***itSDA=P1^7;
  voidDELAY(uintt)
  {
  while(t!=0)
  t--;
  }
  voidIIC_Start(void)
  {
  //启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变
  SDA=1;
  SCL=1;
  DE LAY(DELAY_TIME);
  SDA=0;
  DELAY(DELAY_TIME);
  SCL=0;
  DELAY(DELAY_TIME);
  }
  voidIIC_Stop(void)
  {
  //终止I2C总线,当SCL为高电平时使SDA产生一个正跳变
  SDA=0;
  SCL=1;
  DELAY(DELAY_TIME);
  SDA=1;
  DELAY(DELAY_TIME);
  SCL=0;
  DELAY(DELAY_TIME);
  }
  voidSEND_0(void)
  {
  //发送0,在SCL为高电平时使SDA信号为低
  SDA=0;
  SCL=1;
  DELAY(DELAY_TIME);
  SCL=0;
  DELAY(DELAY_TIME);
  }
  voidSEND_1(void)
  {
  //发送1 ,在SCL为高电平时使SDA信号为高
  SDA=1;
  SCL=1;
  DELAY(DELAY_TIME);
  SCL=0;
  DELAY(DELAY_TIME);
  }
  bitCheck_Acknowledge(void)
  {
  //发送完一个字节后检验设备的应答信号
  SDA=1;
  SCL=1;
  DELAY(DELAY_TIME/2);
  F0=SDA;
  DELAY(DELAY_TIME/2);
  SCL=0;
  DELAY(DELAY_TIME);
  if(F0==1)
  returnFALSE;
  returnTRUE;
  }
  voidWrite_Byte(ucharb)reentrant
  {
  //向IIC总线写一个字节
  uchari;
  for(i=0;i《8;i++)
  if((b《SEND_1();
  else
  SEND_0();
  }
  bitWrite_N_Bytes(uchar*buffer,ucharn)reentrantp;
  {
  //向I2C总线写n个字节
  uchari;
  IIC_Start();
  for(i=0;i{
  Write_Byte(buffer);
  if(!Check_Acknowledge())
  {
  IIC_Stop();
  return(i==n);
  }
  }
  IIC_Stop();
  returnTRUE;
  }
  ; ucharRead_Byte(void)reentrant
  {
  //从I2C总线读一个字节
  ucharb=0,i;
  for(i=0;i《8;i++)
  {
  SDA=1;//释放总线
  SCL=1;//接受数据
  DELAY(10);
  F0=SDA;
  DELAY(10);
  SCL=0;
  if(F0==1)
  {
  b=b《《1;
  b=b|0x01;
  }
  else
  b=b《《1;
  }
  returnb;
  }
  bitRead_N_Bytes(ucharSlaveAdr,ucharn,uchar*buffer)
  {
  //从I2C总线读n个字节
  uchari;
  IIC_Start();
  Write_Byte(SlaveAdr);//向总线发送接收器地址
  if(!Check_Acknowledge())//等待接收器应答信号
  returnFALSE;
  for(i=0;i{
  buffer=Read_Byte();
  if(i!=n)
  SEND_0();//发送应答
  else
  SEND_1();//发送非应答
  }
  IIC_Stop();
  ; returnTRUE;
  }
  使用上述代码,你可以在51上用P1口模拟I2C
举报

更多回帖

发帖
×
20
完善资料,
赚取积分