新聞中心

        EEPW首頁 > 嵌入式系統 > 專題 > I2C串行總線標準驅動程序(C51)-萬能程序

        I2C串行總線標準驅動程序(C51)-萬能程序

        作者: 時間:2008-02-01 來源: 收藏
        *------------------------------------------------------------------------------------------
        [文件名] .c
        [版本] 1.1b
        [作者] 鞠春陽
        ===========================================================================================*/#include "reg51.h"
        #include "intrins.h"
        unsigned char SystemError;
        sbit SCL= P1^6; //定義串行時鐘線所在口 使用時根據自己的需要來定義
        sbit SDA= P1^7; //定義串行數據線所在口 使用時根據自己的需要來定義
        #define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
        /*--------------------------------------------------------------------------------
        調用方式:void AD7416_Start(void) 2003/05/04
        函數說明:私有函數,專用
        ---------------------------------------------------------------------------------*/
        void I2CStart(void)
        {
        EA=0;
        SDA=1; SCL=1; SomeNOP();//數據線保持高,時鐘線從高到低一次跳變,I2C通信開始
        SDA=0; SomeNOP();
        SCL=0;
        }
        /*--------------------------------------------------------------------------------
        調用方式:void AD7416_I2CStop(void) 2003/05/04
        函數說明:私有函數,I2C專用
        ---------------------------------------------------------------------------------*/
        void I2CStop(void)
        {
        SCL=0; SDA=0; SomeNOP(); //數據線保持低,時鐘線從低到高一次跳變,I2C通信停止
        SCL=1; SomeNOP(); SDA=1;
        EA=1;
        }
        /*--------------------------------------------------------------------------------
        調用方式:I2CAck(void) 2003/05/13
        函數說明:私有函數,I2C專用,等待從器件接收方的應答
        ACK BY AD7416
        ---------------------------------------------------------------------------------*/
        WaitAck(void)
        {
        unsigned char errtime=255;//因故障接收方無ACK,超時值為255。
        SDA=1;
        SCL=1;
        SystemError=0x10;
        while(SDA)
        { errtime--;
        if(!errtime)
        { AD7416_I2CStop();
        AD7416_SystemError=0x11; //出錯后給全局變量賦值
        return;
        }
        }
        SCL=0;
        }
        /*--------------------------------------------------------------------------------
        調用方式:void SendAck(void) ﹫2003/05/13
        函數說明:私有函數,I2C專用,主器件為接收方,從器件為發送方時,應答信號。
        ---------------------------------------------------------------------------------*/
        void SendAck(void)
        {
        SDA=0; SomeNOP(); //數據線保持低,時鐘線發生一次從高低的跳變 發送一個應答信號
        SCL=1; SomeNOP();
        SCL=0;
        }
        /*--------------------------------------------------------------------------------
        調用方式:void SendAck(void) ﹫2003/05/13
        函數說明:私有函數,I2C專用,主器件為接收方,從器件為發送方時,非應答信號。
        --------------------------------------------------------------------------------*/
        void SendNotAck(void)
        {
        SDA=1; SomeNOP(); //數據線保持高,時鐘線發生一次從高低的跳變 沒有應答
        SCL=1; SomeNOP();
        SCL=0;
        }
        /*--------------------------------------------------------------------------------
        調用方式:void I2CSend(uchar ch) 2003/05/13
        函數說明:私有函數,I2C專用
        ---------------------------------------------------------------------------------*/
        void I2CSendByte(Byte ch)
        {
        unsigned char i=8;
        while (i--)
        {
        SCL=0;_nop_();
        SDA=(bit)(ch&0x80); ch


        關鍵詞: I2C 串行總線 C51

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 正定县| 房山区| 梁山县| 泾阳县| 湟源县| 宝坻区| 宁波市| 华安县| 广州市| 临湘市| 老河口市| 常宁市| 胶南市| 桐庐县| 固安县| 兰西县| 台北市| 定日县| 江门市| 灵石县| 禄丰县| 开阳县| 泰宁县| 银川市| 随州市| 阜南县| 北安市| 雷州市| 定州市| 博兴县| 阿坝| 左权县| 济宁市| 桂平市| 榕江县| 阿克苏市| 连云港市| 浮梁县| 五大连池市| 永昌县| 正安县|