新聞中心

        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

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 盐山县| 乐业县| 沙湾县| 庄河市| 胶州市| 铜陵市| 天峻县| 江永县| 涡阳县| 寿光市| 来宾市| 姚安县| 海晏县| 彩票| 高雄市| 库尔勒市| 屏东县| 尼木县| 怀化市| 招远市| 涿州市| 高台县| 津市市| 高淳县| 中西区| 自治县| 淮南市| 会泽县| 建湖县| 波密县| 新民市| 富顺县| 汉沽区| 江西省| 兴业县| 深水埗区| 潞城市| 西丰县| 乐业县| 灵山县| 石阡县|