<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. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> EDA開發應用 >> Keilc >> 正文

      AT24C01-AT24C256 的Keil C51讀寫程序

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2016-10-13

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

      #include <reg52.h>
      #include <intrins.h>
      #define  ERROR 10     //允許ERROR的最大次數      
      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}; /* 發送緩沖區 */
      unsigned char buf2 [10]; /* 接收緩沖區 */

      /* 一個通用的24C01-24C256共9種EEPROM的字節讀寫操作程序,
      此程序有五個入口條件,分別為讀寫數據緩沖區指針,
      進行讀寫的字節數,EEPROM首址,EEPROM控制字節,
      以及EEPROM類型。此程序結構性良好,具有極好的容錯性,程序機器碼也不多:
      DataBuff為讀寫數據輸入/輸出緩沖區的首址
      Length 為要讀寫數據的字節數量
      Addr 為EEPROM的片內地址 AT24256為0~32767
      Control 為EEPROM的控制字節,具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
      表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
      enumer為枚舉變量,需為AT2401至AT24256中的一種,分別對應AT24C01至AT24C256;
      函數返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
      ERROR為允許最大次數,若出現ERRORCOUNT次操作失效后,則函數中止操作,并返回1
      SDA和SCL由用戶自定義,這里暫定義為P3^0和P3^1; */
      /*對于1K位,2K位,4K位,8K位,16K位芯片采用一個8位長的字節地址碼,對于32K位以上
      的采用2個8位長的字節地址碼直接尋址,而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); /*   檢查應答位   */
        void NoAck(void);  /*   不對IIC總線產生應答   */
        void Ack(void);    /*   對IIC總線產生應答   */
        unsigned char Receive(void); /*   從IIC總線上讀數據子程序  */
        void Send(unsigned char sendbyte); /*   向IIC總線寫數據   */
        unsigned char data j,i=ERROR;
        bit errorflag=1;  /*   出錯標志   */
        while(i--)
        { Start();  /*   啟動總線   */
          Send(Control & 0xfe); /*   向IIC總線寫數據,器件地址 */
          if(RecAck()) continue; /*   如寫不正確結束本次循環   */
          if(enumer > AT2416)
          { Send((unsigned char)(Addr >> 8));//把整型數據轉換為字符型數據:棄高取低,只取低8位.如果容量大于32K位,使用16位地址尋址,寫入高八位地址
            if(RecAck())  continue;
          }
          Send((unsigned char)Addr); /*   向IIC總線寫數據   */
          if(RecAck())  continue; /*   如寫正確結束本次循環   */
          if(!(Control & 0x01))   //判斷是讀器件還是寫器件
          { j=Length;
            errorflag=0;         /* 清錯誤特征位 */
            while(j--)
            { Send(*DataBuff++); /*   向IIC總線寫數據   */
              if(!RecAck()) continue; /*   如寫正確結束本次循環   */
              errorflag=1;
              break;
            }
            if(errorflag==1) continue;
            break;
          }
          else
          { Start();  /*   啟動總線   */
            Send(Control); /*   向IIC總線寫數據   */
            if(RecAck()) continue;//器件沒應答結束本次本層循環
            while(--Length)  /*   字節長為0結束   */
            { *DataBuff ++= Receive();
              Ack();   /*   對IIC總線產生應答   */
            }
            *DataBuff=Receive(); /* 讀最后一個字節 */
            NoAck();  /*   不對IIC總線產生應答   */
            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從高電平轉向低電平表示 */
        SDA=1; /* 一個"開始"狀態,該狀態必須在其他命令之前執行 */
        SCL=1;
        _nop_(); _nop_(); _nop_();
        SDA=0;
        _nop_(); _nop_(); _nop_(); _nop_();
        SCL=0;
        SDA=1;    
      }

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

      /* * * * * 檢查應答位 * * * * */
      bit RecAck(void)
      { SCL=0;
        SDA=1;
        SCL=1;
        _nop_(); _nop_(); _nop_(); _nop_();
        CY=SDA;     /* 因為返回值總是放在CY中的 */
        SCL=0;
        return(CY);
      }

      /* * * * *對IIC總線產生應答 * * * * */
      void Ack(void)
      { SDA=0; /* EEPROM通過在收到每個地址或數據之后, */
        SCL=1; /* 置SDA低電平的方式確認表示收到讀SDA口狀態 */
        _nop_(); _nop_(); _nop_(); _nop_();
        SCL=0;
        _nop_();
        SDA=1;
      }

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

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

      /* * * * * * * * * 從IIC總線上讀數據子程序 * * * * */
      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片內地址 */
        p1=buf1;p2=buf2;
        addr=0; /* 片內地址 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  
      責任編輯:admin
    4. 上一篇文章:
    5. 下一篇文章: 沒有了
    6. 請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 中文字幕国产综合| 在线成人综合色一区| 久久久久久久综合综合狠狠| 亚洲综合国产成人丁香五月激情| 国产综合色香蕉精品五月婷| 伊人久久亚洲综合影院首页| 开心婷婷五月激情综合社区| 国产成人综合亚洲AV第一页| 久久婷婷五月综合97色| 丁香亚洲综合五月天婷婷| 91精品国产综合久久青草| 亚洲综合激情另类专区| 色综合久久久无码网中文| 久久久久久久综合日本亚洲| 天天综合网网欲色| 久久狠狠爱亚洲综合影院| 亚洲综合色婷婷七月丁香| 精品综合久久久久久99| 亚洲国产综合自在线另类| 香蕉蕉亚亚洲aav综合| 久久综合色之久久综合| 婷婷亚洲综合一区二区| 婷婷六月久久综合丁香可观看| 久久综合亚洲色HEZYO社区| 久久综合综合久久97色| 久久青青草原综合伊人| 久久综合给合综合久久| 激情综合色综合久久综合| 日韩无码系列综合区| 色天使久久综合网天天| 99久久综合精品五月天| 亚洲精品综合在线影院| 色噜噜狠狠成人中文综合| 久久综合精品视频| 亚洲国产亚洲综合在线尤物 | 一本久道久久综合多人| 亚洲私人无码综合久久网| 天天综合在线观看| heyzo专区无码综合| 色久悠悠婷婷综合在线亚洲| 伊人婷婷色香五月综合缴激情|