赞助论坛
  • 6559阅读
  • 0回复

学习单片机之---AT89C51单片机对24C04的读写控制的代码 [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-20 17:27:46 
I 2 C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I 2 C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
  I 2 C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
  开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
  结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
  应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

下面是我写的AT89C51单片机对24C04的读写控制的代码:
;;;; 写入并读出一页数据
;;; RAM 1OH--17H 写入 24C02的 10H---17H
;;; 再将10h--17h   读出存入内部RAM 30H--37H
  ORG   000H
  ajmp   begin
  org   0050h
begin: mov     A,#1
  MOV   R0,#10H
TOU: MOV   @R0,A
  INC     R0
  INC     A
  CJNE   R0,#18H,TOU



  acall   start1
  mov   a,#0a0h
  acall   wbta
  acall   ack
  mov   r0,#10h
  mov   a,r0
  acall   wbta
  acall   ack

conw:mov   a,@r0
  acall   wbta
  acall   ack
  inc   r0
  cjne   r0,#14h,conw
  acall   stop     ;;;;写入数据

    mov   r7,#200
delay_01: nop
    nop
    nop
    djnz   r7,delay_01   ;;延时

    acall   start1
    mov   a,#0a0h
    acall   wbta
    acall   ack
    mov   a,#10h
    acall   wbta
    acall   ack
    acall   start1
    mov   a,#0a1h
    acall   wbta
    acall   ack

    mov   r0,#40h
contr: acall   rbta
    mov   @r0,a
    inc   r0
    acall   wack
    cjne   r0,#48h,contr
    acall   wnack       ;;;读出数据


rbta: mov   r7,#8     ;;读出一字节子程序
rbta1: setb   p0.6
    setb   p0.7
    mov   c,p0.6
    rlc   a
    clr   p0.7
    djnz   r7,rbta1
    clr   p0.6
    ret



wbta: mov   r7,#8     ;;写入一字节子程序
wbta1:rlc   a
    mov   p0.6,c
    setb   p0.7
    nop
    nop
    nop
    clr     p0.7
    clr     p0.6
    djnz   r7,wbta1
    ret
start1:setb   p0.7
    setb   p0.6
    nop
    nop
    nop
    clr     p0.6
    nop
    nop
    nop
    clr     p0.7
    ret
stop: clr     p0.6
    setb   p0.7
    nop
    nop
    nop
    setb   p0.6
    nop
    nop
    nop
    clr     p0.6
    ret
ack: setb   p0.6
    setb   p0.7
    jb     p0.6,$
    clr     p0.7
    clr     p0.6
    ret
wnack:setb   p0.6
    setb   p0.7
    nop
    nop
    nop
    clr     p0.7
    clr     p0.6
    ret
wack: clr     p0.6     ;;写入ack位
    setb   p0.7
    nop
    nop
    nop
    clr     p0.7
    setb   p0.6
    ret
对24C04的控制主要在于对其时序的控制。由于不同的IC的反应时间不一,写的时候,你可以读写的时候慢点来确保时序无误,然后再去调整起时间。