[实验任务]
   利用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语言源程序]

#include <AT89X52.H>
#include <stdio.h>
#include <absacc.h>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
                         0x6d,0x7d,0x07, 0x7f,0x6f,};
unsigned char sec;        //定义计数值,每过1秒,sec加1
unsigned int tcnt;        //定时中断次数
bit  write=;             //写24C08的标志;
sbit gewei=P2^;          //个位选通定义
sbit shiwei=P2^;         //十位选通定义
/////////24C08读写驱动程序////////////////////
sbit scl=P3^;   // 24c08 SCL
sbit sda=P3^;  // 24c08 SDA
void delay1(unsigned char x)
{  unsigned int i;
  ;i<x;i++);
  ;}
void flash()
{  ;  ; }
void x24c08_init()  //24c08初始化子程序
 {scl=; flash(); sda=; flash();}
void start()        //启动I2C总线
{sda=; flash(); scl=; flash(); sda=; flash(); scl=; flash();}
void stop()         //停止I2C总线
{sda=; flash(); scl=; flash(); sda=; flash();}
void writex(unsigned char j)  //写一个字节
{  unsigned char i,temp;
   temp=j;
   ;i<;i++)
   {temp=temp<<; scl=; flash(); sda=CY; flash(); scl=; flash();}
   scl=; flash(); sda=; flash();
}
unsigned char readx()   //读一个字节
{
   unsigned ;
   scl=;  flash();  sda=;
   ;i<;i++)
    {
flash();  scl=;  flash();
      ) j=;
      ;
      k=(k<<)|j;
   scl=;}
   flash();  return(k);
}
void clock()         // I2C总线时钟
{
   unsigned ;
   scl=;  flash();
   )&&(i<))i++;
   scl=; flash();
}
////////从24c02的地址address中读取一个字节数据/////
unsigned char x24c08_read(unsigned char address)
{
   unsigned char i;
   start(); writex(0xa0);
   clock(); writex(address);
   clock(); start();
   writex(0xa1); clock();
   i=readx(); stop();
   delay1();
   return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c08_write(unsigned char address,unsigned char info)
{
   EA=;
   start(); writex(0xa0);
   clock(); writex(address);
   clock(); writex(info);
   clock(); stop();
   EA=;
   delay1();
}
/////////////24C08读写驱动程序完/////////////////////
void Delay(unsigned int tc)     //延时程序
{
  )
    {unsigned int i;
     ; i<; i++);
     tc--;}
}
void LED()                  //LED显示函数
{
   shiwei=; P0=table[sec/]; Delay(); shiwei=;
   gewei=;  P0=table[sec%]; Delay(); gewei=;
}
   //定时中断服务函数
{
TH0=(-)/; //对TH0 TL0赋值
TL0=(-)%; //重装计数初值
tcnt++;        //每过250ust tcnt加一
)  //计满20次(1秒)时
   {
    tcnt=;   //重新再计
    sec++;
    write=;  //1秒写一次24C08
    ) //定时100秒,在从零开始计时
      {sec=;}
   }
}
void main(void)
{
TMOD=0x01;  //定时器工作在方式1
ET0=;  EA=;
x24c08_init();        //初始化24C08
sec=x24c08_read();//读出保存的数据赋于sec
TH0=(-)/; //对TH0 TL0赋值
TL0=(-)%; //使定时器0.05秒中断一次
TR0=;           //开始计时
 )
  {
  LED();
 ) //判断计时器是否计时一秒
    {
  write=;              //清零
     x24c08_write(,sec);  //在24c08的地址2中写入数据sec
 }
   }
}

[硬件电路图]

 
 

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. javascript 判断是否是数组

    function isArray(object){ return object && typeof object==='object' && typeof object ...

  2. AngularJS clone directive 指令复制

    需求背景:         directive模块化某表单信息,但表单信息可加入多条.此时就涉及到clone directive. 解决方式:         能够通过使用angularjs中$com ...

  3. [转] PostgreSQL学习手册(数据表)

    from: http://www.cnblogs.com/stephen-liu74/archive/2012/04/23/2290803.html 一.表的定义: 对于任何一种关系型数据库而言,表都 ...

  4. linux 声音大小调整的命令

    alsamixer 输入上面的命令 回车即可看到图形界面,界面如下 ┌──────────────────────────── AlsaMixer v1.0.27.1 ──────────────── ...

  5. Sorting File Contents and Output with sort

     Sorting File Contents and Output with sort   Another very useful command to use on text file is  so ...

  6. OpenStack对象存储——Swift

    OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性.冗余和持久性.本文将从架构.原理 和实践等几方面讲述S ...

  7. 复杂 Listview 显示 多个样式

    三种方式 目前为止有三种方法让Listview现实多个样式 最简单最常用的,通过addHeaderView或addFooterView,但是只能在首尾添加 较麻烦但正规的方式,通过getViewTyp ...

  8. javascript MD5

    var MD5 = function (string) { function RotateLeft(lValue, iShiftBits) { return (lValue<<iShift ...

  9. (七)Angularjs - 控制器

    控制器的作用 没有控制器/controller,我们没有地方定义业务模型 比如:ng-init指令.我们可以使用ng-init指令在scope对象上定义数据 <div ng-init=" ...

  10. 洛谷 P1305 新二叉树

    P1305 新二叉树 题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...