在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于單片機(jī)的I2C的讀寫(xiě)操作實(shí)驗(yàn)

            基于單片機(jī)的I2C的讀寫(xiě)操作實(shí)驗(yàn)

            作者: 時(shí)間:2012-11-03 來(lái)源:網(wǎng)絡(luò) 收藏

            [實(shí)驗(yàn)任務(wù)]
            利用24C08斷電以后存儲(chǔ)的數(shù)據(jù)不消失的特點(diǎn),可以做一個(gè)斷電保護(hù)裝置。首先利用做一個(gè)0-99秒的自動(dòng)計(jì)時(shí)器。然后隨機(jī)關(guān)斷電源,在 通電以后計(jì)時(shí)器接著斷電前的狀態(tài)繼續(xù)計(jì)時(shí)。

            [實(shí)驗(yàn)原理]
            首先簡(jiǎn)單的說(shuō)明以下總線,總線是一種串行數(shù)據(jù)總線,只有二根信號(hào)線,一根是雙向的數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL。在 總線上傳送的一個(gè)數(shù)據(jù)字節(jié)由八位組成。總線對(duì)每次傳送的字節(jié)數(shù)沒(méi)有限制,但每個(gè)字節(jié)后必須跟一位應(yīng)答位。數(shù)據(jù)傳送首先傳送最高位(MSB),數(shù)據(jù)傳送按圖1所示格式進(jìn)行。首先由主機(jī)發(fā)出啟動(dòng)信號(hào)“S”(SDA在SCL高電平期間由高電平跳變?yōu)榈碗娖?,然后由主機(jī)發(fā)送一個(gè)字節(jié)的數(shù)據(jù)。啟動(dòng)信號(hào)后的第一個(gè)字節(jié)數(shù)據(jù)具有特殊含義:高七位是從機(jī)的地址,第八位是傳送方向位,0表示主機(jī)發(fā)送數(shù)據(jù)(寫(xiě)),1表示主機(jī)接收數(shù)據(jù)(讀)。被尋址到的從機(jī)設(shè)備按傳送方向位設(shè)置為對(duì)應(yīng)工作方式。標(biāo)準(zhǔn)I2C總線的設(shè)備都有一個(gè)七位地址,所有連接在I2C總線上的設(shè)備都接收啟動(dòng)信號(hào)后的第一個(gè)字節(jié),并將接收到的地址與自己的地址進(jìn)行比較,如果地址相符則為主機(jī)要尋訪的從機(jī),應(yīng)在第九位答時(shí)鐘脈沖時(shí)向SDA線送出低電平作為應(yīng)答。除了第一字節(jié)是通用呼叫地址或十位從機(jī)地址之外第二字節(jié)開(kāi)始即數(shù)據(jù)字節(jié)。數(shù)據(jù)傳送完畢,由主機(jī)發(fā)出停止信號(hào)“P”(SDA在SCL高電平期間由低電平跳變?yōu)楦唠娖?。
              AT24C系列串行E2PROM具有I2C總線接口功能,功耗小,寬電源電壓(根據(jù)不同型號(hào)2.5V~6.0V),工作電流約為3mA,靜態(tài)電流隨電源電壓不同為30μA~110μA,AT24C系列串行E2PROM參數(shù)如下
            型 號(hào) 容 量 器件尋址字節(jié)(8位) 一次裝載字節(jié)數(shù)
            AT24C01 128×8 1010A2A1A0 R/W 4
            AT24C02 256×8 1010A2A1A0 R/W 8
            AT24C04 512×8 1010A2A1P0 R/W 16
            AT24C08 1024×8 1010A2P1P0 R/W 16
            AT24C16 2048×8 1010P2P1P0 R/W 16
              由于I2C總線可掛接多個(gè)串行接口器件,在I2C總線中每個(gè)器件應(yīng)有唯一的器件地址,按I2C總線規(guī)則,器件地址為7位數(shù)據(jù)(即一個(gè)I2C總線系統(tǒng)中理論上可掛接128個(gè)不同地址的器件),它和1位數(shù)據(jù)方向位構(gòu)成一個(gè)器件尋址字節(jié),最低位D0為方向位(讀/寫(xiě))。器件尋址字節(jié)中的最高4位(D7~D4)為器件型號(hào)地址,不同的I2C總線接口器件的型號(hào)地址是廠家給定的,如AT24C系列E2PROM的型號(hào)地址皆為1010,器件地址中的低3位為引腳地址A2 A1 A0,對(duì)應(yīng)器件尋址字節(jié)中的D3、D2、D1位,在硬件設(shè)計(jì)時(shí)由連接的引腳電平給定。
              對(duì)AT24C系列 E2PROM的完全遵守I2C總線的主收從發(fā)和主發(fā)從收的規(guī)則。

            [C語(yǔ)言源程序]
            #include AT89X52.H>
            #include stdio.h>
            #include absacc.h>
            unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
            0x6d,0x7d,0x07, 0x7f,0x6f,};
            unsigned char sec; //定義計(jì)數(shù)值,每過(guò)1秒,sec加1
            unsigned int tcnt; //定時(shí)中斷次數(shù)
            bit write=0; //寫(xiě)24C08的標(biāo)志;
            sbit gewei=P2^0; //個(gè)位選通定義
            sbit shiwei=P2^1; //十位選通定義
            /////////24C08讀寫(xiě)驅(qū)動(dòng)程序////////////////////
            sbit scl=P3^4; // 24c08 SCL
            sbit sda=P3^5; // 24c08 SDA
            void delay1(unsigned char x)
            { unsigned int i;
            for(i=0;ix;i++);
            ;}
            void flash()
            { ; ; }
            void x24c08_init() //24c08初始化子程序
            {scl=1; flash(); sda=1; flash();}
            void start() //啟動(dòng)I2C總線
            {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
            void stop() //停止I2C總線
            {sda=0; flash(); scl=1; flash(); sda=1; flash();}
            void writex(unsigned char j) //寫(xiě)一個(gè)字節(jié)
            { unsigned char i,temp;
            temp=j;
            for (i=0;i8;i++)
            {temp=temp1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
            scl=0; flash(); sda=1; flash();
            }
            unsigned char readx() //讀一個(gè)字節(jié)
            {
            unsigned char i,j,k=0;
            scl=0; flash(); sda=1;
            for (i=0;i8;i++)
            {
            flash(); scl=1; flash();
            if (sda==1) j=1;
            else j=0;
            k=(k1)|j;
            scl=0;}
            flash(); return(k);
            }
            void clock() // I2C總線時(shí)鐘
            {
            unsigned char i=0;
            scl=1; flash();
            while ((sda==1)(i255))i++;
            scl=0; flash();
            }
            ////////從24c02的地址address中讀取一個(gè)字節(jié)數(shù)據(jù)/////
            unsigned char x24c08_read(unsigned char address)
            {
            unsigned char i;
            start(); writex(0xa0);
            clock(); writex(address);
            clock(); start();
            writex(0xa1); clock();
            i=readx(); stop();
            delay1(10);
            return(i);
            }
            //////向24c02的address地址中寫(xiě)入一字節(jié)數(shù)據(jù)info/////
            void x24c08_write(unsigned char address,unsigned char info)
            {
            EA=0;
            start(); writex(0xa0);
            clock(); writex(address);
            clock(); writex(info);
            clock(); stop();
            EA=1;
            delay1(50);
            }
            /////////////24C08讀寫(xiě)驅(qū)動(dòng)程序完/////////////////////
            void Delay(unsigned int tc) //延時(shí)程序
            {
            while( tc != 0 )
            {unsigned int i;
            for(i=0; i100; i++);
            tc--;}
            }
            void LED() //LED顯示函數(shù)
            {
            shiwei=0; P0=table[sec/10]; Delay(8); shiwei=1;
            gewei=0; P0=table[sec%10]; Delay(5); gewei=1;
            }
            void t0(void) interrupt 1 using 0 //定時(shí)中斷服務(wù)函數(shù)
            {
            TH0=(65536-50000)/256; //對(duì)TH0 TL0賦值
            TL0=(65536-50000)%256; //重裝計(jì)數(shù)初值
            tcnt++; //每過(guò)250ust tcnt加一
            if(tcnt==20) //計(jì)滿(mǎn)20次(1秒)時(shí)
            {
            tcnt=0; //重新再計(jì)
            sec++;
            write=1; //1秒寫(xiě)一次24C08
            if(sec==100) //定時(shí)100秒,在從零開(kāi)始計(jì)時(shí)
            {sec=0;}
            }
            }
            void main(void)
            {
            TMOD=0x01; //定時(shí)器工作在方式1
            ET0=1; EA=1;
            x24c08_init(); //初始化24C08
            sec=x24c08_read(2);//讀出保存的數(shù)據(jù)賦于sec
            TH0=(65536-50000)/256; //對(duì)TH0 TL0賦值
            TL0=(65536-50000)%256; //使定時(shí)器0.05秒中斷一次
            TR0=1; //開(kāi)始計(jì)時(shí)
            while(1)
            {
            LED();
            if(write==1) //判斷計(jì)時(shí)器是否計(jì)時(shí)一秒
            {
            write=0; //清零
            x24c08_write(2,sec); //在24c08的地址2中寫(xiě)入數(shù)據(jù)sec
            }
            }
            }

            [硬件電路圖]
            基于單片機(jī)的I2C的讀寫(xiě)操作實(shí)驗(yàn)


            p2p機(jī)相關(guān)文章:p2p原理




            評(píng)論


            相關(guān)推薦

            技術(shù)專(zhuān)區(qū)

            關(guān)閉