新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > I2C總線AT24C02讀寫程序

        I2C總線AT24C02讀寫程序

        作者: 時間:2012-08-16 來源:網絡 收藏

        pre>//****************************************************
        /*
        程序的功能:將數據寫入中,然后再從其中讀取
        回來賦給P2口,讓流水燈顯示。
        所涉及芯片:
        */
        //****************************************************

        #includelt;reg52.h>
        #define uint unsigned int
        #define uchar unsigned char
        sbit scl=P0^3;//時鐘線接在P0^3口
        sbit sda=P0^4;//數據線接在P0^4口
        void delay()//極短時間的延時
        {
        ; ; ;
        }
        void delay1()//較長時間的延時
        {
        uchar i,j;
        uchar k=10;
        for(i=k;i>0;i--)
        for(j=110;j>0;j--);
        }
        void chushihua()//對總線進行初始化
        {
        sda=1;
        scl=1;
        }
        //=======================================
        void start()//起始函數
        {
        sda=1;
        delay();
        scl=1; //時鐘線為高電平期間,數據線由高到低的一個跳變表示起始
        delay();
        sda=0;
        delay();
        }
        //=========================================
        void stop()//終止函數
        {
        sda=0;
        delay();
        scl=1;//時鐘線為高電平期間,數據線由低到高的一個跳變表示終止
        delay();
        sda=1;
        delay();
        }
        //==========================================
        void ack()//應答函數
        {
        uchar i;
        scl=1;
        if((sda==1)(ilt;250))i++;//如果數據線一直為高電平,則一段時間后則默認為應答(即時鐘線由高到底的一個跳變)
        scl=0;
        delay();
        }
        //===========================================
        void noack()//非應答函數 ,在數據線為高電平期間,時鐘線一個完整的脈沖表示非應答
        {
        sda=1;
        delay();
        scl=0;
        delay();
        scl=1;
        delay();
        scl=0;
        delay();
        }
        //====================================
        void write_byte(uchar date)//寫字節函數
        {
        uint i;
        scl=0;//時鐘線為低電平期間,允許數據的變化
        for(i=0;ilt;8;i++)
        {
        if(date0x80)//如果寫進的數據與0x80進行與運算為“1”(即為真),則數據線為高電平
        {
        sda=1;
        }
        else //否則為低電平
        {
        sda=0;
        }
        date=datelt;lt;1;//對8位數據進行移位操作
        scl=1;//時鐘線為高電平(即數據穩定),把數據讀走
        delay();
        scl=0; //把時鐘線拉回低電平
        delay();
        }
        sda=1; //釋放數據線
        delay();
        }
        //========================================
        uchar read_byte()//讀字節函數
        {
        uchar i;
        uchar date=0x00;
        scl=0;
        delay();
        sda=1;//將總線釋放
        delay();
        for(i=0;ilt;8;i++)
        {
        scl=1;//時鐘線為高電平(即數據穩定),把數據讀走
        delay();
        date=datelt;lt;1;
        if(sda)
        {
        date++;
        }
        scl=0;
        delay();
        }
        return date;
        }
        void xie(uchar add,uchar date)
        {
        start();
        write_byte(0xa0);//指令碼0xa0為寫操作
        ack();
        write_byte(add);
        ack();
        write_byte(date);
        ack();
        stop();
        }
        uchar du(uchar t)
        {
        uchar k;
        start();
        write_byte(0xa0);
        ack();
        write_byte(t);
        ack();
        start();
        write_byte(0xa1);//指令碼0xa1為讀操作
        ack();
        k=read_byte();
        noack();
        stop();
        return k;//返回K的值
        }
        void main()
        {
        chushihua();
        xie(10,0x44);//在0~256個地址中隨意選一地址10,并在該地址寫入一字節0x44
        delay1();//此處必須要一個延時函數
        P2=du(10);//將在地址10讀回的數據賦給P2口(即讓流水燈顯示)
        while(1);//讓程序停在此處
        }
        /pre>



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 江永县| 兴业县| 东宁县| 五华县| 临汾市| 吴江市| 枞阳县| 邯郸县| 辽阳市| 德保县| 高安市| 和硕县| 武汉市| 滁州市| 山阳县| 富阳市| 澎湖县| 阜宁县| 佛教| 葫芦岛市| 台中县| 青冈县| 潢川县| 恩平市| 葵青区| 木兰县| 青田县| 台南县| 收藏| 巴南区| 古蔺县| 宜宾市| 南陵县| 五台县| 大方县| 南乐县| 棋牌| 上饶市| 宁武县| 进贤县| 西乡县|