新聞中心

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

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

        作者: 時間:2013-01-07 來源:網絡 收藏

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

        //#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為讀寫數據輸入/輸出緩沖區的首址
        //ByteQuantity 為要讀寫數據的字節數量
        //Address 為EEPROM的片內地址
        //ControlByte 為EEPROM的控制字節,具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
        //表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
        //EepromType為枚舉變量,需為M2401至M24256中的一種,分別對應24C01至24C256;
        //函數返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
        //ERRORCOUNT為允許最大次數,若出現ERRORCOUNT次操作失效后,則函數中止操作,并返回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語言

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新建县| 东平县| 石屏县| 瓦房店市| 南乐县| 普洱| 罗田县| 大庆市| 息烽县| 鸡西市| 永定县| 库尔勒市| 静乐县| 鄂托克旗| 商城县| 大埔县| 永定县| 仙桃市| 余姚市| 左权县| 昭通市| 剑阁县| 义马市| 肇东市| 乌恰县| 江油市| 龙南县| 西和县| 无棣县| 清河县| 福泉市| 林甸县| 晋宁县| 手游| 临湘市| 惠水县| 高台县| 吉林省| 巨野县| 于都县| 慈利县|