新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機SPI總線的實現

        51單片機SPI總線的實現

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

        #include

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

        #include

        sbit SCK=P1^0;// 將p1.0口模擬時鐘輸出

        sbit MOSI=P1^1;// 將p1.1口模擬主機輸出

        sbit MISO=P1^2;// 將p1.1口模擬主機輸入

        sbit SS1=P1^3;// 將p1.1口模擬片選

        #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

        //-----------------------------------------------------------------------------------------------

        // 函數名稱: SPISendByte

        // 入口參數: ch

        // 函數功能: 發送一個字節

        //------------------------------------------------------------------------------------------------

        voidSPISendByte(unsignedcharch)

        {

        unsignedcharidata n=8;// 向SDA上發送一位數據字節,共八位

        SCK = 1 ;//時鐘置高

        SS1 = 0 ;//選擇從機

        while(n--)

        {

        delayNOP();

        SCK = 0 ;//時鐘置低

        if((ch&0x80) == 0x80)// 若要發送的數據最高位為1則發送位1

        {

        MOSI = 1;// 傳送位1

        }

        else

        {

        MOSI = 0;// 否則傳送位0

        }

        delayNOP();

        ch = ch<<1;// 數據左移一位

        SCK = 1 ;//時鐘置高

        }

        }

        //------------------------------------------------------------------------------------------------

        // 函數名稱: SPIreceiveByte

        // 返回接收的數據

        // 函數功能: 接收一字節子程序

        //------------------------------------------------------------------------------------------------

        unsignedcharSPIreceiveByte()

        {

        unsignedcharidata n=8;// 從MISO線上讀取一上數據字節,共八位

        unsignedchartdata;

        SCK = 1;//時鐘為高

        SS1 = 0;//選擇從機

        while(n--)

        {

        delayNOP();

        SCK = 0;//時鐘為低

        delayNOP();

        tdata = tdata<<1;// 左移一位,或_crol_(temp,1)

        if(MISO == 1)

        tdata = tdata|0x01;// 若接收到的位為1,則數據的最后一位置1

        else

        tdata = tdata&0xfe;// 否則數據的最后一位置0

        SCK=1;

        }

        return(tdata);

        }

        //------------------------------------------------------------------------------------------------

        // 函數名稱: SPIsend_receiveByte

        // 入口參數: ch

        // 返回接收的數據

        // 函數功能:串行輸入/輸出子程序

        //------------------------------------------------------------------------------------------------

        unsignedcharSPIsend_receiveByte(unsignedcharch)

        {

        unsignedcharidata n=8;// 從MISO線上讀取一上數據字節,共八位

        unsignedchartdata;

        SCK = 1;//時鐘為高

        SS1 = 0;//選擇從機

        while(n--)

        {

        delayNOP();

        SCK = 0;//時鐘為低

        delayNOP();

        {

        tdata = tdata<<1;// 左移一位,或_crol_(temp,1)

        if(MISO == 1)

        tdata = tdata|0x01;// 若接收到的位為1,則數據的最后一位置1

        else

        tdata = tdata&0xfe;// 否則數據的最后一位置0

        }

        {

        if((ch&0x80) == 0x80)// 若要發送的數據最高位為1則發送位1

        {

        MOSI = 1;// 傳送位1

        }

        else

        {

        MOSI = 0;// 否則傳送位0

        }

        ch = ch<<1;// 數據左移一位

        }

        SCK=1;

        }

        return(tdata);

        }



        關鍵詞: 51單片機SPI總

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 招远市| 井冈山市| 太白县| 长葛市| 诏安县| 九江市| 德阳市| 修水县| 九龙县| 临泉县| 藁城市| 建阳市| 老河口市| 麻江县| 垣曲县| 海门市| 广宁县| 长垣县| 唐河县| 博爱县| 景洪市| 济宁市| 林芝县| 衡南县| 天台县| 东乌| 阳西县| 溧水县| 巫山县| 营口市| 曲松县| 双鸭山市| 吉林省| 华宁县| 无极县| 闸北区| 汝城县| 彭阳县| 全南县| 繁昌县| 石棉县|