[实验任务]
   利用24C08断电以后存储的数据不消失的特点,可以做一个断电保护装置。首先利用单片机做一个0-99秒的自动计时器。然后随机关断电源,在 通电以后计时器接着断电前的状态继续计时。

[实验原理]
    首先简单的说明以下I2C总线,I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。在 I2C总线上传送的一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位。数据传送首先传送最高位(MSB),数据传送按图1所示格式进行。首先由主机发出启动信号“S”(SDA在SCL高电平期间由高电平跳变为低电平),然后由主机发送一个字节的数据。启动信号后的第一个字节数据具有特殊含义:高七位是从机的地址,第八位是传送方向位,0表示主机发送数据(写),1表示主机接收数据(读)。被寻址到的从机设备按传送方向位设置为对应工作方式。标准I2C总线的设备都有一个七位地址,所有连接在I2C总线上的设备都接收启动信号后的第一个字节,并将接收到的地址与自己的地址进行比较,如果地址相符则为主机要寻访的从机,应在第九位答时钟脉冲时向SDA线送出低电平作为应答。除了第一字节是通用呼叫地址或十位从机地址之外第二字节开始即数据字节。数据传送完毕,由主机发出停止信号“P”(SDA在SCL高电平期间由低电平跳变为高电平)。
   AT24C系列串行E2PROM具有I2C总线接口功能,功耗小,宽电源电压(根据不同型号2.5V~6.0V),工作电流约为3mA,静态电流随电源电压不同为30μA~110μA,AT24C系列串行E2PROM参数如下
型 号    容 量   器件寻址字节(8位) 一次装载字节数 
AT24C01  128×8   1010A2A1A0  R/W         4 
AT24C02  256×8   1010A2A1A0   R/W         8 
AT24C04  512×8   1010A2A1P0   R/W         16 
AT24C08  1024×8  1010A2P1P0   R/W         16 
AT24C16  2048×8  1010P2P1P0   R/W         16  
  由于I2C总线可挂接多个串行接口器件,在I2C总线中每个器件应有唯一的器件地址,按I2C总线规则,器件地址为7位数据(即一个I2C总线系统中理论上可挂接128个不同地址的器件),它和1位数据方向位构成一个器件寻址字节,最低位D0为方向位(读/写)。器件寻址字节中的最高4位(D7~D4)为器件型号地址,不同的I2C总线接口器件的型号地址是厂家给定的,如AT24C系列E2PROM的型号地址皆为1010,器件地址中的低3位为引脚地址A2  A1  A0,对应器件寻址字节中的D3、D2、D1位,在硬件设计时由连接的引脚电平给定。 
  对AT24C系列 E2PROM的读写操作完全遵守I2C总线的主收从发和主发从收的规则。

[C语言源程序]

  1. #include <AT89X52.H>
  2. #include <stdio.h>
  3. #include <absacc.h>
  4. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
  5. 0x6d,0x7d,0x07, 0x7f,0x6f,};
  6. unsigned char sec; //定义计数值,每过1秒,sec加1
  7. unsigned int tcnt; //定时中断次数
  8. bit write=; //写24C08的标志;
  9. sbit gewei=P2^; //个位选通定义
  10. sbit shiwei=P2^; //十位选通定义
  11. /////////24C08读写驱动程序////////////////////
  12. sbit scl=P3^; // 24c08 SCL
  13. sbit sda=P3^; // 24c08 SDA
  14. void delay1(unsigned char x)
  15. { unsigned int i;
  16. ;i<x;i++);
  17. ;}
  18. void flash()
  19. { ; ; }
  20. void x24c08_init() //24c08初始化子程序
  21. {scl=; flash(); sda=; flash();}
  22. void start() //启动I2C总线
  23. {sda=; flash(); scl=; flash(); sda=; flash(); scl=; flash();}
  24. void stop() //停止I2C总线
  25. {sda=; flash(); scl=; flash(); sda=; flash();}
  26. void writex(unsigned char j) //写一个字节
  27. { unsigned char i,temp;
  28. temp=j;
  29. ;i<;i++)
  30. {temp=temp<<; scl=; flash(); sda=CY; flash(); scl=; flash();}
  31. scl=; flash(); sda=; flash();
  32. }
  33. unsigned char readx() //读一个字节
  34. {
  35. unsigned ;
  36. scl=; flash(); sda=;
  37. ;i<;i++)
  38. {
  39. flash(); scl=; flash();
  40. ) j=;
  41. ;
  42. k=(k<<)|j;
  43. scl=;}
  44. flash(); return(k);
  45. }
  46. void clock() // I2C总线时钟
  47. {
  48. unsigned ;
  49. scl=; flash();
  50. )&&(i<))i++;
  51. scl=; flash();
  52. }
  53. ////////从24c02的地址address中读取一个字节数据/////
  54. unsigned char x24c08_read(unsigned char address)
  55. {
  56. unsigned char i;
  57. start(); writex(0xa0);
  58. clock(); writex(address);
  59. clock(); start();
  60. writex(0xa1); clock();
  61. i=readx(); stop();
  62. delay1();
  63. return(i);
  64. }
  65. //////向24c02的address地址中写入一字节数据info/////
  66. void x24c08_write(unsigned char address,unsigned char info)
  67. {
  68. EA=;
  69. start(); writex(0xa0);
  70. clock(); writex(address);
  71. clock(); writex(info);
  72. clock(); stop();
  73. EA=;
  74. delay1();
  75. }
  76. /////////////24C08读写驱动程序完/////////////////////
  77. void Delay(unsigned int tc) //延时程序
  78. {
  79. )
  80. {unsigned int i;
  81. ; i<; i++);
  82. tc--;}
  83. }
  84. void LED() //LED显示函数
  85. {
  86. shiwei=; P0=table[sec/]; Delay(); shiwei=;
  87. gewei=; P0=table[sec%]; Delay(); gewei=;
  88. }
  89. //定时中断服务函数
  90. {
  91. TH0=(-)/; //对TH0 TL0赋值
  92. TL0=(-)%; //重装计数初值
  93. tcnt++; //每过250ust tcnt加一
  94. ) //计满20次(1秒)时
  95. {
  96. tcnt=; //重新再计
  97. sec++;
  98. write=; //1秒写一次24C08
  99. ) //定时100秒,在从零开始计时
  100. {sec=;}
  101. }
  102. }
  103. void main(void)
  104. {
  105. TMOD=0x01; //定时器工作在方式1
  106. ET0=; EA=;
  107. x24c08_init(); //初始化24C08
  108. sec=x24c08_read();//读出保存的数据赋于sec
  109. TH0=(-)/; //对TH0 TL0赋值
  110. TL0=(-)%; //使定时器0.05秒中断一次
  111. TR0=; //开始计时
  112. )
  113. {
  114. LED();
  115. ) //判断计时器是否计时一秒
  116. {
  117. write=; //清零
  118. x24c08_write(,sec); //在24c08的地址2中写入数据sec
  119. }
  120. }
  121. }

[硬件电路图]

 
 

I2C的读写操作实验的更多相关文章

  1. NIO流—理解Buffer、Channel概念和NIO的读写操作

    NIO流与IO流的区别 面向流与面向块 IO流是每次处理一个或多个字节,效率很慢(字符流处理的也是字节,只是对字节进行编码和解码处理). NIO流是以数据块为单位来处理,缓冲区就是用于读写的数据块.缓 ...

  2. [求助] 关于DDR3的读写操作,看看我的流程对吗?

    [求助] 关于DDR3的读写操作,看看我的流程对吗? 最近简单调了一下KC705开发板上面的DDR3,型号是MT8JTF12864HZ-1G6:有时候加载程序后,发现读出数据不是写进去的,在这将我的操 ...

  3. NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

    NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...

  4. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  5. [转]Android - 文件读写操作 总结

     转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...

  6. App.Config详解及读写操作

    App.Config详解及读写操作   App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而 ...

  7. 使用Python对Excel表格进行简单的读写操作(xlrd/xlwt)

    算是一个小技巧吧,只是进行一些简单的读写操作.让人不爽的是xlrd和xlwt是相对独立的,两个模块的对象不能通用,读写无法连贯操作,只能单独读.单独写,尚不知道如何解决. #①xlrd(读) #cod ...

  8. io流对文件读写操作

    public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedRead ...

  9. PHP文件读写操作之文件写入代码

    在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...

随机推荐

  1. A - Jungle Roads - poj 1251(简单)

    想必看这道题的时候直接看数据还有那个图就能明白什么意思吧,说的已经很清楚了,每个点都有一些相连的点和权值,求出来如果连接所有点,最小的权值是多少,赤裸裸的最小生成树... ************** ...

  2. Alert Views

    Alert views display a concise and informative alert message to the user. Alert views convey importan ...

  3. [置顶] vb报表的设计

    敲机房收费系统,最难的部分应该就是关于报表的部分了.相对于学生信息管理系统,报表是新内容,在vb中添加报表需要添加第三方控件,首先我们要下载水晶报表,下面就向大家展示一下我设计报表的步骤(我用的新版本 ...

  4. 经典算法:快排的Javascript版本

    function swap(arr,l,r){ var temp=arr[l]; arr[l]=arr[r]; arr[r]=temp; } function partition(arr,camp,l ...

  5. Android 监控网络状态

    public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...

  6. SQL报错error:索引中丢失IN或OUT參数

    简单记录下: 今天mybatis中遇到一个错误: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallba ...

  7. fork 和 vfork 的区别与联系

    vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,vfork和fork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,不会复制页表.因为子进程会立即调用exec ...

  8. node中的Readable - flowing/non-flowing mode

    大家都知道在node中Readable Stream有两种模式: flowing mode和non-flowing mode. 对于flowing mode的Readable Stream, 我们是没 ...

  9. NuGet学习笔记(1)——初识NuGet及快速安装使用(转)

    关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录. 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package M ...

  10. spring配置文件位置

    参考http://name327.iteye.com/blog/1628884