1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      I2C 24LC02 C讀寫例程(PIC單片機)

      更新時間: 2006-02-23 14:33:02來源: 粵嵌教育瀏覽量:3022

      /*******************************************************************
      一、程序說明:
      1, 24LC02器件地址是1010000R/W.
      2, 數組寫入24LC02采取頁寫方式.
      3, 數組code從24LC02讀出時采取自由讀方式.
      4, 采用4.00M晶體。
      5,采用軟件I2C。

      二、硬件連接:
      1, SDA------->23 pin.(當然你可以任意選擇腳位)
      2,  SCL------->18 Pin.(當然你可以任意選擇腳位)
      3, PORTD----->外接8個LED,顯示讀出的數據,在這里,讀出的剛好是一個閃動的流水燈狀態。

      *******************************************************************/
      #include "pic.h"

      #define uchar   unsigned char
      #define nop()  asm("nop"
      #define SCL  TRISC3
      #define SDA  TRISC4

      void start_i2c();
      void stop_i2c();
      void send_byte(uchar c);
      uchar receive_byte();
      void I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
      void delay_250ms();
      void i2c_error ();

      uchar code[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
      uchar no,ack,c,data;


      void main(void)
      {
       uchar i;
       TRISC=0Xff;     //C口設為輸入 RC3為SCL線,RC4為SDA線。
       PORTC=0X00;    
       TRISD=0X00;     //D口為輸出,顯示IC24LC02中讀出的內容
       PORTD=0X00;     //初始顯示全亮

       I_send_str(0xa0,0x00,code,9); //頁寫入code數組到24LC02,器件地址為0Xa0,子地址為0X00,共9個數。
       
       delay_250ms();
       

       ///////////開始讀出到D口進行顯示,根據Random read時序圖。
       while (1)
        {
          for (i=0x00;i<0x09;i++)
           {
            start_i2c();
            send_byte(0xa0);      //發送器件地址,即DEVICE ADDRESS。
              if (ack==0) i2c_error(); //如果24LC02無應答。則進入I2C ERROR錯誤指示。
            send_byte(i);         //發送字地址,即WORD ADDRESS。D口顯示數組。
              if (ack==0) i2c_error();
            start_i2c();          //重新啟動總線。
            send_byte(0xa1);      //發送讀命令和器件地址DEVICE ADDRESS。
              if (ack==0) i2c_error();
            data=receive_byte();
            stop_i2c();
            PORTD=data;
            delay_250ms();
           }
        }
      }


      /*******************************************************************
      起動總線函數
      函數原型: void start_i2c();
      Function: start on the I2C bus
      *******************************************************************/
      void start_i2c()
      {
       SDA=1;       //發送啟始條件的數據信號
       nop();
       SCL=1;
       nop();nop();nop();nop();nop(); //24LC02要求建立時間大于4,7S
       SDA=0;                      //發送起始信號
       nop();nop();nop();nop();nop();
       SCL=0;                      //鉗住I2C總線,準備發送數據或接收數據
       nop();nop();
      }


      /*******************************************************************
      停止總線函數
      函數原型: void stop_i2c();
      Function: stop the I2C bus
      *******************************************************************/
      void stop_i2c()
      {
       
       SDA=0; //發送結束條件的數據信號
       nop();
       SCL=1;
       nop();nop();nop();nop();nop();
       SDA=1;
       nop();nop();nop();nop();
      }

      /*=================================================================
      字節數據傳送函數
      函數原型: void send_byte(uchar c);
      Function: 將數據C發送出去,可以是地址,也可以是數據,發完后等待回應,并對此狀態
               位進行操作(不應答或非應答都使ack=0 ),發送數據正常,ack=1;ack=0
               表示被控器無應答或損壞。
      ==================================================================*/
      void send_byte(uchar c)
      {
       uchar bit_count;
       for (bit_count=0;bit_count<8;bit_count++)
        {
         if ((c<<bit_count)&0x80) {SDA=1;}
         else {SDA=0;}
         nop();
         SCL=1;
         nop();nop();nop();nop();nop();
         SCL=0;
        }
        nop();nop();
        SDA=1;
        nop();nop();
        SCL=1;
        nop();nop();nop();
        if (RC4==1) ack=0;
        else ack=1; //用ASK=1為有應答信號
        SCL=0;
        nop();nop();
      }

      /*==================================================================
      字節數據接收函數
      函數原型:uchar receive_byte();
      FUNCTION: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
               發完后請用應答函數。
      ===================================================================*/
      uchar receive_byte()
      {
        uchar retc,bit_count;
        retc=0;
        SDA=1;
        for (bit_count=0;bit_count<8;bit_count++)
        {
           nop();
           SCL=0;
           nop();nop();nop();nop();nop();
           SCL=1;
           nop();nop();
           retc=retc<<1;
           if (RC4==1)  retc=retc+1;
           nop();nop();
         }
         SCL=0;
         nop();nop();
         return (retc);
      }


      /*================================================================
      向有子地址器件發送多字節數據函數
      函數原型: bit I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
      Function: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla。如果
               返回1表示操作成功,否則操作有誤。
      =================================================================*/
      void I_send_str(uchar sla,uchar suba,uchar *s,uchar no)
      {
        uchar i;
        start_i2c();
        send_byte(sla);
        if (ack==0)  i2c_error();
        send_byte(suba);
        if (ack==0)  i2c_error();
        for (i=0;i<no;i++)
         {
           send_byte(*s);
           if (ack==0)  i2c_error();
           s++;
         }
        stop_i2c();
       // return(1);
      }

      /*****************************************************************
      延時函數
      函數原型: void delay_250ms();
      FUNCTION: 延明250ms
      *****************************************************************/
      void delay_250ms()
      {
       unsigned int d=24999;
       while (--d);
      }

      /*****************************************************************
      總線錯誤函數
      函數原型: void i2c_error();
      Function: 通過RD7閃動8次表示總線操作失敗一次報警。
      *****************************************************************/
      void i2c_error ()
      {
       uchar i;
       for (i=0;i<8;i++)
       {
         RD7=0;
         delay_250ms();
         RD7=1;
         delay_250ms();
       }
       
      }
      /**********END**************/

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 午夜男女视频一区二区 | 中文字幕日韩精品第一页 | 天天综合来吧来吧久久精品 | 中文字幕乱偷顶级在线 | 久久99久久99久久综合 | 一本一道久久a久久 |