本帖最后由 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
|