欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

        專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
        當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

        i2c總線AT24C02存儲(chǔ)器讀寫(xiě)程序

        作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2012年03月21日   【字體:
        #include <reg52.h>
        #define uint unsigned int  //定義unsigned int 為uint
        #define uchar unsigned char //定義unsigned char  為uchar
        #define uchar unsigned char //定義unsigned char  為uchar
        #define uint unsigned int  //定義unsigned int 為uint
        sbit sda=P3^3;//定義I2C數(shù)據(jù)線
        sbit scl=P3^2;//定義I2C時(shí)鐘線
        void delay2()//延遲6us函數(shù)
        {;;;}
        void start()//I2C開(kāi)始時(shí)鐘函數(shù)
        {
           sda=1;
           delay2();//延遲6us是時(shí)序要求。
           scl=1;
           delay2();
           sda=0;
           delay2();
        }
        void stop()//I2C結(jié)束時(shí)鐘函數(shù)
        {
           sda=0;
           delay2();//延遲6us是時(shí)序要求。
           scl=1;
           delay2();
           sda=1;
           delay2();
        }
        void respons()//應(yīng)答函數(shù)
        {
        uchar i;//定義變量I
        scl=1;
        delay2();
        while((sda==1)&&(i<250))i++;//沒(méi)有收到應(yīng)答信號(hào)在等
         //過(guò)一段時(shí)間后還是沒(méi)收到自動(dòng)跳出該語(yǔ)句.相與。
        scl=0;
        delay2();
        }
        void init()//初始化函數(shù)。
        {
         scl=1;
         sda=1;
        }
        void write_byte(uchar date)//寫(xiě)一字節(jié)函數(shù)。
        {
          uchar i,temp;
           temp=date;
         for(i=0;i<8;i++)
          {
           temp=temp<<1;//TEMP左移一位!
             scl=0;
             delay2();
             sda=CY;//送走最高位,依次把八位送完。
             scl=1;//保持?jǐn)?shù)據(jù)穩(wěn)定。
             delay2();
            
           }
           scl=0;
           delay2();
           sda=1;//總線釋放。
           delay2();
        }
        uchar read_byte()//讀一字節(jié)函數(shù)。帶返回值的函數(shù)
        {
          uchar i,j,k;
          scl=0;
          delay2();
          sda=1;//總線釋放。
          delay2();
         for(i=0;i<8;i++)
        { 
           scl=1;
           delay2();
           j=sda;
           k=(k<<1)|j;//k左移一位最低位變成了0,再與J相或,J就送到K最低位。
           scl=0;//置低以便下次讀數(shù)據(jù)。
           delay2();
          }
          return k;
        }
        void write_add(uchar address,uchar date)
        {  start();//I2C開(kāi)始時(shí)鐘函數(shù)
           write_byte(0xa0);//at24c02的固定地址A,1010,AO-A3都接地都為0。
           respons();//寫(xiě)完后調(diào)用應(yīng)答函數(shù)
         write_byte(address);//確定從at24c02的第address位置寫(xiě)數(shù)據(jù)。
           respons();//寫(xiě)完后調(diào)用應(yīng)答函數(shù)
           write_byte(date);//在芯片第address位置寫(xiě)date.
           respons();//寫(xiě)完后調(diào)用應(yīng)答函數(shù)
           stop();//I2C結(jié)束時(shí)鐘函數(shù)
        }
        uchar read_add(uchar address)
        { 
           uchar date;
           start();//I2C開(kāi)始時(shí)鐘函數(shù)
           write_byte(0xa0);//開(kāi)始讀。
           respons();//讀完后調(diào)用應(yīng)答函數(shù)
           write_byte(address);//確定從at24c02的第address位置讀數(shù)據(jù)。
           respons();//讀完后調(diào)用應(yīng)答函數(shù)
           start();//I2C開(kāi)始時(shí)鐘函數(shù)
           write_byte(0xa1);//讀數(shù)據(jù)
           respons();//讀完后調(diào)用應(yīng)答函數(shù)
           date=read_byte();//送到P1口顯示。
           stop();//I2C結(jié)束時(shí)鐘函數(shù)
           return date;
        }
         
        uint intnum,aa,ee,dd,cc;
        sbit D1=P3^4;//位定義
        sbit D2=P3^5;//位定義
        sbit D3=P3^7;//位定義
        sbit D4=P1^6;//位定義
        sbit D5=P1^7;//位定義
        void delay (uint z);
        void main ()
        {
         P1=0xff;
         dd=0;
         D2=0;
         D3=0;
         delay (2200);  
         //aa=5;
         //ee=11000;
         while(1)
        { 
           uchar f,k;
           f=2;
           init();//寫(xiě)直址,最后低位應(yīng)為0。
           delay (1);
           k=read_add(f);//送到P1口顯示。//從23地址讀數(shù)據(jù)
           aa=k;
           ee=aa*2200;
         if(D4==0)
          {  
          delay (100);   
           if(D4==1)
             {
           aa++;
             delay (1);
             init();//寫(xiě)直址,最后低位應(yīng)為0。
             write_add(2,aa);//23為at24c02內(nèi)部?jī)?chǔ)存地址,0xaa為寫(xiě)到23地址的數(shù)據(jù)。
             delay (1);
             k=read_add(2);//送到P1口顯示。//從23地址讀數(shù)據(jù)
             aa=k;
             stop();
             if(aa==8)
              {
             aa=7;
             }
              }
             }
         if(aa>1)
           {
           if(D5==0)
          { 
          delay (100);   
           if(D5==1)
              {
           aa--;
             delay (1);
             init();//寫(xiě)直址,最后低位應(yīng)為0。
             write_add(2,aa);//23為at24c02內(nèi)部?jī)?chǔ)存地址,0xaa為寫(xiě)到23地址的數(shù)據(jù)。
             delay (1);
             k=read_add(2);//送到P1口顯示。//從23地址讀數(shù)據(jù)
             aa=k;
             stop();
             //ee=aa*2200;
             if(aa==1)
              {
             aa=2;
            }
               }
             }
            }
          if(dd==0)
          {
           if(D1==0)
           { 
            delay (5000);
             if(D1==0)
               {
            D2=0;
            D3=1;
          dd=1;
              delay (ee);
            D2=0;
            D3=0;
              }
               }
               }
         if(dd==1)
          {
          if(D1==1)
          {
            delay (5000);
             if(D1==1)
             {
            D2=1;
            D3=0;
              dd=0;
            delay (ee);   
              D2=0;
            D3=0;
           }
            }
            }
           }
        }
        void delay(uint z)//代參數(shù)無(wú)返回值
         { uint x,y;
           for (x=300;x>0;x--)
         for (y=z;y>0;y--);//100*2000次
        }
        關(guān)閉窗口

        相關(guān)文章