>
第2字节为:
其中:1010码是X24C16的器件地址,A7-A0是从地址,A10、A9、A8为X24C16的高位地址。第2字节是X24C16的低8位地址,第3字节是要写入到X24C16的数据,特别注意,每个字节后一定要跟一个应答信号。(源程序详见本刊网站,www.eaw.com.cn)
结语
I2C总线,由于连线少,结构简单,与并行总线相比,大大地简化了仪表系统的硬件设计,提高了可靠性。这是一种高性能的串行总线,正在获得广泛的工程应用。与此同时,基于串行用户接口I2C总线的新型电子器件的出现,也在推动着I2C总线的应用。对于不带I2C总线接口的MCS-51系列单片微处理器,只要采用两根通用I/O,并且严格按照I2C总线规程来模拟I2C总线,同样可以使用带I2C总线接口的器件来作为外扩I/O口的接口电路。■
参考文献:
1. 吴金戊、沈庆阳、郭庭吉,8051 单片机实践与应用,学苑出版社,1993
2. 赖麒文,8051 单片机C语言彻底应用,科学出版社,2002
作者简介:
吴强,南京师范大学数科院助教,主要从事计算机应用及语言的教学、科研。
图1 起始、终止信号时序
图3 基于I2C总线串行控制的测振仪原理框图
;************************************
; 向X24C16 写入一字节数据子程序
;************************************
WR24: ACALL STA24 发起始信号
mov a,addwh 存储单元地址高位
clr c
rlc a
orl a,#0a0h ; 器件码1010
acall send 发送
mov a,addwl 存储单元地址低8位
acall send
MOV A,DATA 数据在DATA中
acall send 发送
acall STOP 发终止信号
RET
;*************************
; 24C16 读出子程序
;*************************
RD24: ACALL STA24
mov a,addrh
clr c
rlc a
orl a,#0A0h ; special code for read(0a1h)
acall send
mov a,addrl
acall send
acall sta24
mov a,#0A1h
acall send
acall read
mov data,a
acall stop
RET
;************************
; 启动 24C16(发I2C总线起始信号)
;************************
STA24: setb scl
setb sda
nop
clr sda
nop
nop
nop
clr scl
nop
ret
;************************
; 24C16 关闭(发I2C总线终止信号)
;************************
STOP: clr sda
nop
nop
setb scl
nop
nop
setb sda
nop
nop
nop
clr scl
nop
ret
;************************
; 24C16写入
;************************
send: MOV R7,#08H
clr scl
lop: RLC A
mov sda,c
nop
nop
setb scl
nop
nop
clr scl
djnz r7,lop
setb sda 应答信号
setb scl
nop
nop
lop1: mov c,sda
jc lop1
clr scl
ret
;***************************
; 按位读出每一位
;***************************
READ: MOV R7,#08H
clr scl
RLP: nop
nop
setb scl
nop
mov c,sda
rlc a
nop
nop
clr scl
djnz r7,rlp
clr sda 应答信号
nop
nop
setb scl
ret