新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > I2C總線在8051單片機系統中的應用

        I2C總線在8051單片機系統中的應用

        作者: 時間:2013-01-06 來源:網絡 收藏


          4、虛擬軟件結構

          對于虛擬來說要實現其功能主要是要軟件要注意I2C器件的操作時序,總線的運行由主機控制。所謂主機即啟動數據的傳送即發出啟動信號,發出時鐘信號,傳送結束時發出停止信號的設備,通常主機是微處理器。被主機尋訪的設備都稱為從機。為了進行通訊,每個接到的設備都有一個唯一的地址,以便于主機尋訪。主機和從機的數據傳送,可以由主機發送數據到從機,也可以是從機發到主機。凡是發送數據到總線的設備稱為發送器,從總線上接收數據的設備被稱為接受器。根據I2C的時序,軟件分為開始、停止、應答、檢查應答、不產生應答、讀操作、寫操作。以下為C程序清單調試成功。


          #include
          Sbit sda=P1^7;
          Sbit SCL=P1^6;


          啟動函數,在SCL為高時,SDA的下降沿為啟動信號。

        void Start(void)

        { scl=0; //SCL處于低電平時,SDA才能改變
        sda=1;// 一個"開始"狀態,該狀態必須在其他命令之前執行
        scl=1; // 當scl為高電平時sda的下降沿表示開始狀態
        _nop_(); _nop_(); _nop_(); //給一個延時
        sda=0; //給下降沿表示開始
        _nop_(); _nop_(); _nop_(); _nop_();
        scl=0; //恢復低電平以改變sda的值
        sda=1; }


          停止函數,在SCL為高時,SDA的上升沿為停止信號。

        void Stop(void)
        {scl=0; //SCL處于低電平時,SDA改變數值 */
        sda=0; //scl為高電平時,sda的上升沿表示停止,
        scl=1; //scl為高電平時改變sda的狀態表示啟動,停止
        _nop_(); _nop_(); _nop_(); // 延時
        sda=1;
        _nop_(); _nop_(); _nop_();
        scl=0; }
        /* * * * * 檢查應答位 * * * * */
        bit RecAck(void)
        { scl=0; //在scl為0的時候改變sda的值
        sda=1;
        scl=1; //在scl為1的時候等待sda值的變化,在器件接受到數據后會把sda拉低。
        _nop_(); _nop_(); _nop_(); _nop_();
        CY=sda; // 因為返回值總是放在CY中的
        scl=0;
        _nop_();
        return(CY); //如果為CY為低則表示接受成功,如果為高,則表示接受失敗。
        }
        /* * * * *對I2C總線產生應答(一般用在讀操作中) * * * * */
        void Ack(void)
        {
        sda=0;// EEPROM通過在收到每個地址或數據之后,
        _nop_();_nop_();
        scl=1;//置SDA低電平的方式確認表示收到讀SDA口狀態
        _nop_(); _nop_(); _nop_(); _nop_();
        scl=0;
        _nop_();
        sda=1;
        }

        /* * * * * * * * * 不對I2C總線產生應答 * * * * */
        void NoAck(void)
        { sda=1;
        scl=1;
        _nop_(); _nop_(); _nop_(); _nop_();
        scl=0;
        }


          向I2C總線寫數據,每次寫8位數據。

        void Send(uchar sendbyte)
        {uchar j=8;
        for(;j>0;j--)
        {scl=0;//拉低scl準備給上升沿
        delay(5);//延時
        sendbyte = 1;// 使CY=sendbyte^7;
        sda=CY; // CY 進位標志位
        scl=1; //給上升沿,發出sda的狀態值
        }
        scl=0;
        }


          從I2C總線上讀數據子程序 ,每次讀8位數據。

        uchar Receive(void)
        { register receivebyte,i=8;
        scl=0;
        while(i--)
        { scl=1; //拉高scl準備給下降沿
        receivebyte=(receivebyte 1)|sda; //接受值左移一位把低位和sda相或得到sda的狀態值
        scl=0; //給下降沿發出sda的狀態值
        }
        return(receivebyte);
        }


          5、結論

          本文介紹了I2C總線的組成及時序,并以ATMEL公司的為例給出了用C語言模擬I2C總線的時序的起始、停止及CPU向I2C總線的發送和接收8位字節的程序。


          6、參考文獻

          【1】馬忠梅.籍順心.張凱.馬巖.單片機的C語言應用程序設計【M】.北京航空航天大學出版社.2003

          【2】楊將新.李華軍.劉東駿.單片機程序設計及應用從基礎到實踐【M】.電子工業出版社.2006

          【3】邊春遠.王志強.MCS-51單片機應用開發實用子程序【M】.人民郵電出版社.2005

          【4】陳小忠.黃寧.趙小俠.單片機接口技術實用子程序【M】.人民郵電出版社.2006

          【5】陳柄和.C語言與C++語言程序設計【M】. 北京航空航天大學出版社.2004

        c++相關文章:c++教程



        上一頁 1 2 下一頁

        關鍵詞: I2C總線 8051 AT24C256

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 海伦市| 黔南| 穆棱市| 浦东新区| 莱州市| 龙门县| 屏东市| 苏尼特左旗| 拉萨市| 潢川县| 牡丹江市| 清水河县| 伊吾县| 安义县| 阜新| 宁德市| 伊金霍洛旗| 肇源县| 延安市| 义乌市| 科技| 温州市| 柘城县| 思南县| 黔南| 启东市| 临朐县| 西林县| 巩义市| 古蔺县| 耒阳市| 永善县| 吉首市| 恩施市| 南郑县| 西平县| 邯郸县| 中西区| 泰安市| 东丰县| 昭平县|