<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發(fā)網(wǎng)

      電子開發(fā)網(wǎng)電子設(shè)計(jì) | 電子開發(fā)網(wǎng)Rss 2.0 會員中心 會員注冊
      搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 電子開發(fā) >> EDA開發(fā)應(yīng)用 >> Keilc >> 正文

      AT24C01-AT24C256 的Keil C51讀寫程序

      作者:佚名    文章來源:本站原創(chuàng)    點(diǎn)擊數(shù):    更新時間:2016-10-13

      /* 以下為AT24C01~AT24C256的讀寫程序,各人可根據(jù)自己的需要應(yīng)用。
      在buf1中填入需要寫入的內(nèi)容,buf2的大小可根據(jù)需要定義。
      addr可根據(jù)使用的芯片選擇,可從任何位置讀寫,只要在該芯片的范圍內(nèi)。
      enumer=ATxxx,根據(jù)使用的芯片賦值。各函數(shù)中的形式參數(shù)不需改變。
      本程序只要在調(diào)用的程序中定義實(shí)際參數(shù)即可,下述各子程序不必改動。*/

      #include <reg52.h>
      #include <intrins.h>
      #define  ERROR 10     //允許ERROR的最大次數(shù)      
      sbit     SDA=P3^0;
      sbit     SCL=P3^1;
      enum  eepromtype {AT2401,AT2402,AT2404,AT2408,AT2416,AT2432,AT2464,AT24128,AT24256};/*器件的型號*/
      enum  eepromtype enumer;   //定義一個枚舉變量
      unsigned char code buf1 []={1,3,5,7,9,10,11,12,13,15}; /* 發(fā)送緩沖區(qū) */
      unsigned char buf2 [10]; /* 接收緩沖區(qū) */

      /* 一個通用的24C01-24C256共9種EEPROM的字節(jié)讀寫操作程序,
      此程序有五個入口條件,分別為讀寫數(shù)據(jù)緩沖區(qū)指針,
      進(jìn)行讀寫的字節(jié)數(shù),EEPROM首址,EEPROM控制字節(jié),
      以及EEPROM類型。此程序結(jié)構(gòu)性良好,具有極好的容錯性,程序機(jī)器碼也不多:
      DataBuff為讀寫數(shù)據(jù)輸入/輸出緩沖區(qū)的首址
      Length 為要讀寫數(shù)據(jù)的字節(jié)數(shù)量
      Addr 為EEPROM的片內(nèi)地址 AT24256為0~32767
      Control 為EEPROM的控制字節(jié),具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
      表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
      enumer為枚舉變量,需為AT2401至AT24256中的一種,分別對應(yīng)AT24C01至AT24C256;
      函數(shù)返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
      ERROR為允許最大次數(shù),若出現(xiàn)ERRORCOUNT次操作失效后,則函數(shù)中止操作,并返回1
      SDA和SCL由用戶自定義,這里暫定義為P3^0和P3^1; */
      /*對于1K位,2K位,4K位,8K位,16K位芯片采用一個8位長的字節(jié)地址碼,對于32K位以上
      的采用2個8位長的字節(jié)地址碼直接尋址,而4K位,8K位,16K位配合頁面地址來尋址*/

      /* -----  AT24C01~AT24C256 的讀寫程序 ------ */
      bit   RW24xx(unsigned char *DataBuff,unsigned char Length,unsigned int Addr,
                           unsigned char Control,enum eepromtype enumer)
      { void Delay(unsigned char DelayCount);  /*   延時   */
        void Start(void);  /*   啟動總線   */
        void Stop(void);   /*   停止IIC總線   */
        bit  RecAck(void); /*   檢查應(yīng)答位   */
        void NoAck(void);  /*   不對IIC總線產(chǎn)生應(yīng)答   */
        void Ack(void);    /*   對IIC總線產(chǎn)生應(yīng)答   */
        unsigned char Receive(void); /*   從IIC總線上讀數(shù)據(jù)子程序  */
        void Send(unsigned char sendbyte); /*   向IIC總線寫數(shù)據(jù)   */
        unsigned char data j,i=ERROR;
        bit errorflag=1;  /*   出錯標(biāo)志   */
        while(i--)
        { Start();  /*   啟動總線   */
          Send(Control & 0xfe); /*   向IIC總線寫數(shù)據(jù),器件地址 */
          if(RecAck()) continue; /*   如寫不正確結(jié)束本次循環(huán)   */
          if(enumer > AT2416)
          { Send((unsigned char)(Addr >> 8));//把整型數(shù)據(jù)轉(zhuǎn)換為字符型數(shù)據(jù):棄高取低,只取低8位.如果容量大于32K位,使用16位地址尋址,寫入高八位地址
            if(RecAck())  continue;
          }
          Send((unsigned char)Addr); /*   向IIC總線寫數(shù)據(jù)   */
          if(RecAck())  continue; /*   如寫正確結(jié)束本次循環(huán)   */
          if(!(Control & 0x01))   //判斷是讀器件還是寫器件
          { j=Length;
            errorflag=0;         /* 清錯誤特征位 */
            while(j--)
            { Send(*DataBuff++); /*   向IIC總線寫數(shù)據(jù)   */
              if(!RecAck()) continue; /*   如寫正確結(jié)束本次循環(huán)   */
              errorflag=1;
              break;
            }
            if(errorflag==1) continue;
            break;
          }
          else
          { Start();  /*   啟動總線   */
            Send(Control); /*   向IIC總線寫數(shù)據(jù)   */
            if(RecAck()) continue;//器件沒應(yīng)答結(jié)束本次本層循環(huán)
            while(--Length)  /*   字節(jié)長為0結(jié)束   */
            { *DataBuff ++= Receive();
              Ack();   /*   對IIC總線產(chǎn)生應(yīng)答   */
            }
            *DataBuff=Receive(); /* 讀最后一個字節(jié) */
            NoAck();  /*   不對IIC總線產(chǎn)生應(yīng)答   */
            errorflag=0;
            break;
          }
        }
        Stop();  /*   停止IIC總線   */
        if(!(Control & 0x01))
        { Delay(255); Delay(255); Delay(255); Delay(255);
        }
        return(errorflag);
      }

      /* * * * * 以下是對IIC總線的操作子程序 * * * * */
      /* * * * * * 啟動總線 * * * * */
      void Start(void)
      { SCL=0; /* SCL處于高電平時,SDA從高電平轉(zhuǎn)向低電平表示 */
        SDA=1; /* 一個"開始"狀態(tài),該狀態(tài)必須在其他命令之前執(zhí)行 */
        SCL=1;
        _nop_(); _nop_(); _nop_();
        SDA=0;
        _nop_(); _nop_(); _nop_(); _nop_();
        SCL=0;
        SDA=1;    
      }

      /* * * * * 停止IIC總線 * * * * */
      void Stop(void)
      { SCL=0; /*SCL處于高電平時,SDA從低電平轉(zhuǎn)向高電平 */
        SDA=0; /*表示一個"停止"狀態(tài),該狀態(tài)終止所有通訊 */
        SCL=1;
        _nop_(); _nop_(); _nop_(); /* 空操作 */
        SDA=1;
        _nop_(); _nop_(); _nop_();
        SCL=0;
      }

      /* * * * * 檢查應(yīng)答位 * * * * */
      bit RecAck(void)
      { SCL=0;
        SDA=1;
        SCL=1;
        _nop_(); _nop_(); _nop_(); _nop_();
        CY=SDA;     /* 因?yàn)榉祷刂悼偸欠旁贑Y中的 */
        SCL=0;
        return(CY);
      }

      /* * * * *對IIC總線產(chǎn)生應(yīng)答 * * * * */
      void Ack(void)
      { SDA=0; /* EEPROM通過在收到每個地址或數(shù)據(jù)之后, */
        SCL=1; /* 置SDA低電平的方式確認(rèn)表示收到讀SDA口狀態(tài) */
        _nop_(); _nop_(); _nop_(); _nop_();
        SCL=0;
        _nop_();
        SDA=1;
      }

      /* * * * * * * * * 不對IIC總線產(chǎn)生應(yīng)答 * * * * */
      void NoAck(void)
      { SDA=1;
        SCL=1;
        _nop_(); _nop_(); _nop_(); _nop_();
        SCL=0;
      }

      /* * * * * * * * * 向IIC總線寫數(shù)據(jù) * * * * */
      void Send(unsigned char sendbyte)
      { unsigned char data j=8;
        for(;j>0;j--)
        { SCL=0;
          sendbyte <<= 1; /* 使CY=sendbyte^7; */
          SDA=CY; /* CY 進(jìn)位標(biāo)志位 */
          SCL=1;
        }
        SCL=0;
      }

      /* * * * * * * * * 從IIC總線上讀數(shù)據(jù)子程序 * * * * */
      unsigned char Receive(void)
      { register receivebyte,i=8;
        SCL=0;
        while(i--)
        { SCL=1;
          receivebyte = (receivebyte <<1 ) | SDA;
          SCL=0;
        }
        return(receivebyte);
      }

      /* * * * * * * * 一個簡單延時程序 * * * * * * * * * * * * */
      void Delay(unsigned char DelayCount)
      { while(DelayCount--);
      }

      /* -----  AT24C01~AT24C256 的讀寫程序 ------ */
      void main()
      { unsigned char Control,*p1,*p2;
        unsigned char Length;
        unsigned int addr ; /* 24Cxx片內(nèi)地址 */
        p1=buf1;p2=buf2;
        addr=0; /* 片內(nèi)地址 AT24C256為0~32767 */
        Length=8; /* 讀寫長度 */
        enumer=AT24256; /* 讀寫AT24C256 */
        Control=0xa0; /* 寫操作 */
        RW24xx(p1,Length,addr,Control,enumer); /* 寫 */
        Control=0xa1; /* 讀操作 */
        RW24xx(p2,Length,addr,Control,enumer); /* 讀 */
      }

      Tags:keilC,24C01,24C256  
      責(zé)任編輯:admin
    4. 上一篇文章:
    5. 下一篇文章: 沒有了
    6. 請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網(wǎng)友評論
      關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 伊人青青综合网站| 亚洲综合色丁香婷婷六月图片| 天天干天天色综合网| 一本色道久久88综合亚洲精品高清 | 国产成人综合久久精品下载| 色天天天综合色天天碰| 香蕉久久综合精品首页| 色婷婷天天综合在线| 日韩无码系列综合区| AV色综合久久天堂AV色综合在| 狠狠色丁香婷婷综合久久片| 伊人丁香狠狠色综合久久| 狠狠色丁香婷婷综合久久片| 狠狠色丁香婷婷久久综合五月| 一本一道久久综合狠狠老| 小说区综合区首页| 亚洲综合自拍成人| 久久久久久久尹人综合网亚洲| 亚洲国产成人久久综合区| 亚洲色欲啪啪久久WWW综合网| 久久久久国产综合AV天堂| 色久悠悠婷婷综合在线亚洲| 伊人久久亚洲综合影院| 国产成人综合久久精品免费| 色偷偷91久久综合噜噜噜| 伊人yinren6综合网色狠狠| 精品综合久久久久久97| 精品国产第一国产综合精品| 久久综合久久美利坚合众国| 久久无码无码久久综合综合| 久久久久综合国产| 色婷婷综合和线在线| 亚洲国产欧美国产综合一区| 色综合久久加勒比高清88| 天啪天天久久天天综合啪| 亚洲国产综合无码一区二区二三区| 色天使亚洲综合一区二区| 日韩亚洲国产综合久久久| 一本大道久久a久久综合| 久久综合精品视频| 婷婷五月综合色中文字幕|