EEPROM芯片: 掉电不会丢失数据,可以保存数据。
IIC串行总线的组成及工作原理:

IIC总线传输协议

IIC产生起始与终止信号:

IIC字节的传送与应答:

应答位作用:

数据帧格式:

总线寻址

软件模拟IIC通信时序

IIc通信代码示例(通过数码管显示单片机通过IIC通信接收到的数据):

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned char
#define At24c02ADDR 0XA0   //AT24C02硬件地址
#define I2cRead 1          //I2C读方向位
#define I2cWrite 0         //I2C写方向位sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
sbit SCL = P2^1;//I2C时钟总线
sbit SDA = P2^0;//I2C数据总线
uchar num;//数码管显示的值
bit AckFlag;//应答标志位//共阴数码管段选表0-9
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
} void display(uchar i)
{static uchar wei;      P0 = 0XFF;//清除断码WE = 1;//打开位选锁存器P0 = SMGwei[wei];WE = 0;//锁存位选数据switch(wei){case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;   case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;     }wei++;if(wei == 3)wei = 0;
}
//定时器0初始化
void timer0Init()
{EA = 1;   //打开总中断ET0 = 1;//打开定时器0中断TR0 = 1;  //启动定时器0TMOD |= 0X01; //定时器工作模式1,16位定时模式TH0 = 0xED;TL0 = 0xFF; //定时5ms
}
/****************************************************
IIC通信代码
****************************************************/
//延时5us
void delay5us()
{_nop_();//执行一次是一个机器周期,进入这个函数需要3个多机器周期
}
//时钟总线为高电平期间数据总线由高变低产生起始信号
void I2cStart()
{SCL = 1; SDA = 1;delay5us();//状态保持5usSDA = 0;delay5us();//状态保持5us//这个函数根据图像来写
}
//时钟总线为高电平期间,数据总线从高变低产生终止信号
void I2cStop()
{SCL = 0;SDA = 0;SCL = 1;delay5us();//状态保持5usSDA = 1;delay5us();//状态保持5us//这个函数根据图像来写
}bit ReadACK()
{SCL = 0;//拉低时钟总线,允许从机控制SDASCL = 1;//拉高,读SDAdelay5us();if(SDA)//非应答{SCL = 0;return(1);//返回1}else//应答 {SCL = 0;return(0);//返回0}
}void SendACK(bit i)
{SCL = 0;//拉低时钟总线,允许主机控制SDAif(i)    //发非应答SDA = 1;else //发应答SDA = 0;SCL = 1;  //拉高总线,让从机读SDAdelay5us();//保持5usSCL = 0; //拉低时钟总线,允许SDA释放SDA = 1;//释放数据总线
}void I2cSendByte(uchar DAT)
{uchar i; for(i=0; i<8; i++) //分别写8次,每次写1位{SCL = 0;//拉低时钟总线,允许SDA变化if(DAT & 0x80)//先写数据最高位SDA = 1;  //写1elseSDA = 0;  //写0SCL = 1;    //拉高时钟,让从机读SDADAT <<= 1;      //为发送下一位左移1位}SCL = 0; //拉低时钟总线,允许SDA释放SDA = 1;//释放数据总线
}void At24c02Write(uchar ADDR, DAT)
{I2cStart();//I2C起始信号I2cSendByte(At24c02ADDR + I2cWrite);//发送器件地址加读写方向位if(ReadACK()) //读从机应答AckFlag = 1;  //NOACKelseAckFlag = 0;    //ACKI2cSendByte(ADDR);//发送储存单元地址字节if(ReadACK())//读从机应答AckFlag = 1;    //NOACKelseAckFlag = 0;    //ACKI2cSendByte(DAT);//发送一字节数据if(ReadACK())//读从机应答AckFlag = 1;    //NOACKelseAckFlag = 0;    //ACKI2cStop(); //I2C停止信号
}uchar I2cReadByte()
{uchar i, DAT;for(i=0; i<8; i++)//分别读8次,每次读一位{DAT <<= 1; //数据左移1位,准备接收一位SCL = 0;   //拉低时钟总线,允许从机控制SDA变化SCL = 1;   //拉高时钟总线,读取SDA上的数据if(SDA)DAT |= 0X01;//为1则写1,否则不行执行写1,通过左移补0}return(DAT); //返回读出的数据
}uchar At24c02Read(uchar ADDR)
{uchar DAT;I2cStart();//I2C起始信号I2cSendByte(At24c02ADDR + I2cWrite);//发送器件地址加读写方向位if(ReadACK())//读从机应答AckFlag = 1; //NOACKelseAckFlag = 0;    //ACKI2cSendByte(ADDR);//I2C发送一个字节ReadACK();//读从机应答I2cStart();//再次产生I2C起始信号I2cSendByte(At24c02ADDR + I2cRead);//发送器件地址加读写方向位 读if(ReadACK())//读从机应答AckFlag = 1;    //NOACKelseAckFlag = 0;    //ACKDAT = I2cReadByte();//读一字节SendACK(1);//主机发送非应答I2cStop(); //I2C停止信号return(DAT);//返回读出数据}void main()//main函数自身会循环
{   timer0Init();//定时器0初始化EA = 0;//屏蔽中断At24c02Write(3, 188);//给第3单元写入数据“188”delay(2);//延时等待AT24C02处理num = At24c02Read(3);//读出第3单元内数据送给显示变量if(AckFlag)//当从机非应答P1 = 0;//亮P1所有灯elseP1 = 0XFF;//灭P1所有灯EA = 1;//开中断while(1);
} //定时器0中断函数
void timer0() interrupt 1
{TH0 = 0xED;TL0 = 0xFF; //定时5msdisplay(num); //数码管显示函数
}

IIC总线通讯协议、EEPROM芯片相关推荐

  1. # 浅谈IIC总线通讯协议

    浅谈IIC总线通讯协议 相关概念 IIC总线是PHLIPS公司在八十年代初推出的一种同步串行的半双工总线,支持多主机多从机,具备总线裁决功能,用于连接整体电路. 整体电路:同一块板子上,两个芯片之间的 ...

  2. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  3. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、单总线获取DHT11模块温湿度并通过IIC显示到屏幕(软件IIC)

    参考:基于stm32软件IIC的oled显示温湿度 作者:ZPZ DayUp 发布时间: 2021-07-25 20:52:43 网址:https://blog.csdn.net/m0_5619768 ...

  4. CAN通讯程序C语言,嵌入式C语言环境下的CAN总线通讯协议

    培训.咨询.项目开发,请与[思想]联系 1.结构体 通过前面文章<>的介绍,对于CAN通讯协议有三个非常重要的信息,分别是报文ID.数据场.解析与偏移.实现通讯协议的第一步就是定义一个报文 ...

  5. IIC(I2C)通讯协议详解(7位寻址)

    文章目录 写在前面 内容 什么是IIC SDA .SCL线 IIC是多主机总线 IIC通讯流程 数据有效性 起始和停止符 传输数据和响应 ★★ 数据格式(先就7位地址格式) 主机- -发送器 发送到 ...

  6. STC89C52的IIC总线写EEPROM

    串行通信中的IIC总线工作原理 51本身不带IIC总线 ,使用程序模拟IIC通信协议 常用的串行总线协议 UART.1-wire.I2C和SPI总线 UART:是以异步方式进行通信(一条数据输入线,一 ...

  7. KT148A语音芯片使用说明、硬件设计、通讯协议、常见问题集锦,参考代码

    目录 1.概述 1.1 简介 KT148A是一款32位的DSP语音芯片,标准的SOP8封装.内置420KByte的语音空间,最大支持420秒的语音长度,支持多段语音,同时支持直驱0.5W的扬声器,支持 ...

  8. Chapter007-FPGA学习之IIC总线EEPROM读取

    IIC总线是嵌入式领域较为重要的器件间通信总线,同样,FPGA也能通过模块的形式实现IIC的功能,其原理和STM32的模拟IIC总线一致,就是控制每个时间点的SCL.SDA总线电平. IIC总线需要对 ...

  9. PIC16F877A单片机 (IIC总线+PCF8563芯片)

    PIC16F877A单片机 (IIC总线+PCF8563芯片) 1 基本原理 1.1 IIC总线 1.2 PCF8563芯片 2 实现过程 2.1 电路图 2.2 源代码 1 基本原理 1.1 IIC ...

最新文章

  1. loadrunner 如何做关联
  2. altium designer pcb文件大
  3. 每日一皮:上线一切正常的顺畅感就是如此赏心悦目!
  4. 计算机组成原理学习1习题1
  5. Python 统计列表中元素出现的次数
  6. 什么场景应该用 MongoDB ?
  7. Gson的fromJson()方法
  8. 基于Session的认证方式_实现会话功能_Spring Security OAuth2.0认证授权---springcloud工作笔记117
  9. javascript设计模式-抽象工厂模式
  10. 数据结构——一些小点
  11. 班级量化考核系统php代码,学生信息量化考核管理系统
  12. GPT系列论文精读-GPT1
  13. 接呀呀云实时语音SDK总结
  14. hdu 4598 Difference(奇圈判定+差分约束)
  15. 开发框架-.Net:Learun(力软敏捷开发)
  16. 2022互联网校招黑话大赏
  17. 字体图标兼容性,兼容IE
  18. 基于Java的建筑工程综合管理信息系统
  19. linux 垃圾桶命令,linux自制垃圾筒 避免rm误删文件
  20. 任务管理系统算法-Kahn’s algorithm for Topological Sorting(一)

热门文章

  1. 在c++代码中关闭和启动另外一个pid进程号,共享内存数据使用
  2. 计算机组成实验v代表什么,2014计算机组成原理实验指导V1.3.docx
  3. group by很多字段是不是会很慢_女生回复我总很慢,怎么办?
  4. 自媒体和计算机相关吗,做自媒体,台式电脑跟笔记本电脑用哪个好呢?
  5. python中的可变数据类型有列表和元组_Python中列表的 += 和 .extend() 的异同
  6. android 真机 sqlite3,在android真机上使用sqlite3
  7. 计算机对口升学可以报考的学校,对口升学可以报考的学校都在这里,赶快来收藏吧...
  8. Manjaro使用笔记-使用中国源的方法
  9. YII2 随笔 视图最佳实践
  10. PDF解决方案(2)--文件转PDF