新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC單片機的I2C 24LC02 C讀寫程序

        PIC單片機的I2C 24LC02 C讀寫程序

        作者: 時間:2009-12-29 來源:網絡 收藏


        /*************************************************************
        起動總線函數
        函數原型: void start_i2c();
        Function: start on the bus
        *************************************************************/
        void start_i2c()
        {
        SDA=1; //發送啟始條件的數據信號
        nop();
        SCL=1;
        nop();nop();nop();nop();nop(); //要求建立時間大于4,7S
        SDA=0; //發送起始信號
        nop();nop();nop();nop();nop();
        SCL=0; //鉗住總線,準備發送數據或接收數據
        nop();nop();
        }


        /*************************************************************
        停止總線函數
        函數原型: void stop_i2c();
        Function: stop the bus
        **************************************************************/
        void stop_i2c()
        {

        SDA=0; //發送結束條件的數據信號
        nop();
        SCL=1;
        nop();nop();nop();nop();nop();
        SDA=1;
        nop();nop();nop();nop();
        }

        /*====================================================
        字節數據傳送函數
        函數原型: void send_byte(uchar c);
        Function: 將數據C發送出去,可以是地址,也可以是數據,發完后等待回應,并對此狀態
        位進行操作(不應答或非應答都使ack=0 ),發送數據正常,ack=1;ack=0
        表示被控器無應答或損壞。
        ====================================================*/
        void send_byte(uchar c)
        {
        uchar bit_count;
        for (bit_count=0;bit_count8;bit_count++)
        {
        if ((cbit_count)0x80) {SDA=1;}
        else {SDA=0;}
        nop();
        SCL=1;
        nop();nop();nop();nop();nop();
        SCL=0;
        }
        nop();nop();
        SDA=1;
        nop();nop();
        SCL=1;
        nop();nop();nop();
        if (RC4==1) ack=0;
        else ack=1; //用ASK=1為有應答信號
        SCL=0;
        nop();nop();
        }

        /*================================================
        字節數據接收函數
        函數原型:uchar receive_byte();
        FUNCTION: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
        發完后請用應答函數。
        ====================================================*/
        uchar receive_byte()
        {
        uchar retc,bit_count;
        retc=0;
        SDA=1;
        for (bit_count=0;bit_count8;bit_count++)
        {
        nop();
        SCL=0;
        nop();nop();nop();nop();nop();
        SCL=1;
        nop();nop();
        retc=retc1;
        if (RC4==1) retc=retc+1;
        nop();nop();
        }
        SCL=0;
        nop();nop();
        return (retc);
        }


        /*=================================================
        向有子地址器件發送多字節數據函數
        函數原型: bit I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
        Function: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla。如果
        返回1表示操作成功,否則操作有誤。
        ================================================*/
        void I_send_str(uchar sla,uchar suba,uchar *s,uchar no)
        {
        uchar i;
        start_i2c();
        send_byte(sla);
        if (ack==0) i2c_error();
        send_byte(suba);
        if (ack==0) i2c_error();
        for (i=0;ino;i++)
        {
        send_byte(*s);
        if (ack==0) i2c_error();
        s++;
        }
        stop_i2c();
        // return(1);
        }

        /*****************************************************************
        延時函數
        函數原型: void delay_250ms();
        FUNCTION: 延明250ms
        *****************************************************************/
        void delay_250ms()
        {
        unsigned int d=24999;
        while (--d);
        }

        /*****************************************************************
        總線錯誤函數
        函數原型: void i2c_error();
        Function: 通過RD7閃動8次表示總線操作失敗一次報警。
        *****************************************************************/
        void i2c_error ()
        {
        uchar i;
        for (i=0;i8;i++)
        {
        RD7=0;
        delay_250ms();
        RD7=1;
        delay_250ms();
        }

        }
        /**********END**************/

        本文引用地址:http://www.104case.com/article/173493.htm

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 南岸区| 衢州市| 镇坪县| 彭泽县| 泰安市| 峨山| 天台县| 锦州市| 霍林郭勒市| 宣化县| 内黄县| 绿春县| 曲松县| 南投县| 东台市| 新巴尔虎左旗| 井研县| 泗水县| 莱阳市| 徐汇区| 林甸县| 将乐县| 方正县| 农安县| 蒲城县| 合川市| 江阴市| 清涧县| 余干县| 外汇| 治多县| 宁都县| 安塞县| 凌源市| 定陶县| 玛沁县| 密云县| 双流县| 通渭县| 镇雄县| 航空|