首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AT24C02(51汇编)

AT24C02(51汇编)

;按复位按键。 该程序可以记录存储复位的次数
UBADR EQU 40H
BITCNT EQU 41H
SUBADR EQU 42H
SDA     BIT     P3.6        
SCL     BIT     P1.5
ORG 00H
JMP MAIN
ORG 100H
MAIN:
     MOV P2,0
     ACALL READ_24C02   ;调用读24C02子程序
     MOV DPTR,#TABLE   
     MOV A,R7
     MOVC A,@A+DPTR
     MOV P0,A
     ACALL DELAY
     INC R7
     ACALL WRITE_24C02   ;;调用写24C02程序
     ACALL DELAY
     ACALL DELAY
     JMP $
;===================================
DELAY:  MOV     R0,#0FFH
DELAY0: MOV     R1,#0FFH
DELAY1: NOP
        NOP
        NOP
        DJNZ    R1,DELAY1
        DJNZ    R0,DELAY0
        RET
;============================
WRITE_24C02:
            ACALL START     ;发送IC总线起始条件
            MOV A,#0A0H      ;24C02总线地址
            ACALL SENTBYTE   ;发送24C02器件总线地址
            JB F0,SENDRETURN ;出错返回
            MOV A,SUBADR       ;取存储地址
            ACALL SENTBYTE
            JB F0,SENDRETURN
            MOV A,R7
            ACALL SENTBYTE     ;发送一次数据
            JB F0,SENDRETURN    ;出错返回
            ACALL STOP             ;发送IC总线停止条件
DELAY10:                         ;延时10MS等待数据写完
        MOV 44H,30H
D1: MOV 45H,#34H
    DJNZ 45H,$
    DJNZ 44H,D1
SENDRETURN:
RET
;=======================================
READ_24C02:                             ;读24C02
           ACALL START                ;发送IC总线起始条件
           MOV A,#0A0H
           ACALL SENTBYTE                 ;24C02总线地址
           JB F0,RCVRETURN                 ;出错返回
           MOV A,SUBADR               ;取存储地址
            ACALL SENTBYTE             ;发送24C02器件总线地址
            JB F0,SENDRETURN             ;出错返回
           ACALL START                      ;发送IC总线重复起始条件
           MOV A,#0A0H                      ;24C02总线地址
           SETB ACC.0                               ;取总线读操作数
           ACALL SENTBYTE                        ;发送被控制总线地址
           JB F0,RCVRETURN                       ;出错返回
           ACALL RCVBYTE                ;接受数据
RCVRETURN:
RET
;=========================================
START:
     SETB SDA               ;发送起始条件的数据信号
     NOP
     NOP
     NOP
     SETB SCL              ;发送起始条件的时钟信号
     NOP                    ;起始条件建立时间大于4.7s
     NOP
     NOP
     CLR SDA                  ;发送起始信号
     NOP                        ;起始条件锁定时间大于4s
     NOP
     NOP
     CLR SCL                 ; 钳住IC总线准备发送或接受数据
     RET
;==================================
STOP:
     CLR SDA                   ;发送停止条件的数据信号
     NOP
     NOP
     NOP
     SETB SCL                       ;发送停止条件的时钟信号
     NOP                              ;起始条件建立时间大于4s
     NOP
     NOP
     SETB SDA                       ;发送IC总线停止信号
     NOP
     NOP
     NOP
     NOP
     RET
;===============================
SENTBYTE:                                ;送数8位
         MOV BITCNT,#08H
SENTB:
      RLC A                         ;要发送的数据左移,发送入位C
      MOV SDA,C
      NOP
NOP
      NOP
      SETB SCL                    ;置时钟线为高,通知被控制开始接受数据位
      NOP                          ;保证时钟高周期大于4s
      NOP
      NOP
      CLR SCL                     ;钳住总线准备接受下一个数据位
      DJNZ BITCNT,SENTB          ;8位没发送完继续发送
      NOP
     NOP
     SETB SDA                         ;8位发送完后释放数据线准备收应答位
     NOP
     NOP
     SETB SCL                         ;开始接受应答信号
     NOP
     NOP
     CLR F0                         ;预先清发送数据出错标志
     JNB SDA,ACKEND                 ;判断是否接受应答信号正常转ACKEND
     SETB F0                        ;未受到应答置位错误标志
ACKEND:
        NOP
        CLR SCL                    ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理
        RET
;=================================
RCVBYTE:
        SETB SDA                 ;置数据线为输入方式
        MOV BITCNT,#08H        ;要传送的数据长度为8位
RCV:
    NOP
    CLR SCL                    ;置时钟线为低,准备接受数据
     NOP                    ;时钟低周期大于4.7s
     NOP
     NOP
     NOP
     NOP
     SETB SCL                 ;置时钟线为高使数据线上数据有效
     NOP
     NOP
     MOV C,SDA
     RLC A                      ;接受的数据位放入ACC
     NOP
     NOP
     DJNZ BITCNT,RCV               ;8位没收完继续接受
     CLR SCL                        ;8位接受完置时钟线和数据线
     NOP
     NOP
     CLR SDA
     SETB SDA                      ;接受非应答信号
        NOP
     NOP
     SETB SCL                       ;置时钟线为高使应答位有效
     NOP                              ;时钟高周期大于4.7s
     NOP
     SETB SDA
     NOP
     NOP
     NOP
     CLR SCL            ;清时钟线钳住IC总线以便发送停止条件
     RET

TABLE: DB   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
       END
返回列表