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

📄 h06.asm

📁 交流调功器的程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:

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
;;====================================================================================
;====================================================================================
FIRST_COL:MOV A,6CH
         MOV DPTR,#7FFFH         ;第一块板的地址送入DPTR中
         JB   TIME, $            ;第一相过零
         MOVX @DPTR,A            ;触发第一块板的可控硅
         SETB TIME               ;置位
         MOV  TH0  ,#0F0H
         MOV  TL0  ,#60H
         SETB TR0                ;4ms计时开始(采集第一块板状态的延时)
         JB   FLAG, $            ;4ms到?
         SETB FLAG
         MOV DPTR,#0BFFFH        ;第一块板的电路状态地址送入DPTR
         MOVX A,@DPTR            ;采集
         MOV  @R0,A              ;将数据送入状态数据寄存器
         
         MOV  TH0  ,#0E0H
         MOV  TL0  ,#0C0H
         SETB TR0                ;1.3ms计时开始(关断A相的延时)
         MOV A,#0FFH
         MOV DPTR,#7FFFH         ;第一块板的地址送入DPTR中
         JB   FLAG, $            ;1.3ms到?
         SETB FLAG
         MOVX @DPTR,A            ;关断A相
         
         RET
;作用:将三块电路板的电路状态采入并存放到以R0内容为首地址的状态数据寄存区中
;入口:3个244
;出口:以R0内容为首地址的状态数据寄存区
;子程序调用:无
;寄存器占用:DPTR,A,R0
;====================================================================================
SECEND_COL:MOV A,6CH
           MOV DPTR,#7FFFH         ;第一块板的地址送入DPTR中
           JB   TIME, $            ;第一相过零
           MOVX @DPTR,A            ;触发第一块板的可控硅
           SETB TIME               ;置位
           MOV  TH0  ,#0F0H
           MOV  TL0  ,#60H
           SETB TR0                ;4ms计时开始(采集第一块板状态的延时)
           JB   FLAG, $            ;4ms到?
           SETB FLAG
           MOV DPTR,#0BFFFH        ;第一块板的电路状态地址送入DPTR
           MOVX A,@DPTR            ;采集
           MOV  @R0,A              ;将数据送入状态数据寄存器
           INC R0                  ;调整状态数据寄存器地址
           
           RET
;作用:将三块电路板的电路状态采入并存放到以R0内容为首地址的状态数据寄存区中
;入口:3个244
;出口:以R0内容为首地址的状态数据寄存区
;子程序调用:无
;寄存器占用:DPTR,A,R0
;=======================================================================================
RXSVE: CLR ES
       CLR RI
       PUSH  ACC
       PUSH  00H
       MOV   A,SBUF
       XRL   A,ADDR
       JZ    RXSVE1
RXSVE2:
       RETI
RXSVE1:CLR  SM2
       CLR  P1.7
       MOV  SBUF,ADDR
       SETB P1.7
       JNB  RI,$
       CLR  RI
       reti
;===================================================================================
DEAL: SETB SHORT
      SETB CUT
      SETB P1.5
      SETB P1.6
      MOV  A,21H
      XRL  A,24H
      CJNE A,#0FFH,DE1      ;第一块电路板有问题吗?,有则进行检测
DE2 : MOV  A,22H
      XRL  A,25H
      CJNE A,#0FFH,DE3      ;第二块电路板有问题吗?,有则进行检测
DE4 : MOV  A,23H
      XRL  A,26H
      CJNE A,#0FFH,DE5      ;第三块电路板有问题吗?,有则进行检测
      LJMP DEAL3              ;电路没有问题不作任何处理
DE1  :MOV  R0,#08H          ;第一块板的数据区首地址送入R0
      MOV  R5,#01H          ;第一块板号送入R5
      MOV  A,21H            ;第一块板的第一次采集的电路状态送入A
      MOV  R1,24H           ;第一块板的第二次采集的电路状态送入R1
      LCALL DONE            ;判断处理
      SJMP  DE2             ;检测第二块电路板
DE3:  MOV  R0,#10H          ;第二块板的数据区首地址送入R0
      MOV  R5,#02H          ;第二块板号送入R5
      MOV  A,22H            ;第二块板的第一次采集的电路状态送入A
      MOV  R1,25H           ;第二块板的第二次采集的电路状态送入R1
      LCALL DONE            ;判断处理
      SJMP  DE4             ;检测第三块电路板
DE5 : MOV  R0,#18H          ;第三块板的数据区首地址送入R0
      MOV  R5,#03H          ;第三块板号送入R5
      MOV  A,23H            ;第三块板的第一次采集的电路状态送入A
      MOV  R1,26H           ;第三块板的第二次采集的电路状态送入R1
      LCALL DONE            ;判断处理
DE6:  JNB  SHORT,DEAL1      ;短路了则进入DEAL1
      SJMP DEAL2            ;否则判断是否断路
DEAL1: CLR   P1.6           ;翻转短路指示灯
DEAL2: JB  CUT  ,DEAL3      ;未断路则电路正常则返回
DEAL4: CLR   P1.5           ;翻转断路指示灯
DEAL3:RET

;作用:判断各个电路的运行状况,出现异常则上传故障码,并进行指示灯的闪烁
;入口:A(第一次采集的电路状态),R0(加热数据区首地址),R1(第二次采集的电路状态),R5(板号)
;出口:无
;子程序调用:DONE
;寄存器占用

⌨️ 快捷键说明

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