这是不正常的现象。检查你的程序或者硬件连接。
“将第一个数字5变为其他时(如0x60,0x61,0x10,0x20,0x30,,,,)就找不到了”
控制码不对,当然找不到了。不同类型的I²C设备的控制码是不一样的,例如EEPROM、RTC一般采用1010作为控制码,视频数字编码器一般采用0101作为控制码……
端口 自己改一下接法..随便找两个io口.
上拉5-10k电阻就好了.
24c01总共就只有128字节
而且写入的时候都知道忘那里写
你自己自然清楚什么时候..24c01满了.
这个东西都是固定地址.
又不是硬盘这种..还要什么时候满
SDAEQUP2.0
SCL EQUP2.1
AddressEQU08H
I2CData EQU09H
ORG 0040H
LJMP START转入主程序.
START:
MOV SP,#60H
MOV Address,#00H
MOV I2CData,#55H
MOV P0,I2CDATA
CALLDELAY
CALL I2C_WRITE写入数据.
MOV I2CDATA,#0AAH
MOV P0,I2CDATA
CALLDELAY
MOV Address,#00H
CALL I2C_READ
MOV I2CData,A 读出数据.
MOV P0,I2CDATA
CALLDELAY
NOP
NOP
LJMPSTART
//*******************************************
/*------------------------------------------------------
读一个字节 Address地址 Data读出的数据
------------------------------------------------------*/
I2C_READ:
I2C_READ_A:
LCALL I2C_START
MOV A,#10100000B //从器件地址位是000,并且对从器件进行写 *** 作。
//不要有所疑问为什么这么 *** 作。因为这是一个选择性读的 *** 作,主器件发送从器件地址和它想读取的字节数据的地址执行一个伪写 *** 作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JCI2C_READ_A =1,表示无确认,再次发送 C为1转移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
I2C_READ_B:
LCALL I2C_START
MOV A,#10100001B //从器件地址位是000,并且对从器件进行读 *** 作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JCI2C_READ_B //C=1转移,表示无确认,再次发送。
LCALL I2C_RECEIVE8BIT
MOV I2CData,A
LCALL I2C_ACK
LCALL I2C_STOP
RET
//*******************************************************
//*******************************************************
接收八位数据
//主器件接收从器件指定地址的8位数据。
I2C_RECEIVE8BIT:
MOV B,#08H
CLR A
SETB SDA
I2C_RECEIVE8IT_A:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,I2C_RECEIVE8IT_A
RET
//*******************************************************
//*******************************************************
/*------------------------------------------------------
写一个字节 Address地址 I2CDatata写入的数据
------------------------------------------------------*/
I2C_WRITE:
I2C_WRITE_A:
LCALL I2C_START //调用I2C总线的起始信号的程序。
MOV A,#10100000B //从器件地址位是000,并且对从器件进行写 *** 作。
LCALL I2C_SEND8BIT
LCALL I2C_ACK
JCI2C_WRITE_A //=1,表示无确认,再次发送。 C为1转移。
MOV A,Address
LCALL I2C_SEND8BIT
LCALL I2C_ACK
MOV A,I2CData
LCALL I2C_SEND8BIT
LCALL I2C_ACK
LCALL I2C_STOP
RET
//***************************************
//**********************************
发送开始信号
//I2C总线的起始信号的程序。
I2C_START:
SETB SCL
SETB SDA
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
RET
//***********************************
//***********************************
送八位数据
//主器件送从器件8位数据。
I2C_SEND8BIT:
MOV B,#08H
I2C_SEND8BIT_A:
RLC A
MOV SDA,C
SETB SCL
NOP
NOP
CLR SCL
DJNZ B,I2C_SEND8BIT_A
RET
//************************************
//*************************************
发送接收确认信号
I2C_ACk:
SETB SDA
SETB SCL
NOP
NOP
JB SDA,I2C_ACK0 //SDA为1跳转。
CLR C
SJMP I2C_ACK_END
I2C_ACK0:
SETB C
I2C_ACK_END:
CLR SCL
RET
//**************************************
//**************************************
发送结束信号
I2C_STOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
RET
//***************************************
//***************************************
delay:
MOV R7,#0FFH
DEL1:
MOV R6,#0FFH
DEL2:
MOV R5,#10
DEL3:
DJNZ R5,DEL3
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
//***************************************
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)