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

📄 h06.asm

📁 交流调功器的程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
 WP       EQU  P1.0
      SCL       EQU  P1.1
      SDA       EQU  P1.2
      DIR       EQU  P1.7
      SHORT     BIT  00H   ;短路标志位
      CUT       BIT  01H   ;断路标志位
      TIME      BIT  02H   ;过零标志位
      FLAG      BIT  03H   ;6.7MS时间到
      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   ;触发个数计数器
      MCOUNT    DATA 2CH   ;移位计数器
;=====================================================================================
       ORG 000H
        SJMP MAIN
       ORG 0003H
       LJMP INTSVE
       ORG  000BH
       LJMP T0SVE
       ORG  0023H
       LJMP RXSVE
 MAIN: MOV   SP,  #60H      ;设立栈底
       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通信的波特率
      SETB  TIME
      SETB  FLAG
REDO :MOV  COUNT,#00H
      MOV  MCOUNT,#00H
      LCALL GETAD
      LCALL GETVA
      LCALL OUTVA
      INC   MCOUNT
      MOV   6CH,#00H
      MOV   6DH,#00H
      MOV   6EH,#00H
      MOV   R0,#21H        ;将第一次状态数据区首地址送入R0
      SETB EX0            ;开外部中断0
      LCALL FIRST_COL        ;采集三块电路板的状态
      LCALL OUTVA
      INC   MCOUNT
GO2:  LCALL TRIGGER
      INC   COUNT
      MOV   A, MCOUNT
      CJNE  A,#08H,GO1
      MOV   MCOUNT,#00H
      LCALL GETVA
GO1:  LCALL OUTVA
      INC   MCOUNT
      MOV   A,COUNT
      CJNE  A,#63H,GO2
      MOV A,#0FFH
      MOV 6CH,A
      MOV 6DH,A
      MOV 6EH,A
      MOV   R0,#24H        ;将第二次状态数据区首地址送入R0
     LCALL SECEND_COL        ;采集三块电路板的状态
      LCALL DEAL           ;对电路状态进行判断处理
      LJMP  REDO
;====================================================================================
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,T1工作在方式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,允许串口接收
        MOV  TCON ,#01H     ;外部中断负边沿触发
        MOV  IE,#00H        ;
        MOV  IP,#01H        ;串口中断高优先级
        SETB ES             ;开串口中断
        SETB ET0            ;开T0中断
        SETB TR1            ;启动T1
        SETB EA             ;开中断
        RET
;作用:根据拨码开关的状态确定本机地址和485通信的波特率,并完成串口和20MS定时器的初始化
;=====================================================================================
;         延时子程序
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
;=====================================================

⌨️ 快捷键说明

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