新聞中心

        IIC總線使用方法

        作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        #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()//延時(shí)5微秒左右
        { ;; }
        void start()//起始函數(shù),scl高電平時(shí)sda下降沿觸發(fā)起始信號(hào)
        {
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
        }
        void stop()//停止信號(hào),scl高電平時(shí)sda下降沿觸發(fā)停止信號(hào)
        {
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
        }
        void respons()//應(yīng)答信號(hào)
        {
        uchar i;
        scl=1;
        delay();
        while((sda==1)&&(i<250))//scl=1時(shí)候,判斷sda是否=1。sda=1時(shí),沒有應(yīng)答,sda=0時(shí),while內(nèi)部為假,退出while語句。當(dāng)sda總=1時(shí),延時(shí)255時(shí)間,如果超出255時(shí)間,則while語句為假。退while循環(huán),默認(rèn)應(yīng)答了。
        i++;
        scl=0;//應(yīng)答后,將scl變成低電平,因?yàn)槭堑诰艂€(gè)時(shí)鐘信號(hào),時(shí)鐘完了要將電平拉低
        delay();//scl=0,持續(xù)一會(huì)
        }
        void init()//初始化函數(shù)
        {
        scl=1;//總線釋放(空閑)是高電平
        sda=1;
        }
        void write_byte(uchar date)//寫字節(jié),一位一位的寫,數(shù)據(jù)左移一位,一位一位的傳送最高位
        {
        uchar i,temp;
        temp=date;//要寫入的值給temp
        scl=0;//scl=0時(shí)候數(shù)據(jù)可以不穩(wěn)定,隨便變化
        delay();
        for(i=0;i<8;i++)
        {
        temp=temp<<1;//temp左移一位,將要最高位放入CY,CY就是PSW.7,來源于最近一次數(shù)據(jù)軟件改寫的位存儲(chǔ)區(qū)
        sda=CY;//數(shù)據(jù)線上的第一幀位為temp的最高位,也就是CY當(dāng)中的一位,此時(shí)數(shù)據(jù)在sda中保持穩(wěn)定的0或1
        delay();//數(shù)據(jù)保持4.7微秒以上,穩(wěn)定
        scl=1;//scl=1準(zhǔn)備開始傳送數(shù)據(jù)
        delay();//在這個(gè)延時(shí)過程中將要temp的最高位,CY的值傳送完畢
        scl=0;//傳送完畢后scl=0,此時(shí)傳送數(shù)據(jù)可以不穩(wěn)定
        delay();
        }
        sda=1;//將總線釋放
        delay();
        }
        uchar read_byte()//讀函數(shù)
        {
        uchar i,j,k;
        scl=0;//scl先底電平,準(zhǔn)備高電平時(shí)候讀取數(shù)據(jù)
        delay();
        sda=1;//釋放數(shù)據(jù)總線,因?yàn)榇藭r(shí)不知道sda上是高電平還是低電平
        delay();
        for(i=0;i<8;i++)
        {
        scl=1;
        delay();
        j=sda;//將傳輸?shù)臄?shù)據(jù)的第一個(gè)位傳送給j
        k=(k<<1)|j;//k是讀出數(shù)據(jù),將要k與上j(傳輸?shù)奈唬瑐鬏斒裁吹玫绞裁矗缓笤僮笠疲罱K8次后將要一個(gè)字節(jié)傳送給k
        scl=0;
        delay();
        }
        return k;
        }
        void main()
        {
        init();
        start();//起始信號(hào)
        write_byte(0xa0);//寫器件地址,首次寫從機(jī)地址1010 0000,前四位固定,后三位是外接口低電平,最后一位是寫的意思
        respons();//應(yīng)答信號(hào),A
        write_byte(3);//寫入首地址,隨便寫個(gè)3
        respons();//應(yīng)答信號(hào),A
        write_byte(0x55);//寫進(jìn)去一個(gè)數(shù)據(jù)
        respons();//應(yīng)答信號(hào)
        stop();//結(jié)束信號(hào),寫入完畢
        delay1(200);
        start();//準(zhǔn)備讀出的開始信號(hào)
        write_byte(0xa0);//首先寫進(jìn)去器件地址
        respons();//應(yīng)答信號(hào),A
        write_byte(3);//寫入器件首地址
        respons();//應(yīng)答信號(hào),A
        start();
        write_byte(0xa1);//準(zhǔn)備讀出數(shù)據(jù),給器件地址1010 0001的意思是要讀出數(shù)據(jù)
        respons();//應(yīng)答信號(hào),A
        a=read_byte();
        stop();
        P1=a;
        while(1);
        }


        關(guān)鍵詞: IIC總線使用方

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 昌邑市| 海丰县| 仁布县| 内黄县| 临汾市| 嘉义县| 湖口县| 高州市| 康乐县| 台南县| 岳普湖县| 山东省| 郑州市| 石首市| 安义县| 广州市| 定南县| 永定县| 景德镇市| 安化县| 汪清县| 若羌县| 紫金县| 东乌珠穆沁旗| 资兴市| 江阴市| 长治县| 平塘县| 阳曲县| 林州市| 高陵县| 民权县| 绥德县| 宿迁市| 德保县| 文昌市| 牟定县| 广西| 衡水市| 大城县| 武邑县|