新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > IC總線讀寫程序-51

        IC總線讀寫程序-51

        作者: 時間:2016-11-26 來源:網絡 收藏
        //-----------------------函數聲明,變量定義--------------------------------------------------------

        #include
        #include
        sbit SDA=P1^0;// 將p1.0口模擬數據口
        sbit SCL=P1^1;// 將p1.1口模擬時鐘口
        #defineNUM10 //接收和發送緩存區的深度
        #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
        unsigned char idata sendbuf[NUM];// 數據發送緩沖區
        unsigned char idata receivebuf[NUM];// 數據接收緩沖區
        bitbdata SystemError;// 從機錯誤標志位
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: iic_start()
        // 函數功能: 啟動I2C總線子程序
        //--------------------------------------------------------------------------------------------------
        void iic_start(void)
        { EA=0;//時鐘保持高,數據線從高到低一次跳變,I2C通信開始
        SDA = 1;
        SCL = 1;
        delayNOP();// 延時5us
        SDA = 0;
        delayNOP();
        SCL = 0;
        }
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: iic_stop()
        // 函數功能: 停止I2C總線數據傳送子程序
        //--------------------------------------------------------------------------------------------------
        void iic_stop(void)
        {
        SDA = 0;//時鐘保持高,數據線從低到高一次跳變,I2C通信停止
        SCL = 1;
        delayNOP();
        SDA = 1;
        delayNOP();
        SCL = 0;
        }
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: slave_ACK
        // 函數功能: 從機發送應答位子程序
        //--------------------------------------------------------------------------------------------------
        void slave_ACK(void)
        {
        SDA = 0;
        SCL = 1;
        delayNOP();
        SDA = 1;
        SCL = 0;
        }
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: slave_NOACK
        // 函數功能: 從機發送非應答位子程序,迫使數據傳輸過程結束
        //--------------------------------------------------------------------------------------------------
        void slave_NOACK(void)
        {
        SDA = 1;
        SCL = 1;
        delayNOP();
        SDA = 0;
        SCL = 0;
        }
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: check_ACK
        // 函數功能: 主機應答位檢查子程序,迫使數據傳輸過程結束
        //--------------------------------------------------------------------------------------------------
        void check_ACK(void)
        {
        SDA = 1;// 將p1.0設置成輸入,必須先向端口寫1
        SCL = 1;
        F0 = 0;
        if(SDA == 1)// 若SDA=1表明非應答,置位非應答標志F0
        F0 = 1;
        SCL = 0;
        }

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

        //--------------------------------------------------------------------------------------------------
        // 函數名稱: IICSendByte
        // 入口參數: ch
        // 函數功能: 發送一個字節
        //--------------------------------------------------------------------------------------------------
        void IICSendByte(unsigned char ch)
        {
        unsigned char idata n=8;// 向SDA上發送一位數據字節,共八位
        while(n--)
        {
        if((ch&0x80) == 0x80)// 若要發送的數據最高位為1則發送位1
        {
        SDA = 1;// 傳送位1
        SCL = 1;
        delayNOP();
        SDA = 0;
        SCL = 0;
        }
        else
        {
        SDA = 0;// 否則傳送位0
        SCL = 1;
        delayNOP();
        SCL = 0;
        }
        ch = ch<<1;// 數據左移一位
        }
        }
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: IICreceiveByte
        // 返回接收的數據
        // 函數功能: 接收一字節子程序
        //--------------------------------------------------------------------------------------------------
        unsigned char IICreceiveByte(void)
        {
        unsigned char idata n=8;// 從SDA線上讀取一上數據字節,共八位
        unsigned char tdata;
        while(n--)
        {
        SDA = 1;
        SCL = 1;
        tdata = tdata<<1;// 左移一位,或_crol_(temp,1)
        if(SDA == 1)
        tdata = tdata|0x01;// 若接收到的位為1,則數據的最后一位置1
        else
        tdata = tdata&0xfe;// 否則數據的最后一位置0
        SCL=0;
        }
        return(tdata);
        }
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: writeNbyte
        // 入口參數: slave_add從機地址,n要發送的數據個數
        // 函數功能: 發送n位數據子程序
        //--------------------------------------------------------------------------------------------------
        void writeNbyte(unsigned char slave_add, unsigned char n)
        {
        unsigned char idata send_da,i=0;
        iic_start();// 啟動I2C
        IICSendByte(slave_add);// 發送地址位
        check_ACK();// 檢查應答位
        if(F0 == 1)
        {
        SystemError = 1;
        return;// 若非應答表明器件錯誤或已壞,置錯誤標志位SystemError
        }
        while(n--)
        {
        send_da = sendbuf[i++];
        IICSendByte(send_da);
        check_ACK();// 檢查應答位
        if (F0 == 1)
        {
        SystemError=1;
        return;// 若非應答表明器件錯誤或已壞,置錯誤標志位SystemError
        }
        }
        iic_stop();// 全部發完則停止
        }
        //--------------------------------------------------------------------------------------------------
        // 函數名稱: receiveNbyte
        // 入口參數: slave_add從機地址,n要接收的數據個數
        // 函數功能: 接收n位數據子程序
        //--------------------------------------------------------------------------------------------------
        void receiveNbyte(unsigned char idata slave_add, unsigned char n)
        {
        unsigned char idata receive_da,i=0;
        iic_start();
        IICSendByte(slave_add);
        check_ACK();
        if(F0 == 1)
        {
        SystemError = 1;
        return;
        }
        while(n--)
        {
        receive_da=IICreceiveByte();
        receivebuf[i++]=receive_da;
        slave_ACK();// 收到一個字節后發送一個應答位
        }
        slave_NOACK();// 收到最后一個字節后發送一個非應答位
        iic_stop();
        }



        關鍵詞: IC總線讀寫程序5

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 樟树市| 洛川县| 东阳市| 北安市| 汝阳县| 天台县| 托克逊县| 仁怀市| 油尖旺区| 碌曲县| 温州市| 靖边县| 乐东| 稷山县| 齐河县| 仲巴县| 迭部县| 蓝田县| 台东县| 张家口市| 北辰区| 根河市| 大埔区| 佛学| 察哈| 辰溪县| 盐城市| 普兰店市| 包头市| 施甸县| 临颍县| 青海省| 商南县| 舟山市| 错那县| 阿拉善左旗| 称多县| 祁阳县| 南宁市| 庄浪县| 黄骅市|