新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > IIC總線使用方法

        IIC總線使用方法

        作者: 時間:2016-11-28 來源:網絡 收藏
        #include
        #define uchar unsigned char
        uchar a;
        sbit sda=P2^0;
        sbit scl=P2^1;
        void delay1(uchar z)
        {
        uchar x,y;
        for(x=z;x>0;x--)
        for(y==100;y>0;y--);
        }
        void delay()//延時5微秒左右
        { ;; }
        void start()//起始函數,scl高電平時sda下降沿觸發起始信號
        {
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
        }
        void stop()//停止信號,scl高電平時sda下降沿觸發停止信號
        {
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
        }
        void respons()//應答信號
        {
        uchar i;
        scl=1;
        delay();
        while((sda==1)&&(i<250))//scl=1時候,判斷sda是否=1。sda=1時,沒有應答,sda=0時,while內部為假,退出while語句。當sda總=1時,延時255時間,如果超出255時間,則while語句為假。退while循環,默認應答了。
        i++;
        scl=0;//應答后,將scl變成低電平,因為是第九個時鐘信號,時鐘完了要將電平拉低
        delay();//scl=0,持續一會
        }
        void init()//初始化函數
        {
        scl=1;//總線釋放(空閑)是高電平
        sda=1;
        }
        void write_byte(uchar date)//寫字節,一位一位的寫,數據左移一位,一位一位的傳送最高位
        {
        uchar i,temp;
        temp=date;//要寫入的值給temp
        scl=0;//scl=0時候數據可以不穩定,隨便變化
        delay();
        for(i=0;i<8;i++)
        {
        temp=temp<<1;//temp左移一位,將要最高位放入CY,CY就是PSW.7,來源于最近一次數據軟件改寫的位存儲區
        sda=CY;//數據線上的第一幀位為temp的最高位,也就是CY當中的一位,此時數據在sda中保持穩定的0或1
        delay();//數據保持4.7微秒以上,穩定
        scl=1;//scl=1準備開始傳送數據
        delay();//在這個延時過程中將要temp的最高位,CY的值傳送完畢
        scl=0;//傳送完畢后scl=0,此時傳送數據可以不穩定
        delay();
        }
        sda=1;//將總線釋放
        delay();
        }
        uchar read_byte()//讀函數
        {
        uchar i,j,k;
        scl=0;//scl先底電平,準備高電平時候讀取數據
        delay();
        sda=1;//釋放數據總線,因為此時不知道sda上是高電平還是低電平
        delay();
        for(i=0;i<8;i++)
        {
        scl=1;
        delay();
        j=sda;//將傳輸的數據的第一個位傳送給j
        k=(k<<1)|j;//k是讀出數據,將要k與上j(傳輸的位),傳輸什么得到什么,然后再左移,最終8次后將要一個字節傳送給k
        scl=0;
        delay();
        }
        return k;
        }
        void main()
        {
        init();
        start();//起始信號
        write_byte(0xa0);//寫器件地址,首次寫從機地址1010 0000,前四位固定,后三位是外接口低電平,最后一位是寫的意思
        respons();//應答信號,A
        write_byte(3);//寫入首地址,隨便寫個3
        respons();//應答信號,A
        write_byte(0x55);//寫進去一個數據
        respons();//應答信號
        stop();//結束信號,寫入完畢
        delay1(200);
        start();//準備讀出的開始信號
        write_byte(0xa0);//首先寫進去器件地址
        respons();//應答信號,A
        write_byte(3);//寫入器件首地址
        respons();//應答信號,A
        start();
        write_byte(0xa1);//準備讀出數據,給器件地址1010 0001的意思是要讀出數據
        respons();//應答信號,A
        a=read_byte();
        stop();
        P1=a;
        while(1);
        }


        關鍵詞: IIC總線使用方

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 林西县| 栖霞市| 周至县| 黄陵县| 锡林郭勒盟| 胶南市| 阳朔县| 万宁市| 涟源市| 衡东县| 辽阳县| 宽城| 汤阴县| 五常市| 湟中县| 贵州省| 绥化市| 阜康市| 临朐县| 永寿县| 衡山县| 和顺县| 修水县| 墨竹工卡县| 和龙市| 廉江市| 沙湾县| 柏乡县| 永吉县| 会同县| 岑溪市| 凭祥市| 牟定县| 凤庆县| 防城港市| 茂名市| 清徐县| 通江县| 资源县| 赣榆县| 丹凤县|