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

📄 24c02.txt

📁 AT24C02串行E2PROM的读写 24C02中带有片内地址寄存器。每写入或读出一个数据字节后
💻 TXT
字号:
 24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。

;这是将0100H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序可直接在实验板上实验。

ORG 0000H

SCL BIT P3.7;定义24C02的串行时钟线
SDA BIT P3.6;定义24C02的串行数据线

LJMP START
START:LCALL STAR;调用
MOV R2,#08H;一个数据有8位
MOV DPTR,#0100H;定义源数据的位置
LOOP:MOV A,#00H
MOVC A,@A+DPTR
LCALL SDATA
LCALL ACK
JC LOOP
INC DPTR
DJNZ R2,LOOP

LCALL STOP;调用停止子程序

STAR:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
SDATA:MOV R0,#08H
LOOP0:RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R0,LOOP0
RET
ACK:SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
CLR SCL
RET
STOP:CLR SDA
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
ORG 0100H
DB 0A0H,10H,01H,02H,03H,04H,05H,06H
END

  读写子程序如下:

;写串行E2PROM子程序XEPR
; R3=10100000(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
; (R4)=片内字节地址
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
XEPR: MOV P3,#0FFH

  CLR  SDA  ;发开始信号
  MOV  A,R3  ;送器件地址
  ACALL  SUBS
  MOV  A,R4  ;送片内字节地址
  ACALL SUBS
AIN: MOV A,@R1
  ACALL SUBS ;调发送单字节子程序INC   R1
  DJNZ  R7,AIN;连续写n个字节
  CLR    SDA  ;SDA置0, 准备送停止信号
  ACALL DELAY ;延时以满足传输速率要求
  SETB   SCL  ;发停止信号
  ACALL DELAY
  SETB   SDA
  RET

SUBS: MOV R0,#08H ;发送单字节子程序
LOOP: CLR SCL
  RLC  A
  MOV  SDA,C
  NOP
  SETB SCL
  ACALL DELAY
  DJNZ R0,LOOP ;循环8次送8个bit
  CLR  SCL
  ACALL DELAY
  SETB SCL
REP: MOV C,SDA
  JC  REP  ;判应答到否,未到则等待
  CLR  SCL
  RET

DELAY: NOP
  NOP
  RET

 

;读串行E2PROM子程序DEPR
;(R1)=欲读数据存放地址指针
;; R3=10100001(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
;(R4)=片内字节地址
;(R7)=连续读字节数

DEPR: MOV P3,#0FFH
  CLR  SDA  ;发开始信号
  MOV  A,R3  ;送器件地址
  ACALL SUBS   ;调发送单字节子程序
  MOV A,R4   ;送片内字节地址
  ACALL SUBS
  MOV P3,#0FFH
  CLR PSDA   ;再发开始信号
  MOV A,R3
  SETB ACC.0  ;发读命令
  ACALL SUBS
MORE: ACALL SUBR
  MOV @R1,A
  INC R1
  DJNZ R7,MORE
  CLR P1.0
  ACALL DELAY
  SETB SCL
  ACALL DELAY
  SETB SDA ;送停止信号
  RET

SUBR: MOV  R0,#08H ;接受单字节子程序
LOOP2: SETB  SCL
  ACALL DELAY
  MOV C,SDA
  RLC A
  CLR SCL
  ACALL DELAY
  DJNZ R0,LOOP2
  CJNE R7,#01H,LOW
  SETB SDA  ;若是最后一个字节置A=1
  AJMP SETOK
LOW: CLR SDA  ;否则置A=0
SETOK: ACALL DELAY
  SETB  SCL
  ACALL DELAY
  CLR  SCL
  ACALL DELAY
  SETB SDA  ;应答毕,SDA置1
  RET

  程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。

    以上是介绍AT24C02的单个字节的读写操作程序,初学者在能熟练运用后可以再学习“整个页的读写”。



⌨️ 快捷键说明

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