例说单片机数据通信之模拟IIC通信

  作者:Liklon 时间:2014-06-25来源:电子产品世界

  void writeByte(unsigned char dat)

  {

  unsigned char i = 0;

  for(i = 0;i < 8;i++)

  {

  clrSCL(); //拉低时钟线,改变SDA线的电平

  if(dat & 0x80) setSDA();

  else clrSDA();

  setSCL(); //SDA电平稳定后,拉高时钟线

  dat <<= 1;

  }

  clrSCL();

  }

  unsigned char readByte()

  {

  unsigned char i = 0,tmp = 0;

  for(i = 0;i < 8;i++)

  {

  clrSCL(); //拉低时钟线

  tmp <<= 1; //准备读取数据

  setSCL(); //拉高时钟线

  if(SDA) tmp |= 0x01;

  }

  clrSCL();

  return tmp;

  }

  AT24C02读写操作

  void writeAT24XX(unsigned char addr,unsigned char dat)

  {

  startbit(); //起始信号

  writeByte(0xa0); //器件地址

  respond();

  writeByte(addr); //器件内部地址

  respond();

  writeByte(dat); //数据

  respond();

  stopbit(); //停止

  }

  unsigned char readAT24XX(unsigned char addr)

  {

  unsigned char dat;

  startbit(); //起始信号

  writeByte(0xa0); //器件地址

  respond();

  writeByte(addr); //器件内部地址

  respond();

  startbit(); //起始信号

  writeByte(0xa1); //器件地址

  respond();

  dat = readByte(); //数据

  stopbit(); //停止

  return dat;

  }

  主函数部分内容以及程序运行效果:

  void main()

  {

  unsigned char dat;

  initUart();

  sendString("UART INIT OK!!!n"); //串口通信初始化

  sendString("write 0x05 --> addr 0x00 n");//写入5到期间内部地址0

  writeAT24XX(0x00,0x05); //写入数据

  sendString("read dat <-- addr 0x00 n"); //读出写入数据

  dat = readAT24XX(0x00); //读出数据

  sendString("dat-->"); //打印

  sendByte(dat + '0');

  while(1);

  }

1 2

关键词: IIC 单片机 SDA

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版