⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24l.txt

📁 AT24系列EEPROM底层驱动程序
💻 TXT
字号:
24C02的读写程序]
#include<reg51.h>  
#include<absacc.h>  
#define  WriteDeviceAddress  0xa0  
#define  ReadDviceAddress  0xa1  
//extern  void  DelayMs(unsigned  int);  
//extern  void  Read24c02(unsigned  char  *RamAddress,unsigned  char  RomAddress,unsigned  char  bytes);  
//extern  void  Write24c02(unsigned  char  *RamAddress,unsigned  char  RomAddress,unsigned  char  bytes);  
sbit            SCL=P1^1;  
sbit            SDA=P1^0;  


void  DelayMs(unsigned  int  number)    
           {  
           unsigned  char  temp;  
           for(;number!=0;number--)    
                       {  
                       for(temp=112;temp!=0;temp--)  
                                   {}  
                       }  
           }  


void  Start()  
           {  
           SDA=1;  
           SCL=1;  
           SDA=0;  
           SCL=0;  
           }  


void  Stop()    
           {  
           SCL=0;  
           SDA=0;  
           SCL=1;  
           SDA=1;  
           }  


void  Ack()  
           {  
           SDA=0;  
           SCL=1;  
           SCL=0;  
           SDA=1;  
           }  


void  NoAck()  
           {  
           SDA=1;  
           SCL=1;  
           SCL=0;  
           }  

bit  TestAck()  
           {  
           bit  ErrorBit;  
           SDA=1;  
           SCL=1;  
           ErrorBit=SDA;  
           SCL=0;  
           return(ErrorBit);  
           }  

bit  Write8Bit(unsigned  char  input)    
           {  
           unsigned  char  temp;  
           for(temp=8;temp!=0;temp--)  
                       {  
                       SDA=(bit)(input&0x80);  
                       SCL=1;  
                       SCL=0;  
                       input=input<<1;  
                       }  
           }  


void  Write24c02(unsigned  char  *Wdata,unsigned  char  RomAddress,unsigned  char  number)  
           {  
           Start();  
           Write8Bit(WriteDeviceAddress);  
           TestAck();  
           Write8Bit(RomAddress);  
           TestAck();  
           for(;number!=0;number--)  
                         {  
                       Write8Bit(*Wdata);  
                       TestAck();  
                       Wdata++;  
                       }  
           Stop();  
           DelayMs(10);  
           }  


unsigned  char  Read8Bit()  
           {  
           unsigned  char  temp,rbyte=0;  
           for(temp=8;temp!=0;temp--)    
                       {  
                       SCL=1;  
                       rbyte=rbyte<<1;  
                       rbyte=rbyte  &brvbar;((unsigned  char)(SDA));  
                       SCL=0;  
                       }  
           return(rbyte);  
           }  


Read24c02(unsigned  char  *RamAddress,unsigned  char  RomAddress,unsigned  char  bytes)    
           {  
           unsigned  char  temp,rbyte;  
           Start();  
           Write8Bit(WriteDeviceAddress);  
           TestAck();  
           Write8Bit(RomAddress);  
           TestAck();  
           Start();  
           Write8Bit(ReadDviceAddress);  
           TestAck();  
           while(bytes!=1)  
                       {  
                       *RamAddress=Read8Bit();  
                       Ack();  
                       RamAddress++;  
                       bytes--;  
                       }  
           *RamAddress=Read8Bit();  
           NoAck();  
           Stop();  
           }  


main()  
           {  
           Write24c02(0x30,0x00,0x05)  
           Read24c02(0x30,0x00,0x05);  
           while(1);  
           }  
说明:0x30是内部RAM存放地址,也就是从30H开始存放的数据,你可以改  
0x00是24c02的内部地址  
0x05是指一次连续写(或读)多少个字节  
比如:我有5个数据,放在40h--44h  
想写进24c02从05h开始的地址  
即Write24c02(0x40,0x05,0x05)  
读的道理一样  

---------------------------------------------------------------  
;****************  X24C02  WRITING  AND  READING  SUBROUTINE  *************************************  

COUNTER      EQU      25H              ;COUNTER  UNIT  USED  TO  SAVE  THE  CIRCLE_TIMES  
BYTEADD      EQU      24H              ;WRITING&READ  BYTE_ADDRESS  OF  24C02  
SENDDATA    EQU      R1  
SDA              BIT      P3.4  
SCL              BIT      P3.5  
;===============================WRITE          SUBROUTINE==========================================  
;=========                      SEND  WRITING_ADDRESS  TO  24H  UNIT    AND  SENDDATA  TO  R1                      ==========  
;=============================================================================================  
WRITE:        LCALL    START          
                   MOV    A,#0A0H        ;SENDING  THE  SLAVE  ADDRESS  AND  WRITE  SIGNAL  TO  24C02(A0/A1/A2=0)    
                   NOP  
                   LCALL    SENDBYTE  
                   NOP  
                   LCALL    ACK            ;SENDING  ACK  SIGNAL  
                   NOP  
                   MOV    A,  BYTEADD          
                   LCALL    SENDBYTE  
                   NOP  
                   LCALL    ACK  
                   MOV    A,SENDDATA  ;SENDING  THE  DATA  WANTED  TO  BE  WRITEN  
                   LCALL    SENDBYTE  
                   LCALL    ACK  
                   NOP  
                   LCALL    STOP          ;SROP  THE  OPREATION  
                   NOP  
                   RET  
                   NOP  
;==================================START          PROCESS==========================================  
;==SENDING  A  DOWN_EDGE  DURING  SCL  HOLDING  HIGH  LEVEL,USE  TO  START  A  WRITE  OR  READ  OPREATION===  
;=============================================================================================  
START:        SETB      SDA                        
                   SETB      SCL                      
                   NOP  
                   NOP  
                   NOP  
                   NOP  
                   CLR        SDA  
                   NOP  
                   NOP  
                   NOP  
                   NOP  
                   CLR        SCL  
                   NOP  
                   NOP  
                   RET  
                   NOP  
                   NOP  

STOP:          CLR        SDA  
                   SETB      SCL  
                   NOP  
                   NOP  
                   NOP  
                   NOP  
                   SETB      SDA  
                   NOP  
                   NOP  
                   NOP  
                   NOP  
                   CLR        SCL  
                   NOP  
                   NOP  
                   RET  
                   NOP  
                   NOP  

SENDBYTE:  MOV        COUNTER,#08H        
CYCLE1:      RLC        A  
                   MOV        SDA,  C  
                   LCALL    CLOCK  
                   DJNZ      COUNTER,CYCLE1      
                   NOP  
                   NOP    
                   RET  
                   NOP  
                   NOP  

CLOCK:        NOP  
                   SETB      SCL  
                   NOP  
                   NOP  
                   NOP  
                   MOV        C,    SDA  
                   CLR        SCL  
                   NOP  
                   NOP  
                   RET  
                   NOP  
                   NOP  

ACK:            SETB      SDA  
                   LCALL    CLOCK  
                   NOP  
                   NOP  
                   RET  
                   NOP  
                   NOP  
;====================================READ            SUBROUTINE=====================================  
;======  SEND  THE  READ_ADDRESS  TO  THE  24H  UNIT  AND  THE  RETURN  DATA  IS  LOCATED  IN  ACC  ==========  
;=============================================================================================  
READ:          SETB      SDA          ;Make  SDA  as  an  imput  pin  
                   LCALL    START        ;  
                   MOV    A,#0A0H        ;SENDING  THE  SLAVE  ADDRESS  AND  READ  SIGNAL  TO  24C02(A0/A1/A2=0)    
                   NOP  
                   LCALL    SENDBYTE  
                   NOP  
                   LCALL    ACK            ;SENDING  ACK  SIGNAL  
                   NOP  
                   MOV    A,  BYTEADD          
                   LCALL    SENDBYTE  
                   NOP  
                   LCALL    ACK  
                   LCALL    START          
                   MOV    A,#0A1H        ;SENDING  THE  SLAVE  ADDRESS  AND  READ  SIGNAL  TO  24C02(A0/A1/A2=0)    
                   NOP  
                   LCALL    SENDBYTE  
                   NOP  
                   LCALL    ACK            ;SENDING  ACK  SIGNAL  
                   NOP  
                   MOV    COUNTER,#08H  
CYCLE2:      LCALL  CLOCK  
                   RLC  A  
                   DJNZ  COUNTER,CYCLE2  
                   NOP  
                   NOP  
                   RET    
END  
                           
这是汇编的  
说明:25h为循环次数,即写或读多少个字节  
24h存放的是24c02内部rom读或写的地址 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -