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

📄 control.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   ;断路标志位
      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   COUNT,#64H     ;初始化计数器
NEXT: LCALL ON        ;触发一次
      LCALL D1MS
      MOV   R0,#21H        ;将第一次状态数据区首地址送入R0
      LCALL COLLECT        ;采集三块电路板的状态
      CLR  TR0
WORK: LCALL TRIGGER        ;进行一次触发
      MOV TL0,#18H        ;T0定时2MS初始化
      MOV TH0,#0FcH
      SETB TR0
      JNB   TF0,  $        ;等待2MS时间到
      CLR  TR0
      CLR   TF0            ;清TF0
      DJNZ   COUNT , WORK    ;100次结束?
      LCALL OFF            ;第二次电路状态采集
      LCALL  DELAY
      MOV   R0,#24H        ;将第二次状态数据区首地址送入R0
      LCALL COLLECT        ;采集三块电路板的状态
      LCALL DEAL           ;对电路状态进行判断处理
      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中
          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的应答

⌨️ 快捷键说明

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