最近刚做好一个站,基于rails 3,教程为主,大家捧场看看,谢谢!www.yo945.com

在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想用多一点芯片吧,老觉得IO口不够用。学串口的时候觉得串口是个好东西,连两条线就够了,现在学到I2C,觉得这也是一个非常好的东西,也是两条线,还能给每个总线上的设备设立地址,简直就是一个小网络了。

I2C总线使用两条线,一条是时钟线,称为SCL,一条是数据线,称为SDA,各个设备就并在总线上,每一个总线上的设备都有一个自己的地址,主机在操作设备的时候,都会先发送一个地址码,告诉被操作机,接下来的命令由它接收。

接下来说一下I2C总线的数据有效性。I2C总线进行数据传送时,要求SCL为高电平时,SDA上的数据必需保持稳定,换言之,当SCL为高电平时,SDA的电平不能变换,只有当SCL为低电平时,SDA的电平才能变。

I2C总线通信时,需要遵照一定的协议,以下为一次通信过程:

  1. 由主机发送起始信号,启动I2C总线。时序为,在SCL为高电平期间,SDA出现一个下降沿。
  2. 主机发送寻址信号,即告诉特定的设备,接下来的命令是发给它的。地址分为7位和10位,以7位为例,高7位为设备地址,最低位表示读或写,1表示读,0表示写。
  3. 应答信号,I2C协议规定,每传送一个字节数据(包括地址及命令)后,都要有一个接收设备返回的应答信号,以确定信号是否被接收设备正确接收到了。其时序为,在SCL信号为高电平期间,接收设备把SDA电平拉低。
  4. 数据传输,当主机发送发址并收到应答后,就可以发送数据了,但是发送数据只能每次发送一位,并且每发送一位后都需要收到接收机的应答。或主机为接收设备时,主机对最后一个字节不应答,表示向发送设备说,数据传送结束。
  5. 发送停止信号,在全部数据传送完毕后,主机发送停止信号,时序为,在SCL为高电平期间,SDA上产生一个上升沿。

前面讲到,I2C协议要求数据的发送,要求SCL为低电平时,SDA才能变换,看一下上面的时序,可以看到,命令都是SCL为高电平时对SDA的操作,而发送数据则是SCL为低电平时对SDA操作。

这次拿来做实验的是AT24C02存储芯片,在Proteus里面,它叫24C02C(或者24C02B),是一个2K bit的I2C总线的EEPROM存储器,换成电脑上常用的KB也就是256KB,EEPROM表示它保存了以后不用加电池,也能保持数据完好。实验的做法是,先把数据保存到芯片中,然后再读出来,显示到1602液晶上。

上面介绍了I2C总线的协议格式,即发送一个命令的格式,但是对于每一个设备来说,要操作它,是需要很多命令的,AT24C02的操作则主要是读和写,它分为页读写(即一次读写一大片)和字读写(一次读写一个字节)两种方式,初学么,只使用字读写方式,下面记录一下读写的时序。

首先是写数据,时序如下:

1.发送启动信号

2.发送一个控制字(即芯片的地址)——等待应答

3.发送要写的芯片内存储单元地址——等待应答

4.发送要写入的数据——等待应答

5.停止信号

接下来是读数据的时序:

1.发送启动信号

2.发送一个控制字(即芯片的地址,最低位为0即写操作)——等待应答

3.发送要读取的芯片内存储单元地址——等待应答

4.再发送一个地址信号(同第2步,但是最低位为1,即读操作)——等待应答

5.按每次一位,读取数据

6.停止信号

I2C协议看起来相对复杂,但是在单片机里面实现,其实就是用两个IO口,来模拟SCL和SDA的电平变化。以启动I2C为例(在SCL为高电平时,SDA发送一个下降沿),代码如下:

SDA = 1;//把SDA先置高电平,待会好出现下降沿

delay();

SCL = 1;//SCL要晚于SDA设置,否则容易和其他命令混淆

delay();

SDA=0;//电平从1到0,出现一个下降沿

delay();

---------------------------------------------------------------------

Proteus电路图如下,记得要在总线的两条线上,接上拉电阻(10K即可)

结果如下:

这里还得说一下I2C DEBUGGER这个虚拟仪器,真的是挺好用的,把它接在总线上后,它会把每一个命令都显示出来,并把操作属于哪一种操作都标识出来,以我往芯片存一个字符“H”为例:

它把每一步都标的清清楚楚,特别说明一下的是,几个字符是有特殊意义的,如:

S表是I2C总线-“开始” 
A---应答 
p---停止 
Sr--重启动

所以第一行S A0 A 01 A 48 A p表示的意思是:启动I2C总线,发送数据A0(其实是芯片的地址),芯片应答,发送数据01(就是写入的地址),芯片应答,发送数据48(就是保存的数据),芯片应答,结束。看看,是否和前面说的流程一致?

程序这里不贴了,下载里都有,里面有详细的注释。

PS:在调试时遇到的一个问题,可能大家也会碰到,记录一下。

我本来是循环着往芯片里面写数据,然后读出来,显示到液晶上,这时读写都正常,形式如下:

for(i=0;i<字符串长度;i++)

{

save(‘a’)

read(‘a’)

}

后来我为了试验多显示几个字符,换了种方式,换成一次把所有数据都保存进去,再读出来,变成下面的形式(伪代码):

save(‘a’)

save(‘b’)

save(‘c’)

read(1)

read(2)

read(3)

这时出现了一个问题,第一个能正常保存,第2个就不能保存,第3个又能保存,让我很是头疼。

后来分析了一下,前后两种代码的区别,就在于,第一种形式,保存后,又进行读取,相当于保存后进行了一定的延时,而第二种形式一直在保存,保存后没有延时,后来在第二种形式的save后,加上了延时,就一切正常了。

源代码下载:点击下载

IIC总线技术

  IIC总线是微电子通信控制领域中被广泛采用的一种总线标准,具有接口线少,控制方式简单、器件封装外形小、通信速率高等特点。它仅通过两根线SDA和SCL即可实现完善的全双工同步数据传送,能够十分方便地构成多主机系统和外同器件扩展系统。

  IIC总线数据传输只有任总线处于空闲状态时(SCL和SDA必须保证为高电平)才启动。IIC总线协议定义数据传输时序如图2所示,起始条件为当SCL为高电平时,SDA由高电平向低电平跳变,数据开始传输;结束条件为当SCL为低电平时,SDA由低电平向高电平跳变,数据传输结束。传输过程中,当SCL高时,SDA必须始终保持稳定状态,此时出现任何跳变都被认为是起始或停止条件,只有当SCL为低电平的时候才允许SDA上的数据改变。

 

  IIC总线上的数据格式如图3所示,由起始位(S)、从机地址码、读写控制位(R/W)、应答位(A)、数据和停止位(P)等组成。通信启动时,主器件先发送启动信号和从机地址,总线上每个器件都有自己的唯一地址,与地址与某一从器件相匹配时,该从器件发一应答位,主器件则认为寻址成功,然后根据R/W位确定的数据传送方向进行数据传输。若主器件长时间收不到应答位,则认为超时,放弃本次数据传输。通信停止时,主机发送一个停止信号。

 

用Proteus学习51单片机之I2C(IIC)总线相关推荐

  1. 基于51单片机实现模拟IIC总线时序

    最近用到测量光线的模块BH1750FVI时需要用到IIC总线操作, 于是就又费功夫学习了下, 基本上算是了解了, 所以呢, 就用51的IO口, 模拟出了总线时序, 并能正确操纵需要用IIC总线访问地一 ...

  2. c++程序设计_基于proteus的51单片机开发实例30-模块化程序设计

    1. 基于proteus的51单片机开发实例30-模块化程序设计 1.1. 实验目的 模块化程序设计 不知不觉我们的51单片机开发实例已经进行到第三十篇了,是时候进行一个总结和反思了,总结什么?反思什 ...

  3. 51单片机对I2C总线上挂接多个AT24C02的读写操作+Proteus仿真

    51单片机对I2C总线上挂接多个AT24C02的读写操作+Proteus仿真 Proteus仿真图 实例代码 //对I2C总线上挂接多个AT24C02的读写操作 #include <reg51. ...

  4. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下

    1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...

  5. c51中断优先级c语言,基于proteus的51单片机开发实例(14)中断嵌套和中断优先级...

    1. 基于proteus的51单片机开发实例(14)中断嵌套和中断优先级 1.1. 实验目的 在前面实例中我们已经学习了51单片机的定时器/计数器中断,外部中断,通过这些实例,知道了中断电路的设计,中 ...

  6. hc05与单片机连接图_基于proteus的51单片机开发实例37-DAC0832

    学习手记 1. 基于proteus的51单片机开发实例37-DAC0832 1.1. 实验目的 之前我们学习了数模转换芯片DAC0808,今天我们继续学习另一种D/A转换芯片DAC0832. 1.2. ...

  7. 使用51单片机+lcd1602转接板-iic接口进行显示

    使用51单片机+lcd1602转接板-iic接口进行显示 某宝上有卖lcd1602与iic芯片pcf8574的整合,虽然lcd1602能直接用51单片机使用,不过经过整合之后只需要对SCL和SDA两个 ...

  8. 51单片机控制的LOVE心形创意彩灯 PROTEUS 和51单片机教程(附仿真文件+源代码)

    51单片机控制的LOVE心形创意彩灯 PROTEUS 和51单片机教程附仿真文件截图 单片机控制的LOVE心形创意彩灯 参考源代码 ORG 0000H LJMP START ORG 0030H ;初始 ...

  9. 单片机控制蜂鸣器唱生日快乐歌曲 PROTEUS 和51单片机教程(附仿真文件+源代码)

    功能:按一下开关后,单片机控制蜂鸣器唱生日快乐歌曲 PROTEUS 和51单片机教程 单片机控制蜂鸣器唱生日快乐歌曲 程序源代码如下: /* 生日歌 */ #include <reg51.h&g ...

最新文章

  1. python爬虫教程下载-Python爬虫文件下载图文教程
  2. AJAX实用教程——获取博客园博文列表
  3. datalist可以放div吗?_炒花生米可以放蜂蜜吗?蜂蜜花生米的正确做法窍门
  4. 总结一下模型工程化部署的几种方式
  5. 分布式 | Dubbo 架构设计详解
  6. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——工具类
  7. eclipse编译hadoop插件
  8. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列三(log文件的存放路径)
  9. oracle错误代码03113,Oracle ora-03113错误的处理
  10. 如何将NEF格式文件转换为JPG格式
  11. 0806 07 08 09 12上午数据库
  12. seo软文标题写作技巧:好的标题是靠这样想出来的
  13. 生鲜配送APP软件开发快速制作
  14. 我用Python模拟了谷爱凌的凌空一跃
  15. Http实战之无状态协议、keep-alive分析
  16. 平面几何相关算法整理
  17. 面试自我介绍如何介绍呢?
  18. 西工大c语言考试历年试题,西工大C语言上机考试题库
  19. Tyvj 题目1088 treat(DP+记忆化搜索)
  20. mysql中top命令详解_top命令详解

热门文章

  1. float浮点数的四舍五入
  2. Java设计模式--解释器模式
  3. SharePoint咨询师之路:设计之前的那些事四:负载均衡 - web服务器
  4. js 验证身份证号码
  5. 给大一师弟师妹的一些建议
  6. Ucloud香港1h1g云服务器低至126元一年而且可开3年限时
  7. 在 ASP.NET Core 5.0 中访问 HttpContext
  8. 8.面向对象-----类和对象
  9. leetcode 字符串中的第一个唯一字符
  10. leetcode 整数反转