heatcope.asm

来自「交流调功器的程序」· 汇编 代码 · 共 511 行 · 第 1/2 页

ASM
511
字号

      WP        EQU  P1.0
      SCL       EQU  P1.1
      SDA       EQU  P1.2
      DIR       EQU  P1.7
      SHORT     BIT  00H   ;短路标志位
      CUT       BIT  01H   ;断路标志位
      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 000H
      SJMP MAIN
      ORG  0023H
      LJMP RXSVE
 MAIN: MOV   SP,  #50H      ;设立栈底      
      MOV   P1,  #0FFH     ;初始化P1
      CLR   P1.3           ;点亮CPU指示灯
      MOV   20H,#0FFH      ;初始化标志位区
      ;LCALL R4I2C          ;读出4个24C02的验证数据
      ;LCALL JUDGE          ;判断,不相同或为零则停机,否则减一
     ; LCALL W4I2C          ;向4个24C02写入验证数据
      ;LCALL READ24         ;读出加热数据
      LCALL INITIAL        ;根据拨码开关的状态确定本机地址和485通信的波特率
      mov r0,#0                     ;并完成串口和20MS定时器的初始化
REDO: LCALL COPY           ;将24路的加热数据送入相应的加热计数器中
      MOV 2FH,#00H
      MOV 2EH,#00H

      MOV   COUNT,#64H     ;初始化计数器
NEXT: LCALL ON        ;触发一次

       LCALL D1MS
      ; LCALL D1MS

      ;LCALL D1MS
     ; LCALL D1MS
     ; LCALL D1MS
      SETB   P1.2
      MOV    C,P1.2
      MOV   70H,C
      ;SETB  TR0            ;开始计数
;WE:   LCALL TRIGGER
      ;MOV    A,COUNT
     ; CJNE  A, #64H,  GO1  ;不是第一次触发则继续
     ; LCALL D1MS           ;是第一次触发则延时准备采集电路状态
     ; MOV   R0,#21H        ;将第一次状态数据区首地址送入R0
      ;LCALL COLLECT        ;采集三块电路板的状态
;GO2:  JNB   TF0,  $        ;等待20MS时间到
      ;CLR   TF0            ;清TF0
       MOV TL0,#30H       ;T0定时2MS初始化
       MOV TH0,#0F8H

      ;DEC   COUNT          ;计数器减一
      ;SJMP  NEXT           ;进行下一次触发
;GO1 : DJNZ   COUNT , WE    ;当前是第99次触发吗,不是则不需要采集,20MS到后进行下一次触发
     ; CLR  TR0
      LCALL OFF            ;第一百次触发全为高电平
                 ;延时准备采集电路状态
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      LCALL D1MS
      SETB   P1.2
      MOV    C,P1.2
      MOV    78H,C
      ;LCALL D1MS
      ;LCALL D1MS
      ;MOV   R0,#24H        ;将第二次状态数据区首地址送入R0
     ; LCALL COLLECT        ;采集三块电路板的状态
     ; LCALL DEAL           ;对电路状态进行判断处理

        MOV A,2EH
        XRL A,2FH
        CJNE A,#00H,YY
         SJMP YY1
YY:  inc r0
      LJMP  REDO
 YY1:     SJMP $
      LJMP  REDO
;------------------------------------------------------------------------------------
;         延时子程序
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中

⌨️ 快捷键说明

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