新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機—再論IIC—軟件通用包(匯編、c語言)—03

        51單片機—再論IIC—軟件通用包(匯編、c語言)—03

        作者: 時間:2016-11-25 來源:網絡 收藏

        3)主控器向被控器發送應答位信號子程序MACK(由于這個信號和發送非應答信號在c語言里寫在了一起,所以最后寫c語言的程序)

        ;--------------------------------------------------------------
        ;發送應答信號子程序
        MACK:
        CLRSDA
        NOP
        NOP
        SETBSCL
        NOP;保持數據時間,既SCL為高,時間大于4.7us
        NOP
        NOP
        NOP
        NOP
        CLRSCL
        NOP
        NOP
        RET

        4)主控器向被控器發送非應答新號子程序MNACK

        ;------------------------------------------------------------
        ;發送非應答信號子程序
        MNACK:
        SETBSDA
        NOP
        NOP
        SETBSCL
        NOP;保持數據時間,既SCL為高,時間大于4.7us
        NOP
        NOP
        NOP
        NOP
        CLRSCL
        NOP
        NOP
        RET

        然后就是上兩個的c的程序:

        //---------------------------------------------------------------------
        //主控器件向被控器件發送應答函數
        void IIC_ack_send(bit a)
        {
        if(a==0) //發應答信號
        sda=0;
        else
        sda=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=0;
        _nop_();
        _nop_();
        }

        5)主控器件檢查被控器件發送來的應答位

        ;---------------------------------------------------------------
        ;檢測應答位子程序
        ;返回值ACK=1時表示應達
        CACK:
        SETBSDA
        NOP
        NOP
        SETBSCL
        CLRACK
        NOP
        NOP
        MOVC,SDA
        JCCEND
        SETBACK ;應答位置1,既返回應答位為1
        CEND:
        NOP
        CLRSCL
        NOP

        //-----------------------------------------------------------------
        //主控器件接收應答函數
        void IIC_ack_acc()
        {
        _nop_();
        _nop_();
        sda=1;//8位數據發送完后,準備接收數據
        _nop_();
        _nop_();
        scl=1;
        _nop_();
        _nop_();
        _nop_();
        if(sda==1)
        ack=0;
        else ack=1;//接收到應答位,ack為1,否則置0
        scl=0;
        _nop_();
        _nop_();
        }

        在使用上述的子程序時,如果單片機不是12MHz,自己調整啊~~哈哈

        2、IIC總線數據傳送的模擬子程序

        從IIC總線的數據操作中可以看出,出了起始位、停止位、發送應答函數、發送非應答函數、應答檢測函數(這里書上把它看作了數據傳送的那部分,管他呢~~~呵呵),還有發送一字節數據,接受以字節數據,發送n字節數據,接收n字節數據這幾個子程序。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 昂仁县| 盘锦市| 乐至县| 泰安市| 新野县| 右玉县| 上思县| 镇江市| 沂南县| 宜川县| 图木舒克市| 巴林左旗| 万安县| 鄢陵县| 平江县| 吉首市| 四会市| 平舆县| 徐汇区| 萝北县| 左权县| 永清县| 镇原县| 信阳市| 漠河县| 和政县| 龙岩市| 正宁县| 铜鼓县| 灵台县| 宝清县| 麻江县| 巴彦淖尔市| 瑞丽市| 额尔古纳市| 威信县| 兰州市| 教育| 香港| 岱山县| 来凤县|