本帖最后由 51黑黑黑 于 2016-3-3 00:54 编辑
(一)、AT24C512简介
AT24C512是Atmel公司生产的64KB串行电可擦的可编程存储器,内部有512页,每一页为128字节,任一单元的地址为16位,地址范围为0000~0FFFFH。它采用8引脚封装,具有结构紧凑、存储容量大等特点,可以在2线总线上并接4片芯片,特别适用于具有大容量数据存储要求的数据采集系统,因此在测控系统中被大量采用。该芯片的主要特性如下:存储容量为65536byte;与100kHz、400kHz、1MHzI2C总线兼容;100000次编程/擦写周期;单电源、读写电压为 1.8V~5.5V;ESD保护电压>4kV;数据可保存40年;写保护功能,当WP为高电平时,进入写保护状态;CMOS低功耗技术,最大写入电流为3mA;128byte页写入缓存器;自动定时的写周期;具有8引脚DIP及20引脚SOIC封装等多种封装形式。
(1)AT24C512的引脚和功能如下图:

①A0、A1——地址选择输入端。在串行总线结构中,如需连接4个AT24C512芯片,则可用A0、A1来区分各芯片。A0、A1悬空时为0。
②SDA——双向串行数据输入输出口。用于存储器与单片机之间的数据交换。
③SCL——串行时钟输入。通常在其上升沿将SDA上的数据写入存储器,而在下降沿从存储器读出数据并送往SDA。
④WP——写保护输入。此引脚与地相连时,允许写操作;与VCC相连时,所有的写存储器操作被禁止。如果不连,该脚将在芯片内部下拉到地。
⑤VCC——电源。
GND接地。NC悬空。
(2)起停信号
时钟线保持高电平期间,数据线电平从高到低的跳变代为I2C总线的起始信号。时钟线保持高电平期间,数据线电平从低到高的跳变代为I2C总线的停止信号。 (3)器件寻址
主器件通过发送1个起始信号启动发送过程,然后发送它所需要寻址的从器件地址,8位从器件地址的高5位固定为10100,接下来的2位(A0,A1)为器件的地址位,因此最多可以将4个AT24C512连接到同一总线上使存储容量扩展至256Kbyte。注意,这两位必须与A0和A1两引脚的输入状态相对应,从器件地址的最低位为读写控制位,“1”表示对从器件进行读操作,“0”表示对从器件进行写操作,在主器件发送起始信号和从器件发送地址字节后,AT24C512监测总线并当其地址与发送的从地址相符时发出1个应答信号(通过SDA线),AT24C512再根据读写控制位(R/W)的状态进行读写操作,从器件地址字节内容如下图所示。

(4)应答信号
I2C总线传送数据时,每成功传送1个字节,接收器都必须产生1个应答信号,应答的器件在第9个时钟周期将SDA线拉低表示其已收到1个8位数据。AT24C512在接收到起始信号和从器件地址之后产生应答信号,如果器件已选择了写操作,则在每接收1个8位字节之后会有1个应答信号ACR。 (5)写操作
AT24C512的写操作有写字节和写页两种方式。写字节时通常在向AT24C512发送设备地址字并接到应答信号后,还需要发送2个8位地址来选择要写数据的地址。AT24C512接收到这个地址后会应答一个ACR信号,然后接收8位数据进来,并再返回一个应答信号。 (6)读操作
读操作有当前地址读、随机读、读串三种方式。其初始化过程基本与写操作相同,只是在设备选择字中的最低位要改成读而已。在当前地址读操作方式时,内部数据的地址将保持在最后的读写操作地址加1上,读串操作既可以是当前地址读,也可以是随机地址读。当单片机接收到数据但不送应答信号时,读过程结束。



(二)、AT24C512读写操作的51汇编语言编程
ORG 0000H
AJMP KS
ORG 0003H
RETI
ORG 000BH
LJMP 0C00H
RETI
ORG 001BH
RETI
ORG 0023H
;AJMPS ;接收数据转S
SDA EQU 0B6H
SCL EQU 0B5H
KS:
MOVSP,#60H ;设堆栈指针
MOV A,#21H
MOV 89H,A ;定时器1 工作方式2,8位可重装
MOV 8BH,#0F3H ;给定时器1赋值6M=F3,1200波特率,0.833毫秒/位,12M=E8H
MOV8DH,#0F3H ;给定时器0赋值6M=F3,1200波特率,0.833毫秒/位,12M=E8H
MOV 8CH, #3CH
MOV 8AH, #0C0H
SETB 0BCH ;通信中断优先,IP中PS置1
MOVA,#9AH ;;;IE
MOV 0A8H,A
SETB8EH ;开始定时,TR1=1
SETB ET0 ;
MOV A,#50H;;设串行口模式1,允许接收。
MOV 98H,A ;送串行控制SCON
Q: CLR A
MOVR2,#90D ;清数据区
MOV R0,#30H
QING:MOV@R0,A ;清数据区
INC R0
INC A
DJNZ R2,QING
ACALL WRITE
ACALL READ0
AJMP Q
READ0: MOVR1,#30H ;读表号和电度数到显示缓冲区30-37
MOV R4,58H
MOV R5,59H
MOV R7,#9 ;;;;;
READ: SETB SCL
SETB SDA
CLR SDA
MOVA,#10100010B ;写命令
ACALL SUBS
MOV A,R4
ACALL SUBS
MOV A,R5
ACALL SUBS
SETB SCL
SETB SDA
CLR SDA
MOVA,#10100011B ;读命令
ACALL SUBS
SETB ACC.0
READ1: ACALL SUBR
MOV @R1,A
;ACALLFSD ;调向PC发送一个字节子程序
INC R1
DJNZ R7,READ1
CLR SDA
ACALL DELAY
SETB SCL
ACALL DELAY
SETB SDA
RET
FSD: CLR ES
MOV A, @R1
ANL A, #0F0H
SWAP A
MOV SBUF, A
JNB TI, $
CLR TI
MOV A, @R1
ANL A, #0FH
MOV SBUF, A
JNB TI, $
CLR TI
SETB ES
RET
WRITE: MOV R1, #30H ;数据存储地址
MOV R7, #9 ;写数据9个字节
ww: MOVR4,58H; ;写地址高位
MOVR5,59H; ;写地址低位
ww1: SETB SDA;setb p3.6
SETB SCL;setb p3.5
CLR SDA
MOVA,#10100010B ;写命令
ACALL SUBS
MOVA,R4 ;写地址高位
ACALL SUBS
MOVA,R5 ;写地址低位
ACALL SUBS
WRITE1:MOV A,@R1
ACALL SUBS
INC R1
DJNZ R7,WRITE1
CLR SDA
ACALL DELAY
SETB SCL
ACALL DELAY
SETB SDA
RET
SUBS: MOVR0,#08H ;写512一个字8位,或者数据或者命令
LOOP: CLRSCL
RLC A
MOV SDA,C
; NOP
SETB SCL
ACALL DELAY
DJNZ R0,LOOP
CLR SCL
ACALL DELAY
SETB SCL
REP: MOV C,SDA
JC REP
CLR SCL
RET
EEPR: SETBSCL ;读512一个字
SETB SDA
CLRSDA ;边沿要求
MOVA,#10100010B ;写命令
ACALL SUBS
MOVA,R4 ;写地址高位
ACALL SUBS
MOVA,R5 ;写地址低位
ACALL SUBS
SETBSCL
SETB SDA
CLR SDA
MOVA,#10100011B ;写命令
ACALL SUBS
SETB ACC.0
MORE: ACALLSUBR ;读数据
MOV @R1,A
INC R1
DJNZ R7,MORE
CLR SDA
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,Loop3
SETB SDA
AJMP SETOK
Loop3: CLR SDA
SETOK: ACALL DELAY
SETB SCL
ACALL DELAY
CLR SCL
ACALL DELAY
SETB SDA
RET
DELAY: NOP
; NOP
RET
YSA: MOV 7EH, #18H
YSA1: DJNZ 7EH, YSA1
RET
YSB: MOV 7EH, #0FFH
YS1B: MOV 7FH, #0FFH
YS2B: DJNZ 7FH, YS2B
DJNZ 7EH, YS1B
RET
END
|