我用11.0592M晶振,可模拟通信时接受到的数据好像不对,我的程序如下,请指教:
SCL BIT P1.0
SDA BIT P1.1
SLAW EQU 60H ;寻址字节写存放单元
SLAR EQU 61H
NUMBYT EQU 63H ;传送字节数n存放单元
ACK BIT 64H ;应答位标志存放单元
MTD EQU 65H ;发送缓冲区首址
MRD EQU 40H ;接收缓冲区首址
ORG 0000H
LJMP 100H
ORG 100H
MAIN: MOV P1,#00H
SETB P1.7 ;指示灯7亮
MOV R6,#00H
MOV R5,#00H ;串口通信用
MOV MTD,#00H
ICRED: MOV SLAW,#0A0H
MOV SLAR,#0A1H
LCALL SEQURD
MOV A,40H
CJNE A,#02H,ERR ;判断首地址接受到的值正确与否
SETB P1.5
SJMP $
ERR: SETB P1.3
SJMP $
;启动I2C总线子程序
STA: SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
;结束总线子程序
STOP: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
RET
;发送应答子程序
MACK: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;发送非应答子程序
MNACK:SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;检查应答位子程序
;ACK=1,表示有应答
CACK:
SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK
CEND: NOP
CLR SCL
NOP
RET
;发送一个字节子程序
;字节数据放入ACC
;占用R0,C,ACC
WRBYT:
MOV R0,#08H
WLP:
RLC A
JC WR1
SJMP WR0
WLP1: DJNZ R0,WLP
NOP
RET
WR1: SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
CLR SDA
SJMP WLP1
WR0: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;读取字节子程序
;读出的值在ACC
;占用R2,R0,C
RDBYT:
MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
MOV A,R2
CLR SCL
RLC A
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP
RET
;模拟总线发送n个字节数据
WRNBYT: PUSH PSW
MOV PSW,#18H
LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB ACK,WRNBYT
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB ACK,WRNBYT
INC R1
DJNZ NUMBYT,WRDA
LCALL STOP
POP PSW
RET
;模拟总线接受n个字节数据
RDNBYT: PUSH PSW
MOV PSW,#18H
LCALL STA
MOV A,SLAR
LCALL WRBYT
LCALL CACK
JB ACK,RDNBYT
RDN: MOV R1,#MRD
RDN1: LCALL RDBYT
MOV @R1,A
DJNZ NUMBYT,RDN2
LCALL MNACK
LCALL STOP
POP PSW
RET
RDN2: LCALL MACK
INC R1
SJMP RDN1
;读指定地址n个数据子程序
SEQURD:
MOV NUMBYT,#01H
LCALL WRNBYT
MOV NUMBYT,#10H
LCALL RDNBYT
RET
END