新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)—再論IIC—軟件通用包(匯編、c語(yǔ)言)—03

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

        作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏
        感覺(jué)心有不甘,呵呵,小小整理一下。

        我們知道51單片機(jī)中具有IIC總線接口的畢竟是少數(shù)(其實(shí)我就不知道那款~~)如果是是不帶IIC總線的單片機(jī),并不必?cái)U(kuò)展IIC總線接口,只是需要通過(guò)軟件模擬,這無(wú)疑會(huì)給IIC總線的應(yīng)用提供更廣泛的空間。通常大多數(shù)的單片機(jī)應(yīng)用系統(tǒng)中只有一個(gè)CPU,這種單主系統(tǒng)如果采用IIC總線技術(shù),則總線上只有單片機(jī)對(duì)IIC總線從器件的訪問(wèn),沒(méi)有總線的競(jìng)爭(zhēng)問(wèn)題。這是后只需要模擬主發(fā)送和主接收時(shí)序。基于上述考慮,(這才是重點(diǎn),呵呵),提供在這種使用情況下的時(shí)序模擬軟件,使IIC總線的使用不受單片機(jī)必須帶有IIC總線接口的限制。

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

        下面的9個(gè)例子可以作為一個(gè)軟件包,這個(gè)軟件放入單片機(jī)系統(tǒng)的程序程序存儲(chǔ)器中,以便用來(lái)調(diào)用。

        1、IIC總線典型信號(hào)時(shí)序及模擬子程序(其實(shí)上一篇已經(jīng)介紹過(guò)了,不過(guò)我這里有點(diǎn)補(bǔ)充,順便小小介紹一下吧)

        IIC總線上數(shù)據(jù)傳送時(shí),有起始位,停止位,應(yīng)答位,非應(yīng)答位等信號(hào)。按照典型IIC總線傳送速率的要求,如圖:



        對(duì)于IIC總線的典型信號(hào),可以用指令操作來(lái)模擬其時(shí)序過(guò)程。

        若89C51單片機(jī)的系統(tǒng)時(shí)鐘為12MHz,相信的單周期指令為1us,則起始位(START)、停止位(STOP)、發(fā)送應(yīng)答位(MACK)、發(fā)送非應(yīng)答位(MNACK)的5個(gè)模擬子程序如下:

        1)啟動(dòng)IIC總線子程序START(先是匯編,然后是c語(yǔ)言的)

        ;--------------------------------------------------------
        ;發(fā)開(kāi)始信號(hào)子程序
        START:SETBSDA
        SETBSCL;起始條件建立大于4.7us
        NOP
        NOP
        NOP
        NOP
        NOP
        CLRSDA;起始條件鎖定大于4us
        NOP
        NOP
        NOP
        NOP
        NOP
        CLRSCL;鉗住總線,準(zhǔn)備好發(fā)送數(shù)據(jù)
        NOP
        RET

        //----------------------------------------------------------
        //開(kāi)始信號(hào)函數(shù)
        void IIC_start()
        {
        sda=1;
        _nop_();
        scl=1;//開(kāi)始信號(hào)建立時(shí)間大于4.7us
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        sda=0; //開(kāi)始信號(hào)鎖定大于4us
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        scl=0;//鉗住IIC總線,準(zhǔn)備發(fā)送或者接收數(shù)據(jù)
        _nop_();
        _nop_();
        }

        2)停止IIC總線程序STOP(先是匯編,后是c語(yǔ)言)

        ;--------------------------------------------------------
        ;發(fā)結(jié)束信號(hào)子程序
        STOP:CLRSDA
        NOP
        SETBSCL;結(jié)束總時(shí)間大于4us
        NOP
        NOP
        NOP
        NOP
        NOP
        SETBSDA
        NOP ;保證一個(gè)終止信號(hào)和其實(shí)信號(hào)的空閑時(shí)間大于4.7us
        NOP
        NOP
        NOP
        NOP
        RET

        //---------------------------------------------------------------
        //結(jié)束信號(hào)函數(shù)
        void IIC_stop()
        {
        sda=0;
        _nop_();
        scl=1; //結(jié)束時(shí)間大于4us
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        sda=1;//保證一個(gè)終止信號(hào)和其實(shí)信號(hào)的空閑時(shí)間大于4.7us
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        }


        上一頁(yè) 1 2 3 4 下一頁(yè)

        關(guān)鍵詞: 51單片機(jī)IIC軟件通用

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 遂川县| 改则县| 宝清县| 满洲里市| 宁波市| 山阳县| 铜鼓县| 洛隆县| 阿克苏市| 应城市| 当雄县| 蛟河市| 土默特左旗| 中宁县| 平凉市| 泾源县| 绥德县| 竹溪县| 南昌县| 姜堰市| 山西省| 天水市| 镇雄县| 长葛市| 石景山区| 大方县| 枣强县| 小金县| 西乌| 正镶白旗| 九寨沟县| 尚义县| 黑山县| 隆回县| 双桥区| 米泉市| 望奎县| 额尔古纳市| 绵竹市| 汉寿县| 泌阳县|