本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
ORG 0100H
I2CDATA EQU 4FH ;发送数据缓冲区的首址
A2402DATA EQU 01H ;接受缓冲区首址
NUMDATA EQU 0EH ;传送的字节数,传送14个字节
SDA BIT P3.7
SCL BIT P3.6
AJMP MAIN
MAIN: LCALL INIT
MAINWR: LCALL START ;启动
MOV R7,#0A0H
LCALL SEND ;发送写24C02的寻址字节
MOV R7,#A2402DATA
LCALL SEND ;发送数据存入24C02的地址
MOV R5,#NUMDATA ;欲发送的字节数
MOV R0,#I2CDATA ;发送缓冲区的首址
WRLOOP: MOV A,@R0
MOV R7,A
INC R0
LCALL SEND
DJNZ R5, WRLOOP ;把14个字节的数据发送出去
LCALL STOP ;停止
LCALL DL10MS
MOV R5,#NUMDATA ; 要读取的字节数重新赋值
MAINRE: LCALL START ;启动
MOV R7,#0A0H
LCALL SEND ;发送写24C02的寻址字节
MOV R7,#A2402DATA
LCALL SEND ;发接受缓冲区首址
LCALL START ; 再次启动
MOV R7,#0A1H
LCALL SEND ;发送读24C02的寻址字节
MOV R0,#60H
RELOOP: LCALL READ ;调用读取一个字节数据的子程序
MOV A,R7
MOV @R0,A ;把读进来的数送到P0口显示
LCALL DL10MS
INC R0
DJNZ R5,RELOOP
LCALL STOP ;3字节读取完毕发出停止信号
DU: MOV P2,60H
LCALL D1S
MOV P2,61H
LCALL D1S
MOV P2,62H
LCALL D1S
MOV P2,63H
LCALL D1S
MOV P2,64H
LCALL D1S
MOV P2,65H
LCALL D1S
MOV P2,66H
LCALL D1S
MOV P2,67H
LCALL D1S
MOV P2,68H
LCALL D1S
MOV P2,69H
LCALL D1S
MOV P2,6AH
LCALL D1S
MOV P2,6BH
LCALL D1S
MOV P1,6CH
LCALL D1S
MOV P2,6DH
LCALL D1S
SJMP DU
INIT: MOV P2,#0FFH
MOV 4FH,#01H
MOV 50H,#02H
MOV 51H,#03H
MOV 52H,#04H
MOV 53H,#05H
MOV 54H,#06H
MOV 55H,#07H
MOV 56H,#08H
MOV 57H,#09H
MOV 58H,#10H
MOV 59H,#11H
MOV 5AH,#12H
MOV 5BH,#13H
MOV 5CH,#14H
RET
START: SETB SDA ;启动信号子程序,大家可以参考开始信号的时序图
SETB SCL
LCALL D5U
CLR SDA
LCALL D5U
CLR SCL
RET
STOP: CLR SDA ;停止信号子程序
SETB SCL
LCALL D5U
SETB SDA
LCALL D5U
CLR SDA
CLR SCL
RET
;SEND是发送一个字节子程序
SEND: MOV R6,#08H
MOV A,R7 ;要发送的数在R7中
SENDLOP1 : RLC A ;左环移,把A的最高位移入CY
MOV SDA,C ;把CY的值通过SDA发送出去
SETB SCL ;在SCL上产生一个时钟
LCALL D5U
CLR SCL
DJNZ R6, SENDLOP1 ;重复8次,发送一个字节
;CACK是检查应答信号的子程序
CACK: SETB SDA ;主机首先拉高SDA
SETB SCL ;发出一个时钟
LCALL D5U
CLR SDA
SENDLOP2:MOV C,SDA ;读入SDA的状态,如果是0表示接受到了应答
JC SENDLOP2
CLR SCL ;接受到应答位,结束时钟
RET
READ: MOV R6,#08H ;读取一个字节子程序
READLOP1: SETB SDA ;置SDA为输入方式
SETB SCL ;发出一个时钟
LCALL D5U
MOV C,SDA ;读入SDA状态
RLC A ;把该位的状态移入A中
CLR SCL ;结束时钟
DJNZ R6,READLOP1 ;重复8次,读入一个字节
MOV R7,A ;读进来的数放在R7中
;SACK是发送应答位子程序
SACK: CLR SDA ;拉低SDA线
SETB SCL ;发出时钟信号
LCALL D5U
CLR SCL
SETB SDA
RET
D5U: NOP ;延时5US子程序
NOP
NOP
NOP
NOP
RET
DL10MS: MOV R6,#14H
LOOP1: LCALL DL513
DJNZ R6,LOOP1
RET
DL513: MOV R7,#0FFH
DJNZ R7,$
RET
D1S: MOV R1,#100 ;延时1S子程序
DEL1: MOV R4,#20
DEL2: MOV R3,#0FFH
DEL3: DJNZ R3,DEL3
DJNZ R4,DEL2
DJNZ R1,DEL1
RET
END |