• <rp id="wfxtb"><acronym id="wfxtb"></acronym></rp><em id="wfxtb"></em><dd id="wfxtb"><big id="wfxtb"><video id="wfxtb"></video></big></dd>
  • <rp id="wfxtb"></rp>

    <mark id="wfxtb"><center id="wfxtb"></center></mark>

      <rp id="wfxtb"><span id="wfxtb"><u id="wfxtb"></u></span></rp>

      <rp id="wfxtb"><object id="wfxtb"></object></rp>

      注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! 打開購物車 查看留言付款方式聯系我們
      初中電子 單片機教材一 單片機教材二
      搜索上次看見的商品或文章:
      商品名、介紹 文章名、內容
      首頁 電子入門 學單片機 免費資源 下載中心 商品列表 象棋在線 在線繪圖 加盟五一 加入收藏 設為首頁
      本站推薦:
      24Cxx子程序
      文章長度[] 加入時間[2008/12/1] 更新時間[2025/5/10 17:08:26] 級別[0] [評論] [收藏]

      //作者:佚名    轉貼自:本站原創    點擊數:132

      #pragma  ot(6,SIZE)
      #include <reg52.h>
      #include <intrins.h>
      #define  ERRORCOUNT 10
      sbit     SDA=P0^0;
      sbit     SCL=P0^1;
      enum  eepromtype  {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256};
      enum  eepromtype EepromType;

       

      //DataBuff為讀寫數據輸入/輸出緩沖區的首址
      //ByteQuantity 為要讀寫數據的字節數量
      //Address 為EEPROM的片內地址
      //ControlByte 為EEPROM的控制字節,具體形式為(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,
      //表示讀操作,R/W=0為寫操作,A2,A1,A0為EEPROM的頁選或片選地址;
      //EepromType為枚舉變量,需為M2401至M24256中的一種,分別對應24C01至24C256;
      //函數返回值為一個位變量,若返回1表示此次操作失效,0表示操作成功;
      //ERRORCOUNT為允許最大次數,若出現ERRORCOUNT次操作失效后,則函數中止操作,并返回1
      //SDA和SCL由用戶自定義,這里暫定義為P0^0和P0^1;
      //其余的用戶不用管,只要把只子程序放在你的程序中并調用它就可以了;


      /***********************************************************************************/
      bit   RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,
                           unsigned char ControlByte,enum eepromtype EepromType)
      {
      void Delay(unsigned char DelayCount);
      void IICStart(void);
      void IICStop(void);
      bit  IICRecAck(void);
      void IICNoAck(void);
      void IICAck(void);
      unsigned char IICReceiveByte(void);
      void IICSendByte(unsigned char sendbyte);
      unsigned char data j,i=ERRORCOUNT;
      bit      errorflag=1;
      while(i--)
         {
         IICStart();
         IICSendByte(ControlByte&0xfe);
         if(IICRecAck())
             continue;
         if(EepromType>M2416)
            {
            IICSendByte((unsigned char)(Address>>8));
            if(IICRecAck())
               continue;
            }
         IICSendByte((unsigned char)Address);
         if(IICRecAck())
             continue;
         if(!(ControlByte&0x01))
            {
            j=ByteQuantity;
            errorflag=0;                      //********clr errorflag
            while(j--)
              {
              IICSendByte(*DataBuff++);
              if(!IICRecAck())
                 continue;
              errorflag=1;
              break;
              }
            if(errorflag==1)
              continue;
            break;
            }
         else
           {
           IICStart();
           IICSendByte(ControlByte);
           if(IICRecAck())
             continue;
           while(--ByteQuantity)
             {
             *DataBuff++=IICReceiveByte();
             IICAck();
             }
           *DataBuff=IICReceiveByte();        //read last byte data
           IICNoAck();
           errorflag=0;
           break;
           }
        }
      IICStop();
      if(!(ControlByte&0x01))
        {
        Delay(255);
        Delay(255);
        Delay(255);
        Delay(255);
        }
      return(errorflag);
      }


      /*****************以下是對IIC總線的操作子程序***/
      /*****************啟動總線**********************/
      void IICStart(void)
      {
       SCL=0;              
       SDA=1;
       SCL=1;
       _nop_();
       _nop_();
       _nop_();
       SDA=0;
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       SCL=0;
       SDA=1;            
      }

      /*****************停止IIC總線****************/
      void IICStop(void)
      {
       SCL=0;
       SDA=0;
       SCL=1;
       _nop_();
       _nop_();
       _nop_();
       SDA=1;
       _nop_();
       _nop_();
       _nop_();
       SCL=0;
      }

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

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

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

      /*******************向IIC總線寫數據*********************/
      void IICSendByte(unsigned char sendbyte)
      {
       unsigned char data j=8;
       for(;j>0;j--)
          {
           SCL=0;
           sendbyte<<=1;        //無論C51怎樣實現這個操作,始終會使CY=sendbyte^7;
           SDA=CY;
           SCL=1;
          }
       SCL=0;
      }

      /**********************從IIC總線上讀數據子程序**********/
      unsigned char IICReceiveByte(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--);
      }


       

      1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。
      2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! 以上可能是本站收集或者轉載的文章,本站可能沒有文章中的元件或產品,如果您需要類似的商品請 點這里查看商品列表!
      本站協議。 版權信息。 關于我們。 本站地圖。 營業執照。 發票說明。 付款方式。 聯系方式
      深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102
      E-mail:51dz$163.com($改為@);Tel:(0755)27947428
      工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389
      91嫩草黄片动漫版