⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c02b.asm

📁 交流调功器的程序
💻 ASM
字号:
       WP  EQU P1.0
       SCL EQU P1.1
       SDA EQU P1.2
       DIR EQU P1.7
       COUNTER   DATA 7FH ;数据线上的位计数器
       COUNTER1  DATA 7EH ;延时计数器
       RI2CDATA  DATA 7DH ;从24c02读出的数据暂存器
       WI2CDATA  DATA 7CH ;向24c02写入的数据暂存器
       QADDR     DATA 7BH  ;24c02的地址寄存器
       CADDR     DATA 7AH  ;24c02中的存储器地址
       MADDR     DATA 79H  ;单片机内存地址
       ADDR      DATA 77H  ;本机地址寄存器
       COUNT     DATA 78H  ;触发个数计数器
        ORG 0000H
MAIN:   MOV SP,#60H
        MOV R5,#04H
        MOV R6,#00H
RE2:    MOV 58H, R6
        INC R6
        MOV  R1,#20H
        MOV  R2,#18H
RE1:    MOV  @R1,58H
        INC R1
        INC 58H
        DJNZ  R2,RE1

        CLR  WP
       MOV  MADDR,#20H
       MOV  CADDR,#00H
       MOV  QADDR,#0A0H
       LCALL PWRITE
       MOV  MADDR,#28H
       MOV  CADDR,#08H
       MOV  QADDR,#0A0H
       LCALL PWRITE
       MOV  MADDR,#30H
       MOV  CADDR,#10H
       MOV  QADDR,#0A0H

       LCALL PWRITE

       MOV  MADDR,#40H
       MOV  CADDR,#00H
       MOV  QADDR,#0A0H

       LCALL READ24
       DJNZ  R5,RE2

       SJMP $
;==================================================
;         延时子程序
SOMENOP : MOV COUNTER1,#00H
SOMENOP1: DJNZ COUNTER1,SOMENOP1
          RET
;==================================================

START   : CLR   WP       ;取消写保护
          SETB  SDA      ;释放数据线
          SETB  SCL      ;将时钟线置高
          LCALL SOMENOP  ;调用延时子程序
          CLR  SDA       ;SDA产生一个由高到低的跳变
          LCALL SOMENOP  ;调用延时子程序
          CLR   SCL      ;将时钟线置低
          RET
;作用:用于产生总线上的数据传输起始信号
;入口:无
;出口:无
;子程序调用:SOMENOP
;寄存器占用:无
;===================================================

STOP    :SETB SCL      ;将时钟线置高
         CLR  SDA      ;将数据线线置低
         LCALL SOMENOP ;调用延时子程序
         SETB  SDA     ;SDA产生一个由低到高的跳变
         LCALL SOMENOP ;调用延时子程序
         SETB   WP            ;设置写保护
         RET
;作用:用于产生总线上的数据传输结束信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;===================================================

WACK    :CLR SCL       ;将时钟线置低
         SETB SDA      ;释放数据线
         LCALL SOMENOP ;延时等待ACK信号出现
         SETB SCL      ;将时钟线置高
         LCALL SOMENOP ;准备读取ACK信号
         MOV C,SDA     ;读取应答信号
         JC WACK       ;判断应答信号
         CLR SDA       ;将数据线线置低
         CLR SCL       ;将时钟线置低
         RET
;作用:等待接受器发来应答信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:PSW
;=============================================

ACK     :CLR SDA        ;产生低电平的ACK信号
         LCALL SOMENOP  ;延时
         SETB  SCL      ;将时钟线置高
         LCALL SOMENOP  ;延时
         CLR  SCL       ;将时钟线置低
         RET
;作用:向发送器发送应答信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;=================================================

NACK   : SETB SDA      ;产生高电平的NACK信号
         LCALL SOMENOP ;延时
         SETB  SCL     ;将时钟线置高
         LCALL SOMENOP ;延时
         CLR  SCL      ;将时钟线置低
         RET
;作用:向发送器发送NACK信号
;入口:无
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:无
;===========================================

SBYTE  : MOV COUNTER,#8H       ;发出8个数据位
SBYTE1 : CLR SCL               ;将时钟线置为低电平
         RLC A                 ;最高位移入C中
         MOV SDA,C            ;送入数据线
         LCALL SOMENOP        ;延时
         SETB SCL             ;将时钟线置为高电平
         LCALL SOMENOP        ;延时
         DJNZ COUNTER,SBYTE1  ;判断8个数据位是否发送完毕
         CLR SCL              ;发送完毕将时钟线置为低电平
         RET
;作用:向接受器发送一个字节数据
;入口:ACC(待发送的数据)
;出口: 无
;子程序调用:SOMENOP
;寄存器占用:ACC,PSW,COUNTER
;==================================================

RBYTE  :MOV COUNTER,#8H    ;共接收8个数据位
        CLR A              ;将A清零
        SETB SDA           ;释放数据线
RBYTE1 :CLR  SCL           ;将时钟线置低
        LCALL SOMENOP      ;延时
        SETB SCL           ;将时钟线置高
        LCALL SOMENOP      ;延时
        MOV C,SDA          ;读入一位数据
        RLC    A           ;移入A中
        SETB SDA           ;释放总线
        DJNZ COUNTER,RBYTE1;判断是否接收完8位数据
        MOV  RI2CDATA,A    ;接受完后存入读数据暂存器
        CLR  SCL           ;将时钟线置低
        RET
;作用:从发送器接收一个字节的数据
;入口:无
;出口: RI2CDATA
;子程序调用:SOMENOP
;寄存器占用:ACC,PSW,COUNTER,RI2CDATA
;=====================================================

WRITE   : PUSH ACC        ;保护现场
         
          LCALL START     ;发出数据传输起始信号
          MOV  A,#0FEH
          ANL A,QADDR     ;将该24C02的写命令字送入A中
          LCALL SBYTE     ;发出
          LCALL WACK      ;等待24C02的应答
          MOV A,CADDR     ;将要写入的存储器地址送入A中
          LCALL   SBYTE   ;发出
          LCALL  WACK     ;等待24C02的应答
          MOV A, WI2CDATA ;将要写入的数据送入A中
          LCALL   SBYTE   ;发出
          LCALL WACK      ;等待24C02的应答
          LCALL STOP      ;结束本次数据传输
          LCALL SOMENOP   ;等待24C02的内部写操作
          POP ACC         ;恢复现场
          RET
;作用:向任一24c02的任一地址写入一个字节的数据
;入口:WI2CDATA(写数据暂存器),QADDR(24C02的地址) ,CADDR(24C02中的存储器地址)
;出口: 无
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK
;寄存器占用:ACC,PSW,WI2CDATA ,QADDR  ,CADDR
;===================================================================

READ    : PUSH  ACC         ;保护现场
          LCALL START       ;发出数据传输起始信号
          MOV  A,#0FEH
          ANL A,QADDR       ;将该24C02的写命令字送入A中
          LCALL   SBYTE     ;发出
          LCALL WACK        ;等待24C02的应答
          MOV A,  CADDR     ;将要读的的存储器地址送入A中
          LCALL   SBYTE     ;发出
          LCALL WACK        ;等待24C02的应答
          LCALL START       ;发出数据传输起始信号
          MOV    A,#1H
          ORL    A,QADDR    ;将该24C02的读命令字送入A中
          LCALL  SBYTE      ;发出
          LCALL WACK        ;等待24C02的应答
          LCALL RBYTE       ;取走数据
          LCALL NACK        ;发出非应答信号
          LCALL STOP        ;结束数据传输
          POP ACC           ;恢复现场
          RET
;作用:从任一24c02的任一地址读出一个数据放入RI2CDATA中
;入口:QADDR(24C02的地址) ,CADDR(24C02中的存储器地址)
;出口: RI2CDATA
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK ,NACK
;寄存器占用:ACC,PSW,RI2CDATA ,QADDR  ,CADDR
;========================================================

PWRITE: PUSH  00H
        PUSH  02H
        PUSH  ACC         ;保护现场
        MOV R0, MADDR     ;待写入数据存储器首地址送入R0
        MOV R2,#08H       ;写入数据个数
        LCALL START       ;发出数据传输起始信号
        MOV  A,#0FEH
        ANL A,QADDR       ;将该24C02的写命令字送入A中
        LCALL SBYTE       ;发出
        LCALL WACK        ;等待24C02的应答
        MOV A,CADDR       ;要写入的24C02的存储器首地址
        LCALL   SBYTE     ;发出
        LCALL  WACK       ;等待24C02的应答
PWRITE1:
        MOV A, @R0
        LCALL SBYTE       ;发出
        LCALL WACK        ;等待24C02的应答
        LCALL SOMENOP     ;延时
        INC R0            ; 数据存储器地址加一
        DJNZ  R2 , PWRITE1;8个数据是否写完
        LCALL STOP        ;结束数据传输
        LCALL SOMENOP     ;等待24C02的内部写操作
        POP ACC
        POP 02H
        POP 00H            ;恢复现场
        RET
;作用:向任一24c02的任一起始地址开始连续写入8个以MADDR为首地址的数据
;入口:QADDR(24C02的地址) ,CADDR(24C02中的存储器首地址),MADDR(待写入数据存储器首地址)
;出口: 无
;子程序调用:SOMENOP ,SBYTE ,START, STOP, WACK ,NACK
;寄存器占用:ACC,PSW ,QADDR  ,CADDR  ,MADDR ,R0,R2
;===========================================================================

READ24: PUSH  00H
        PUSH  01H
        PUSH  02H
        PUSH  ACC           ;保护现场
        CLR   WP            ;取消写保护
        MOV R0, #08H       ;待存入的数据存储器首地址送入R0
        MOV R1, #02h        ;24C02中要读出的数据首地址送入R1
        MOV QADDR,#0A0H
        MOV R2,#18H         ;读取数据的个数送入R2
READ241:MOV CADDR,R1
        INC R1              ;要读出的数据地址加一
        LCALL READ           ;读出数据
        MOV @R0, RI2CDATA    ;将数据存入单片机内
        INC R0               ;调整内存地址
        DJNZ R2, READ241     ;判断是否操作完
        POP ACC
        POP 02H
        POP 01H
        POP 00H              ;恢复现场
        RET
;作用:从任一24c02读出以CADDR为首地址的24 个数据存放在以MADDR为首地址的数据存储区
;入口:QADDR(24C02的地址) ,CADDR(24C02中要读出的数据首地址),MADDR(待存入的数据存储器首地址)
;出口: 以MADDR为首地址的24个存储单元
;子程序调用:read
;寄存器占用:ACC,QADDR  ,CADDR  ,MADDR ,R0,R1,R2 ,RI2CDATA
;==========================================================================

READ24: PUSH  00H
        PUSH  01H
        PUSH  02H
        PUSH  ACC           ;保护现场
        MOV R0, MADDR       ;待存入的数据存储器首地址送入R0
        MOV R1,CADDR        ;24C02中要读出的数据首地址送入R1
        MOV R2,#18H         ;读取数据的个数送入R2
READ241:MOV CADDR,R1
        INC R1              ;要读出的数据地址加一
        LCALL READ           ;读出数据
        MOV @R0, RI2CDATA    ;将数据存入单片机内
        INC R0               ;调整内存地址
        DJNZ R2, READ241     ;判断是否操作完
        POP ACC
        POP 02H
        POP 01H
        POP 00H              ;恢复现场
        RET
;作用:从任一24c02读出以CADDR为首地址的24 个数据存放在以MADDR为首地址的数据存储区
;入口:QADDR(24C02的地址) ,CADDR(24C02中要读出的数据首地址),MADDR(待存入的数据存储器首地址)
;出口: 以MADDR为首地址的24个存储单元
;子程序调用:read
;寄存器占用:ACC,QADDR  ,CADDR  ,MADDR ,R0,R1,R2 ,RI2CDATA

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -