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

📄 control.asm

📁 交流调功器的程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        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
;;====================================================================================
INITIAL:MOV DPTR,#0FDFFH     ;取拨码开关的地址
        MOVX A,@DPTR        ;将拨码开关的状态送入A
        PUSH  ACC           ;将状态备份
        ANL  A,#3FH
        MOV  ADDR,A         ;将拨码开关的低六位作为本机地址存入地址寄存器
        POP ACC             ;取出备份
        ANL A,#0C0H
        SWAP  A
        RR A
        RR A                ;取出拨码开关的高两位用于波特率的的选择
        MOV TMOD,#21H       ;T0工作在方式1,T2工作在方式2
        MOV PCON,#00H       ;波特率不加倍
        CJNE A,#00H,IN1     ;拨码开关的低两位为00则波特率设为2400
        MOV TL1,#0F4H       ;
        MOV TH1,#0F4H
        SJMP IN4
IN1:    CJNE A,#01H,IN2     ;拨码开关的低两位为01则波特率设为4800
        MOV TL1,#0FAH       ;
        MOV TH1,#0FAH
        SJMP IN4
IN2:    CJNE A,#02H,IN3     ;拨码开关的低两位为10则波特率设为9600
        MOV TL1,#0FDH       ;
        MOV TH1,#0FDH
        SJMP IN4
IN3:    MOV PCON,#80H       ;拨码开关的低两位为11则波特率设为19200
        MOV TL1,#0FDH
        MOV TH1,#0FDH
IN4:    MOV  SCON,#0F0H     ;串口工作在方式3,允许串口接收
         
        SETB ES             ;开串口中断
        SETB TR1            ;启动T1
        SETB EA             ;开中断
        MOV TL0,#30H       ;T0定时2MS初始化
        MOV TH0,#0F8H
        CLR TF0
        RET
;作用:根据拨码开关的状态确定本机地址和485通信的波特率,并完成串口和20MS定时器的初始化
;====================================================================================
COPY: PUSH 00H
      PUSH 01H
      PUSH 02H
      PUSH ACC
      MOV  R0,#08H
      MOV  R1,#30H
      MOV  R2,#18H
COPY1:MOV  A,@R0
      MOV  @R1,A
      INC R0
      INC R1
      DJNZ R2,COPY1
      POP  ACC
      POP  02H
      POP  01H
      POP  00H
      RET
;作用:将24路的加热数据送入相应的加热计数器中
;入口:@R0
;出口: @R1
;寄存器占用:A,R0,R1,R2
;子程序调用无
;=======================================================================================
DRIVE: PUSH 02H               ; 保护现场
       MOV   R2,#08H          ; 确定8路的输出状态
       CLR   A                ;A清零
DRIVE1:CJNE @R1,#00H,DRIVE2   ; 该路是否触发完毕
       SETB C                 ; 完毕则置高平
       SJMP DRIVE3            ;
DRIVE2:CLR  C                 ; 否则继续触发(输出低电平)
       DEC  @R1               ; 将该路的触发次数减一
DRIVE3:RRC A                  ; 将该状态位移入A中
       INC R1                 ; 准备判断下一路
       DJNZ  R2,DRIVE1        ; 8路是否处理完毕
       POP  02H               ; 恢复现场
       RET
;作用:把以R1内容为首地址的8个通路的触发状态经过处理送入ACC中
;入口:R1
;出口:ACC
;寄存器占用:R1,R2,ACC,PSW
;子程序调用: 无
;====================================================================================
TRIGGER:MOV R1,#30H             ;第一块板的加热计数器首地址送入R1
        LCALL DRIVE             ;将本次各路的触发状态送入A中
        MOV DPTR,#7FFFH         ;第一块板的地址送入DPTR中
        MOVX @DPTR,A            ;触发可控硅
        MOV  29H,A              ;将第一块板的状态存入29H
        MOV R1,#38H             ;第二块板的加热计数器首地址送入R1
        LCALL DRIVE             ;将本次各路的触发状态送入A中
        MOV DPTR,#0DFFFH        ;第二块板的地址送入DPTR中 '''''''''''????????检测
        MOVX @DPTR,A            ;触发可控硅
        ANL  A,29H              ;第一块板的状态与第二块板的的状态作与运算
        MOV  29H,A              ;结果存入29H
        MOV R1,#40H             ;第三块板的加热计数器首地址送入R1
        LCALL DRIVE             ;将本次各路的触发状态送入A中
        MOV DPTR,#0F7FFH        ;第三块板的地址送入DPTR中
        MOVX @DPTR,A            ;触发可控硅
        ANL  A,29H              ;三块电路板与运算
        CJNE A,#0FFH,TRI1       ;结果不为为FFH则有输出
        SETB P1.4               ;结果为FFH则熄灭输出指示灯
        SJMP TRI2
TRI1:   CLR  P1.4               ;点亮输出指示灯
TRI2:    RET
;====================================================================================
COLLECT:MOV DPTR,#0BFFFH        ;第一块板的电路状态地址送入DPTR
        MOVX A,@DPTR            ;采集
        MOV  @R0,A              ;将数据送入状态数据寄存器
        INC R0                  ;调整状态数据寄存器地址
        MOV DPTR,#0EFFFH        ;第一块板的电路状态地址送入DPTR
        MOVX A,@DPTR            ;采集
        MOV  @R0,A              ;将数据送入状态数据寄存器
        INC R0                  ;调整状态数据寄存器地址
        MOV DPTR,#0FBFFH        ;第一块板的电路状态地址送入DPTR
        MOVX A,@DPTR            ;采集
        MOV  @R0,A              ;将数据送入状态数据寄存器
        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 + -