新聞中心

        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語言

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宣恩县| 内黄县| 花莲市| 桃源县| 高清| 彭泽县| 元朗区| 龙游县| 屯留县| 浦江县| 安化县| 洞口县| 枝江市| 冕宁县| 岳阳市| 德安县| 绥滨县| 台北县| 富平县| 社旗县| 鹿邑县| 嘉兴市| 凤城市| 九龙县| 东光县| 璧山县| 太原市| 平舆县| 元谋县| 安吉县| 临桂县| 安康市| 呼伦贝尔市| 涟源市| 云龙县| 麟游县| 都江堰市| 米易县| 资阳市| 平安县| 健康|