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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > I2C總線驅動(C51語言源程序)

          I2C總線驅動(C51語言源程序)

          作者: 時間:2013-01-07 來源:網(wǎng)絡 收藏

          i2c 總線上單片機系統(tǒng)中常用到的總線技術這里給大家介紹一個源程序。

          //#pragma ot(6,SIZE)
          #i nclude AT89X52.H>
          #i nclude intrins.h>
          #define ERRORCOUNT 10
          #define read 0xa1
          #define write 0xa0
          sbit SDA=P1^6;
          sbit SCL=P1^5;
          enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
          enum eepromtype EepromType;

          //DataBuff為讀寫數(shù)據(jù)輸入/輸出緩沖區(qū)的首址
          //ByteQuantity 為要讀寫數(shù)據(jù)的字節(jié)數(shù)量
          //Address 為EEPROM的片內地址
          //ControlByte 為EEPROM的控制字節(jié),具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
          //表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
          //EepromType為枚舉變量,需為M2401至M24256中的一種,分別對應24C01至24C256;
          //函數(shù)返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
          //ERRORCOUNT為允許最大次數(shù),若出現(xiàn)ERRORCOUNT次操作失效后,則函數(shù)中止操作,并返回1
          //SDA和SCL由用戶自定義,這里暫定義為P0^0和P0^1;
          //其余的用戶不用管,只要把只子程序放在你的程序中并調用它就可以了;


          /*******************************I2C(源程序)**********************************************/
          bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
          unsigned char ControlByte,enum eepromtype EepromType)
          {
          void Delay(unsigned char DelayCount);
          void I2CStart(void);
          void I2CStop(void);
          bit I2CRecAck(void);
          void I2CNoAck(void);
          void I2CAck(void);
          unsigned char I2CReceiveByte(void);
          void I2CSendByte(unsigned char sendbyte);
          unsigned char data j,i=ERRORCOUNT;
          bit errorflag=1;
          while(i--)
          {
          I2CStart();
          I2CSendByte(ControlByte0xfe);
          if(I2CRecAck())
          continue;
          if(EepromType>M2416)
          {
          I2CSendByte((unsigned char)(Address>>8));
          if(I2CRecAck())
          continue;
          }
          I2CSendByte((unsigned char)Address);
          if(I2CRecAck())
          continue;
          if(!(ControlByte0x01))
          {
          j=ByteQuantity;
          errorflag=0; //********clr errorflag
          while(j--)
          {
          I2CSendByte(*DataBuff++);
          if(!I2CRecAck())
          continue;
          errorflag=1;
          break;
          }
          if(errorflag==1)
          continue;
          break;
          }
          else
          {
          I2CStart();
          I2CSendByte(ControlByte);
          if(I2CRecAck())
          continue;
          while(--ByteQuantity)
          {
          *DataBuff++=I2CReceiveByte();
          I2CAck();
          }
          *DataBuff=I2CReceiveByte(); //read last byte data
          I2CNoAck();
          errorflag=0;
          break;
          }
          }

          I2CStop();
          if(!(ControlByte0x01))
          {
          Delay(255);
          Delay(255);
          Delay(255);
          Delay(255);
          }
          return(errorflag);
          }


          /*****************以下是對I2C總線的操作子程序***/
          /*****************啟動總線**********************/
          void I2CStart(void)
          {
          SCL=0; //
          SDA=1;
          SCL=1;
          _nop_();
          _nop_();
          _nop_();
          SDA=0;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          SCL=0;
          SDA=1; //
          }


          上一頁 1 2 下一頁

          關鍵詞: I2C 總線驅動 C51語言

          評論


          相關推薦

          技術專區(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); })();