EEPROM的型号为24C02,通过I2C进行数据的读写。该程序可实现连续字节地址的数据写入(该程序连续写入8个地址)
$MOD51
SCL BIT P2.1
SDA BIT P2.0
ORG 0000H ;程序起始地址
LJMP MAIN
ORG000BH ;T0中断入口
LJMP INT_T0
;————————————————————————
ORG 1000H
MAIN:
MOV TMOD,#01H ;定时/计数器T0位方式1,16位定时/计数器模式
MOV TH0,#0FCH ;设置1ms(65536-1000=64536)
MOV TL0,#18H
MOV IE,#82H ;允许全局中断、T0中断
MOV IP,#00H ;所有中断优先级为0
CLR TR0
CLR F0
;连续写入数据
;—————————–
LCALL START
MOV A,#0A0H ;1010 0000
LCALL TRANS
LCALL GET_ACK
JNC MLOOP2
LJMP MLOOP1
MLOOP2:
MOV A,#00H ;0000 0000
LCALL TRANS
LCALL GET_ACK
JNC MLOOP3
LJMP MLOOP1
;开始连续写入数据
MLOOP3:
MOV A,#80H ;1000 0000
LCALL TRANS
LCALL GET_ACK
JNC MLOOP4
LJMP MLOOP1
MLOOP4:
MOV A,#81H ;1000 0001
LCALL TRANS
LCALL GET_ACK
JNC MLOOP5
LJMP MLOOP1
MLOOP5:
MOV A,#82H ;1000 0010
LCALL TRANS
LCALL GET_ACK
JNC MLOOP6
LJMP MLOOP1
MLOOP6:
MOV A,#83H ;1000 0011
LCALL TRANS
LCALL GET_ACK
JNC MLOOP7
LJMP MLOOP1
MLOOP7:
MOV A,#84H ;1000 0100
LCALL TRANS
LCALL GET_ACK
JNC MLOOP8
LJMP MLOOP1
MLOOP8:
MOV A,#85H ;1000 0101
LCALL TRANS
LCALL GET_ACK
JNC MLOOP9
LJMP MLOOP1
MLOOP9:
MOV A,#86H ;1000 0110
LCALL TRANS
LCALL GET_ACK
JNC MLOOP10
LJMP MLOOP1
MLOOP10:
MOV A,#87H ;1000 0111
LCALL TRANS
LCALL GET_ACK
JC MLOOP1
LCALL STOP
;—————————–
LCALL DELAY
;读取指定字地址的数据
;—————————–
LCALL START
MOV A,#0A0H ;1010 0000
LCALL TRANS
LCALL GET_ACK
JC MLOOP1
MOV A,#00H ;0000 0000
LCALL TRANS
LCALL GET_ACK
JC MLOOP1
LCALL START
MOV A,#0A1H ;1010 0001
LCALL TRANS
LCALL GET_ACK
JC MLOOP1
LCALL RECEIVE
LCALL NOACK
LCALL STOP
;—————————–
;可将数据发送到P0口连接的的LED灯来验证数据是否正确,也可通过串口验证
MOV P0,A
MLOOP:
JMP MLOOP
MLOOP1:
LCALL STOP
JMP MLOOP
RET
;————————————————————————
;————————————————————————
;#延时函数,可通过改变R2的值改变延时时间
DELAY:
MOV R2,#5
DLOOP1:
MOV TH0,#0FCH ;计时1ms(65536-1000=64536)
MOV TL0,#18H
SETB TR0 ;使能T0
DLOOP:
JB F0,DLOOP ;F0为1说明50ms计时还未完成,因此原地等待
SETB F0
DJNZ R2,DLOOP1
RET
;————————————————————————
;————————————————————————
;#起始信号
START:
SETB SDA ;SDA置高
SETB SCL ;SCL置高
NOP
CLR SDA ;SDA置低
NOP
RET
;————————————————————————
;————————————————————————
;#停止信号
STOP:
CLR SDA ;SDA置低
SETB SCL ;SCL置高
NOP
SETB SDA ;SDA置高
NOP
RET
;————————————————————————
;————————————————————————
;#主机发送应答信号
ACK:
CLR SCL ;SCL置低
CLR SDA ;SDA置低
NOP
SETB SCL ;SCL置高
NOP
CLR SCL ;SCL置低
SETB SDA ;SDA置高,释放总线
NOP
RET
;————————————————————————
;————————————————————————
;#主机发送非应答信号
NOACK:
CLR SCL ;SCL置低
SETB SDA ;SDA置高
NOP
SETB SCL ;SCL置高
NOP
CLR SCL ;SCL置低
RET
;————————————————————————
;————————————————————————
;#主机接收应答信号
GET_ACK:
SETB SDA ;SDA置高,释放总线
SETB SCL ;SCL置高
NOP
MOV C,SDA
CLR SCL
RET
;————————————————————————
;————————————————————————
;#发送函数,主机通过该函数发送数据
TRANS:
MOV R0,#8
TLOOP:
RLC A
CLR SCL ;SCL置低
NOP
MOV SDA,C ;移位Cy数据至SDA
SETB SCL ;SCL置高
NOP
CLR SCL ;SCL置低
NOP
DJNZ R0,TLOOP
RET
;————————————————————————
;————————————————————————
;#接收函数,主机通过该函数接收数据
RECEIVE:
MOV R0,#8
RLOOP:
CLR SCL ;SCL置低
NOP
SETB SCL ;SCL置高
NOP
MOV C,SDA ;移位SDA数据至Cy
RLC A
CLR SCL ;SCL置低
NOP
DJNZ R0,RLOOP
RET
;————————————————————————
;————————————————————————
;#T0中断处理函数,主要功能清除中断标志、停止计数
INT_T0:
CLR TR0
CLR F0
RETI
;————————————————————————
END
原理图:

网硕互联帮助中心






评论前必须登录!
注册