<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過IIC總線讀寫AT24C512存儲器

CHANBAEK ? 來源:小小硬件工程師 ? 作者:小小硬件工程師 ? 2023-11-09 10:00 ? 次閱讀

今天要講的是通過IIC總線來讀寫AT24C512存儲。我們在開發一些項目的時候,如果要求對有些參數進行存儲,且掉電不丟失的話,我們就需要一些外部存儲器件,比如說今天要講的AT24C512存儲器。下面就來看一下今天的例程吧!

一、硬件電路

實現仿真電路如下,圖中U1為AT89C51,其中U1掃描P1口的輸入,并根據不同的按鍵執行不同的操作,并顯示運行結果。本實驗中,液晶模塊掛接在單片機的總線上,用讀(RD)和寫(WR)信號實現數據的傳輸;用U2即74LS373鎖存低位地址(A0~A1)U4為24C02器件,其A0、A1、A2引腳接地,故其寫地址為0xa0,讀地址為0xa1。SCK接P3.4,SDA接P3.5。WP接地。另外原理圖中增加了IIC調試器。

圖片

二、軟件程序

C程序:

#include < reg51.h >
#include < absacc.h >


#define REG0   XBYTE[0x0000]  //LCD寫指令寄存器的地址,可根據配置修改
#define REG1   XBYTE[0x0001]  //LCD讀出數據到D0~D7的地址,可根據配置修改
#define REG2   XBYTE[0x0002]  //LCD寫數據寄存器的地址,可根據配置修改
#define REG3   XBYTE[0x0003]  //LCD讀數據寄存器的地址,可根據配置修改


unsigned char bdata busyflag;
unsigned char dat,datn;


unsigned char word1[16]={" This programm "};  //第1行顯示緩存
unsigned char word2[16]={"  by LiXueli "};    //第2行顯示緩存
code unsigned char word3[16]={"www.bitc.edu.cn!"};  //用于固定顯示的數據,固化到ROM
code unsigned char word4[16]={"bitclxl@126.com!"};  //用于固定顯示的數據,固化到ROM中
code unsigned char word5[16]={"  Wellcome To "};  //用于固定顯示的數據,固化到ROM中
code unsigned char word6[16]={" Proteus Tools!"};  //用于固定顯示的數據,固化到ROM中


sbit busyflag_7=busyflag^7;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit p14=P1^4;
sbit p15=P1^5;
sbit p16=P1^6;
sbit p17=P1^7;
//////////////////////////////////////start of IIC ////////////////////////////
#define uchar unsigned char
#define uint  unsigned int
#include "reg51.h"
#include "intrins.h"


sbit  Scl=P3^4;  //串行時鐘
sbit  Sda=P3^5;  //串行數據






/*發送起始條件*/
void Start(void)        /*起始條件*/
{
        Sda=1;
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Sda=0;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
}
void Stop(void) /*停止條件*/
{
        Sda=0;
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Sda=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
}
void Ack(void)  /*應答位*/
{
        Sda=0;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=0;
}
void  NoAck(void)       /*反向應答位*/
{
        Sda=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=0;
}
void Send(uchar Data)   /*發送數據子程序,Data為要求發送的數據*/
{
        uchar BitCounter=8;       /*位數控制*/
        uchar temp;     /*中間變量控制*/
        do
        {
           temp=Data;
           Scl=0;
           _nop_ ();
           _nop_ ();
           _nop_ ();
           _nop_ ();
           if((temp&0x80)==0x80)/* 如果最高位是1*/
                Sda=1;
           else
                Sda=0;
           Scl=1;
           temp=Data< 1;        /*RLC*/
           Data=temp;
           BitCounter--;
         }while(BitCounter);
         Scl=0;
}
uchar Read(void) /*讀一個字節的數據,并返回該字節值*/
{
        uchar temp=0;
        uchar temp1=0;
        uchar BitCounter=8;
        Sda=1;
        do{
          Scl=0;
          _nop_ ();
          _nop_ ();
          _nop_ ();
          _nop_ ();
          Scl=1;
          _nop_ ();
          _nop_ ();
          _nop_ ();
          _nop_ ();
          if(Sda)       /*如果Sda=1;*/
                temp=temp|0x01;  /*temp的最低位置1*/
          else
                temp=temp&0xfe;  /*否則temp的最低位清0*/
          if(BitCounter-1)
          {   temp1=temp< 1;
              temp=temp1;
          }
          BitCounter--;
        }while(BitCounter);
        return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)//寫入一組數據到AT24C02中
{     //參數為數組的首地址,數據在AT24C02中的開始地址,數據個數
     uchar i=0;
     uchar *PData;
     PData=Data;
     Start();        
     Send(0xa0);    //A0、A1、A2接地,固AT24C02的寫地址為0XA0
     Ack();
     Send(Address);  
     Ack();
     for(i=0;i< Num;i++)
     {
        Send(*(PData+i));
        Ack();
     }
     Stop();
}
void  RdFromROM(uchar Data[],uchar Address,uchar Num)//讀出一組數據到AT24C02中
     //參數為數組的首地址,數據在AT24C02中的開始地址,數據個數
{
     uchar i=0;
     uchar *PData;
     PData=Data;
     for(i=0;i< Num;i++)
     {
        Start();
        Send(0xa0); //A0、A1、A2接地,固AT24C02的寫地址為0XA0
        Ack();
        Send(Address+i);
        Ack();
        Start();
        Send(0xa1); //A0、A1、A2接地,固AT24C02讀地址為0XA1
        Ack();
        *(PData+i)=Read();
        Scl=0;
        NoAck();
        Stop();
   }
}
/////////////////////////////////END of IIC/////////////////////////////////
void busy()    //查詢LCD是否忙碌子程序
{
  do
  {
    busyflag=REG1;
  }while(busyflag_7);
}
void wrc(unsigned char wcon)  //寫控制指令子程序
{
  busy();
  REG0=wcon;
}
void wrd(unsigned char wdat)  //寫數據寄存器子程序
{
  busy();
  REG2=wdat;
}
void rdd()  //讀數據寄存器子程序
{
  busy();
  dat=REG3;
}
void lcdint()  //LCD初始化子程序
{
  wrc(0x38);  
  wrc(0x01);
  wrc(0x06);
  wrc(0x0c);
}
void wrn(unsigned char word[])  //連續寫n個字符數據到LCD的數據寄存器中
{
  unsigned char i;
  for(i=0;i< 16;i++)
  {
    wrd(word[i]);
  }
}
void main()
{
    unsigned char i;
    lcdint();  //初始化
    wrc(0x80);  //顯示第1行的第1個字符
    wrn(word1);
    wrc(0xc0);  //顯示第2行的第1個字符
    wrn(word2);


        while(1)
    {
            if(p10==0) //判斷P1.0是否按下,寫入數據到EEPROM中
      {
        for(i=0;i< 16;i++)
          word1[i]='d';
        WrToROM(word1,0x00,16);
        wrc(0x80);
        wrn(word1);


      }
      if(p11==0) //判斷P1.1是否按下,并顯示數據
      {
        RdFromROM(word2,0x00,16);
        WrToROM(word2,0x80,16);
        wrc(0x80);
        wrn(word1);
        wrc(0xc0);
        wrn(word2);
      }
      if(p12==0) //判斷P1.2是否按下,并顯示數據
      {
        wrc(0x80);
        wrn(word3);
        wrc(0xc0);
        wrn(word4);
      }
      if(p13==0) //判斷P1.3是否按下,并顯示數據
      {
        wrc(0x80);
        wrn(word5);
        wrc(0xc0);
        wrn(word6);
      }
      if(p14==0) //判斷P1.4是否按下,并顯示數據
      {
        wrc(0x80);
        wrn(word3);
        wrc(0xc0);
        wrn(word4);
      }
      if(p15==0) //判斷P1.5是否按下,并顯示數據
      {
        wrc(0x80);
        wrn(word5);
        wrc(0xc0);
        wrn(word6);
      }
      if(p16==0)//判斷P1.6是否按下,并顯示數據
      {
        wrc(0x80);
        wrn(word3);
        wrc(0xc0);
        wrn(word4);
      }
      if(p17==0)//判斷P1.7是否按下,并顯示數據
      {
        wrc(0x80);
        wrn(word5);
        wrc(0xc0);
        wrn(word6);
      }
    }
}

三、仿真展示

程序很簡單,小伙伴們可以根據需要自己修改程序,然后進行驗證哦!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6006

    文章

    44035

    瀏覽量

    622155
  • 存儲器
    +關注

    關注

    38

    文章

    7195

    瀏覽量

    162219
  • IIC總線
    +關注

    關注

    1

    文章

    65

    瀏覽量

    20181
  • AT24C512
    +關注

    關注

    0

    文章

    7

    瀏覽量

    7268
收藏 人收藏

    評論

    相關推薦

    在RTX51TINY系統上對at24c512中的數據讀取疑難??

       當我在89s52外擴的一個數據存儲器AT24C512)上用調試助手讀取里面的數據時 怎么丟了2/3的數據呢 ? 讀取用的是在rtx51tiny上用的是在
    發表于 03-15 09:36

    誰來回答在RTX51TINY系統上對at24c512中的數據讀取疑難??

       當我在89s52外擴的一個數據存儲器AT24C512)上用調試助手讀取里面的數據時 怎么丟了2/3的數據呢 ? 讀取用的是在rtx51tiny上用的是在
    發表于 03-15 09:43

    AVR AT24C512

    我用ATmega16在proteus中仿真TWI總線,在對AT24C512連續讀寫n字節時發現,雖然AT24C512的地址會自動移向下一個存儲
    發表于 11-04 11:47

    PIC16F877A在proteus中讀寫AT24C512

    此時把I2C DEBUGGER的SCL線連接到PIC16F877A和AT24C512的SCL線上,這樣PIC16F877A可以正常的寫AT24C512。當PIC16F877A發送啟動信號且正常啟動
    發表于 12-30 16:09

    凔海筆記之FPGA(八):AT24c04單字節讀寫IIC協議

    。首先,AT24c04是存儲元件,還是EPROM即可擦寫可編程只讀存儲器,而且斷電可保存。其次,對AT24c04的控制是采用IIC協議的,也
    發表于 05-23 07:55

    【NUCLEO-F412ZG試用體驗】+AT24C512 IIC EEPROM+W25Q128 SPI FLASH兩 大初級存儲器實驗

    AT24CXX系列是ATMEL公司研發的IIC總線通信的EEPROM(電子可擦除存儲器),XX的數字代表單元格數量,以今天用到的AT24C512
    發表于 02-18 20:00

    存儲器AT24C512電子資料

    概述:AT24C512雙列20腳和8腳塑料、貼片雙列、薄型貼面BGA封裝。
    發表于 04-14 06:57

    IIC及AT24C02的讀寫

    IIC及AT24C02的讀寫(單片機實驗)有問題歡迎私信哦課程設計(綜合實驗)內容及要求通過IIC總線
    發表于 07-16 06:27

    如何使用IIC總線和AT24C02存儲芯片去讀寫代碼呢

    AT24C02存儲芯片有哪些功能特性?IIC總線有哪些特征呢?如何使用IIC總線和AT
    發表于 11-25 06:45

    stm32單片機是如何對EEPROM AT24C512進行讀寫

    移植的正點原子的代碼,開始使用的AT24C02,讀寫沒問題,但是換了AT24C512之后發現,寫入成功,但讀出的數據一直是FF,通過修改IIC
    發表于 11-26 08:32

    at24c512中文資料

    AT24C512是ATMEL公司生產的64KB串行電可擦的可編程存儲器,內部有512頁,每一頁為128字節,任一單元的地址為16位,地址范圍為0000-0FFFH.它采用8引腳封裝,具有結構緊湊,
    發表于 08-13 16:24 ?899次下載
    <b class='flag-5'>at24c512</b>中文資料

    AT24C512存儲器在無線抄表器中的應用

    介紹_r AT24C512存儲器的特性、工作狀態和讀寫時序,并應用于無線抄喪器中.該芯片可 儲抄表系統所有的抄表信息,由此,增加系統的可靠性,降低系統成本及功耗.關鍵詞:
    發表于 10-06 09:09 ?18次下載

    單片機是如何對AT24C512中的數據進行系統化管理的?

    AT24C512是Atmel公司生產的64KB串行電可擦的可編程存儲器,內部有512頁,每一頁為128字節,任一單元的地址為16位,地址范圍為0000~0FFFFH。它采用8引腳封裝,具有結構緊湊
    發表于 07-31 07:28 ?1992次閱讀
    單片機是如何對<b class='flag-5'>AT24C512</b>中的數據進行系統化管理的?

    模擬IIC讀寫總結之at24c512讀寫程序

    用at24c02改的at24c512的程序,包含主程序和模擬程序,可以直接用。還有問題總結,包含奇數位亂碼問題和讀寫0xff問題。大佬請路過,新手請探討。(用的瑞薩的片子,就不上項目了,你們也打不開,不懂得就問問吧)
    發表于 12-31 22:41 ?93次下載

    stm32單片機讀寫EEPROM AT24C512

    移植的正點原子的代碼,開始使用的AT24C02,讀寫沒問題,但是換了AT24C512之后發現,寫入成功,但讀出的數據一直是FF,通過修改IIC
    發表于 11-19 09:21 ?55次下載
    stm32單片機<b class='flag-5'>讀寫</b>EEPROM <b class='flag-5'>AT24C512</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>