<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于單片機的I2C的讀寫操作實驗

          基于單片機的I2C的讀寫操作實驗

          作者: 時間:2012-11-03 來源:網絡 收藏

          [實驗任務]
          利用24C08斷電以后存儲的數(shù)據不消失的特點,可以做一個斷電保護裝置。首先利用做一個0-99秒的自動計時器。然后隨機關斷電源,在 通電以后計時器接著斷電前的狀態(tài)繼續(xù)計時。

          [實驗原理]
          首先簡單的說明以下總線,總線是一種串行數(shù)據總線,只有二根信號線,一根是雙向的數(shù)據線SDA,另一根是時鐘線SCL。在 總線上傳送的一個數(shù)據字節(jié)由八位組成??偩€對每次傳送的字節(jié)數(shù)沒有限制,但每個字節(jié)后必須跟一位應答位。數(shù)據傳送首先傳送最高位(MSB),數(shù)據傳送按圖1所示格式進行。首先由主機發(fā)出啟動信號“S”(SDA在SCL高電平期間由高電平跳變?yōu)榈碗娖?,然后由主機發(fā)送一個字節(jié)的數(shù)據。啟動信號后的第一個字節(jié)數(shù)據具有特殊含義:高七位是從機的地址,第八位是傳送方向位,0表示主機發(fā)送數(shù)據(寫),1表示主機接收數(shù)據(讀)。被尋址到的從機設備按傳送方向位設置為對應工作方式。標準I2C總線的設備都有一個七位地址,所有連接在I2C總線上的設備都接收啟動信號后的第一個字節(jié),并將接收到的地址與自己的地址進行比較,如果地址相符則為主機要尋訪的從機,應在第九位答時鐘脈沖時向SDA線送出低電平作為應答。除了第一字節(jié)是通用呼叫地址或十位從機地址之外第二字節(jié)開始即數(shù)據字節(jié)。數(shù)據傳送完畢,由主機發(fā)出停止信號“P”(SDA在SCL高電平期間由低電平跳變?yōu)楦唠娖?。
            AT24C系列串行E2PROM具有I2C總線接口功能,功耗小,寬電源電壓(根據不同型號2.5V~6.0V),工作電流約為3mA,靜態(tài)電流隨電源電壓不同為30μA~110μA,AT24C系列串行E2PROM參數(shù)如下
          型 號 容 量 器件尋址字節(jié)(8位) 一次裝載字節(jié)數(shù)
          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總線規(guī)則,器件地址為7位數(shù)據(即一個I2C總線系統(tǒng)中理論上可掛接128個不同地址的器件),它和1位數(shù)據方向位構成一個器件尋址字節(jié),最低位D0為方向位(讀/寫)。器件尋址字節(jié)中的最高4位(D7~D4)為器件型號地址,不同的I2C總線接口器件的型號地址是廠家給定的,如AT24C系列E2PROM的型號地址皆為1010,器件地址中的低3位為引腳地址A2 A1 A0,對應器件尋址字節(jié)中的D3、D2、D1位,在硬件設計時由連接的引腳電平給定。
            對AT24C系列 E2PROM的完全遵守I2C總線的主收從發(fā)和主發(fā)從收的規(guī)則。

          [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; //定義計數(shù)值,每過1秒,sec加1
          unsigned int tcnt; //定時中斷次數(shù)
          bit write=0; //寫24C08的標志;
          sbit gewei=P2^0; //個位選通定義
          sbit shiwei=P2^1; //十位選通定義
          /////////24C08讀寫驅動程序////////////////////
          sbit scl=P3^4; // 24c08 SCL
          sbit sda=P3^5; // 24c08 SDA
          void delay1(unsigned char x)
          { unsigned int i;
          for(i=0;ix;i++);
          ;}
          void flash()
          { ; ; }
          void x24c08_init() //24c08初始化子程序
          {scl=1; flash(); sda=1; flash();}
          void start() //啟動I2C總線
          {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
          void stop() //停止I2C總線
          {sda=0; flash(); scl=1; flash(); sda=1; flash();}
          void writex(unsigned char j) //寫一個字節(jié)
          { unsigned char i,temp;
          temp=j;
          for (i=0;i8;i++)
          {temp=temp1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
          scl=0; flash(); sda=1; flash();
          }
          unsigned char readx() //讀一個字節(jié)
          {
          unsigned char i,j,k=0;
          scl=0; flash(); sda=1;
          for (i=0;i8;i++)
          {
          flash(); scl=1; flash();
          if (sda==1) j=1;
          else j=0;
          k=(k1)|j;
          scl=0;}
          flash(); return(k);
          }
          void clock() // I2C總線時鐘
          {
          unsigned char i=0;
          scl=1; flash();
          while ((sda==1)(i255))i++;
          scl=0; flash();
          }
          ////////從24c02的地址address中讀取一個字節(jié)數(shù)據/////
          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(10);
          return(i);
          }
          //////向24c02的address地址中寫入一字節(jié)數(shù)據info/////
          void x24c08_write(unsigned char address,unsigned char info)
          {
          EA=0;
          start(); writex(0xa0);
          clock(); writex(address);
          clock(); writex(info);
          clock(); stop();
          EA=1;
          delay1(50);
          }
          /////////////24C08讀寫驅動程序完/////////////////////
          void Delay(unsigned int tc) //延時程序
          {
          while( tc != 0 )
          {unsigned int i;
          for(i=0; i100; i++);
          tc--;}
          }
          void LED() //LED顯示函數(shù)
          {
          shiwei=0; P0=table[sec/10]; Delay(8); shiwei=1;
          gewei=0; P0=table[sec%10]; Delay(5); gewei=1;
          }
          void t0(void) interrupt 1 using 0 //定時中斷服務函數(shù)
          {
          TH0=(65536-50000)/256; //對TH0 TL0賦值
          TL0=(65536-50000)%256; //重裝計數(shù)初值
          tcnt++; //每過250ust tcnt加一
          if(tcnt==20) //計滿20次(1秒)時
          {
          tcnt=0; //重新再計
          sec++;
          write=1; //1秒寫一次24C08
          if(sec==100) //定時100秒,在從零開始計時
          {sec=0;}
          }
          }
          void main(void)
          {
          TMOD=0x01; //定時器工作在方式1
          ET0=1; EA=1;
          x24c08_init(); //初始化24C08
          sec=x24c08_read(2);//讀出保存的數(shù)據賦于sec
          TH0=(65536-50000)/256; //對TH0 TL0賦值
          TL0=(65536-50000)%256; //使定時器0.05秒中斷一次
          TR0=1; //開始計時
          while(1)
          {
          LED();
          if(write==1) //判斷計時器是否計時一秒
          {
          write=0; //清零
          x24c08_write(2,sec); //在24c08的地址2中寫入數(shù)據sec
          }
          }
          }

          [硬件電路圖]
          基于單片機的I2C的讀寫操作實驗


          p2p機相關文章:p2p原理




          關鍵詞: 單片機 I2C 讀寫操作

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();