当前位置: 代码迷 >> 单片机 >> 89c51 IIC模拟串行通信有关问题
  详细解决方案

89c51 IIC模拟串行通信有关问题

热度:166   发布时间:2016-04-28 16:17:13.0
89c51 IIC模拟串行通信问题
各位用过89c51   IIC模拟通信的朋友,以下的程序为写串行E2PROM子程序,但是仿真时第10、11行程序
  ACALL   SENDBYTE ;出错
  DJNZ  R7,AGAIN;出错
请问大家应该怎样解决此问题,比如在IIC模拟协议方面,整个程序还有其它错误吗?我看了一些程序,
他们用NOP进行延时,这样以延时子程序有何差别


;写串行E2PROM子程序EEPW
;   A0H=10100000(命令1010+器件3位地址+读/写。   器件地址一个芯片,是000)
;   (R4)=片内字节地址
;   (R1)=欲写数据存放地址指针
;   (R7)=连续写字节数n
SCL   BIT   P3.4                                             ;定义24C02的串行时钟线  
SDA   BIT   P3.5                                             ;定义24C02的串行数据线
EEPW:   MOV P1,#0FFH

     ACALL     START  ;发开始信号
     MOV  A,#0A0H  ;送器件地址
     ACALL    SENDBYTE
     MOV  A,R4  ;送片内字节地址
     ACALL SUBS
AGAIN:   MOV A,@R1
     ACALL   SENDBYTE ;调发送单字节子程序INC     R1
     DJNZ  R7,AGAIN;连续写n个字节
;产生I2C总线数据传输停止信号
STOP:             SETB         SCL                        
                      CLR           SDA
                      ACALL       SOMENOP
                      SETB         SDA
                      ACALL       SOMENOP
     RET
;产生I2C总线数据传输起始信号
START:           SETB         SDA                         ;置SDA为高电平状态
                      SETB         SCL                         ;置SCL为高电平状态
                      ACALL       SOMENOP                 ;模拟SCL高电平状态计数
                      CLR           SDA                         ;使SDA产生一个由高到低的跳变
                      ACALL       SOMENOP                 ;延时,模拟SDA 低电平状态计数
                      CLR           SCL                         ;将SCL置为低电平状态
                      RET  

;SENDBYTE     向I2C总线发送一个字节        
;ACC待发送的数据字节存放在ACC中
SENDBYTE:     MOV           COUNTER,#08H       ;一个字节共送出8位数据
SENDBYTE1:   CLR           SCL                         ;置SCL为低电平状态
                      RLC           A                             ;带进位循环左移,将最高位移至C