××× ;程序开始地址。
SCL EQU P1.1 ;选择P1.1作时钟线。
SDA EQU P1.0 ;选择P1.0作数据线。
功能:WRITE是写入程序。将R1指示的R7个片内字节写入AT24C02中,写入首址由R0指示。
WRITE:ACALL STAR ;发出起始信号。
MOV A,#0A0H ;发出写命令。
ACALL OUTB
JC WBE ;无回答,结束操作。
MOV A,R0 ;发出E2PROM首址。
ACALL OUTB
JC WBE ;无回答,结束操作。
WR1: MOV A,@R1 ;取一字节内容。
ACALL OUTB ;写入E2PROM中。
JC WBE ;无回答,结束操作。
INC R1 ;指向下一字节。
DJNZ R7,WR1 ;写完全部字节。
WBE: AJMP STOP ;发出结束信号。
功能:READ是读出程序。将R1指示的R7个E2PROM字节读入片内RAM中,首址由R0指示。
READ: ACALL STAR ;发出起始信号。
MOV A,#0A0H ;发出写命令。
ACALL OUTB
JC RDE ;无回答,结束操作。
MOV A,R1 ;发出E2PROM首址。
ACALL OUTB
JC RDE ;无回答,结束操作。
ACALL STOP ;发出结束信号。
NOP ;延时。
NOP
ACALL STAR ;再次发出起始信号。
MOV A,#0A1H ;发出读命令。
ACALL OUTB
JC RDE ;无回答,结束操作。
RD1: MOV B,#08H ;每移出8位组成一字节。
RD2: CLR SCL ;移出一个时钟脉冲。
NOP
SETB SCL ;时钟脉冲上升沿。
NOP
MOV C,SDA ;读入一位。
RLC A ;拼装到累加器中。
NOP
DJNZ B,RD2 ;拼完一字节。
MOV @R0,A ;存入片内。
INC R0 ;指向下一地址。
CLR SCL ;时钟脉冲下降沿。
CJNE R7,#1,RD3 ;是最后一个字节吗?
SETB SDA ;最后一个字节不给回答信号。
SJMP RD4
RD3: CLR SDA ;准备好回答信号。
RD4: NOP
SETB SCL ;时钟脉冲上升沿。
NOP ;等待E2PROM读取回答信号
NOP
CLR SCL ;回答完毕。
SETB SDA ;准备读入下一字节。
DJNZ R7,RD1 ;读完全部字节。
CLR C
RDE: AJMP STOP ;发出结束信号。
功能:OUTB是向E2PROM发出一字节信息的子程序。
OUTB: MOV B,#08H ;一字节8位。
OUT1: CLR SCL ;将时钟线拉低。
RLC A ;移出一位。
MOV SDA,C ;放到数据线上。
SETB SCL ;将时钟线升高。
NOP ;等待一位信息送入E2PROM中。
DJNZ B,OUT1 ;发送完8位。
CLR SCL ;将时钟线拉低。
SETB SDA ;准备接收回答信号。
SETB SCL ;将时钟线升高。
NOPMOV C,SDA ;接收回答信号。
CLR SCL ;将时钟线拉低。
RET
功能:STAR是起始信号。
STAR: SETB SDA ;将数据线升高。
SETB SCL ;将时钟线升高。
NOP ;延时。
CLR SDA ;将数据线拉低,发出起始信号。
NOP ;延时。
CLR SCL ;将时钟线拉低。
RET
功能:STOP是结束信号。
STOP: CLR SCL ;将时钟线拉低。
CLR SDA ;将数据线拉低。
NOP
SETB SCL ;将时钟线升高。
NOP
SETB SDA ;将数据线升高,发出结束信号。
RET
END
4 结束语
本文给出了用8031汇编语言模拟I2C总线的时序的起始、停止及主控器向I2C总线的发送和接收R7字节的程序,读者也可根据I2C总线的操作时序在ATMEL89系列、68HC05系列等单片机及其外设接口如8255、8155或74LS377上实现I2C总线的操作,具有一定的通用性,且易于嵌入移植。
参考文献
1 Atmel Integrated Circuit Date Book,1994
2 武汉力源公司.CMOS串行EEPROM原理及应用
3 王卓人,邓晋钧,刘宗祥.IC卡的技术与应用.北京:电子工业出版社,1999.2
|