📄 web.asm
字号:
SCPRG: ACALL WATCHDOG ;调看门狗喂狗子程序.
ACALL DELAY
ACALL DELAY
ACALL DELAY
CLR RS485IO ;允许RS485输入.禁止RS485输出.
CLR RS232CE
SETB RS485CE ;选择RS485.
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
CLR RI
SCWAIT: ACALL WATCHDOG ;调看门狗喂狗子程序.
MOV A,ADDRESS ;读地址.
CJNE A,#00H,SCWAIT1 ;检测地址是否改动.
AJMP MAIN
SCWAIT1: JNB RI,SCWAIT ;无接收数据,则循环等待.
CLR RI
MOV A,SBUF
CLR ODD_BIT ;清除奇校验位.
CJNE A,#START_BYTE,SCPRG ;判断是否为起始位.
ACALL TIMESET ;设置定时器(60S).
SCWAIT3: ACALL WATCHDOG ;调看门狗喂狗子程序.
JNB RI,SCWAIT3 ;无接收数据,则循环等待.
CLR RI
MOV ASCADDH,SBUF
SCWAIT4: ACALL WATCHDOG ;调看门狗喂狗子程序.
JNB RI,SCWAIT4 ;无接收数据,则循环等待.
CLR RI
MOV ASCADDL,SBUF ;地址接收完毕.
ACALL TIMEOFF ;关定时器.
MOV A,ASCADDH
SWAP A
ANL A,#11110000B
MOV ADDREG,A
MOV A,ASCADDL
ANL A,#00001111B
ADD A,ADDREG
MOV ADDREG,A
MOV A,ADDRESS
CJNE A,ADDREG,SCPRG ;地址不符,返回.
SETB RS485IO ;允许RS485输出.禁止RS485输入.
CLR RS232CE
SETB RS485CE ;选择RS485.
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
MOV SBUF,ASCADDH ;地址相符,回发.
SCWAIT5: JNB TI,SCWAIT5 ;发送未完,则循环等待.
CLR TI
MOV SBUF,ASCADDL
SCWAIT6: JNB TI,SCWAIT6 ;发送未完,则循环等待.
CLR TI ;地址发送完毕
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
CLR RS485IO ;允许RS485输入.禁止RS485输出.
CLR RS232CE
SETB RS485CE ;选择RS485.
ACALL TIMESET ;设置定时器(60S).
SCWAIT7: ACALL WATCHDOG ;调看门狗喂狗子程序.
JNB RI,SCWAIT7 ;无接收数据,则循环等待.
CLR RI
MOV A,SBUF
ACALL TIMEOFF ;关定时器.
CLR ODD_BIT ;清除奇校验位.
CJNE A,#SEND_BYTE,SCNEXT1 ;判断是否为PC发送命令字.
AJMP SCSEND
SCNEXT1: CJNE A,#READ_BYTE,SCERRE1 ;判断是否为PC接收命令字.
AJMP SCREAD
SCERRE1: AJMP SCPRG ;出错,返回.
;接收PC机数据送到数控机床.
SCSEND: CLR RS485IO ;允许RS485输入.禁止RS485输出.
CLR RS232CE
SETB RS485CE ;选择RS485.
ACALL DELAY
ACALL DELAY
ACALL DELAY
CLR RI
ACALL TIMESET ;设置定时器(60S).
SCWAIT8: ACALL WATCHDOG ;调看门狗喂狗子程序.
JNB RI,SCWAIT8 ;无接收数据,则循环等待.
CLR RI
MOV A,SBUF
ACALL TIMEOFF ;关定时器.
MOV R4,A ;保护累加器.
CLR ODD_BIT ;清除奇校验位.
CJNE A,#FINISH_BYTE,SCCONTINU1;判断是否为结束命令字.
ACALL DELAY
ACALL DELAY
AJMP SCPRG ;收到结束命令字,返回.
SCCONTINU1: MOV A,R4 ;未收到结束命令字,继续接收.
CLR RS485CE
SETB RS232CE ;选择RS232.
ACALL DELAY
ACALL DELAY
ACALL DELAY
MOV SBUF,A
SCWAIT9: JNB TI,SCWAIT9 ;发送未完,则循环等待.
CLR TI ;数据发送完毕.
ACALL TIMESET ;设置定时器(60S).
SCWAIT10: ACALL WATCHDOG ;调看门狗喂狗子程序.
JNB RI,SCWAIT10 ;无接收数据,则循环等待.
CLR RI
MOV A,SBUF
ACALL TIMEOFF
AJMP SCSEND
;接收数控机床数据送到PC机.
SCREAD: SETB RS485IO ;允许RS485输出.禁止RS485输入.
CLR RS485CE
SETB RS232CE ;选择RS232.
ACALL DELAY
ACALL DELAY
ACALL DELAY
CLR RI
ACALL TIMESET ;设置定时器(60S).
SCWAIT11: ACALL WATCHDOG ;调看门狗喂狗子程序.
JNB RI,SCWAIT11 ;无接收数据,则循环等待.
CLR RI
MOV A,SBUF
ACALL TIMEOFF ;关定时器.
SETB RS485IO ;允许RS485输出.禁止RS485输入.
CLR RS232CE
SETB RS485CE ;选择RS485.
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
MOV SBUF,A
SCWAIT12: JNB TI,SCWAIT12 ;发送未完,则循环等待.
CLR TI ;数据发送完毕.
CLR RS485CE
SETB RS232CE ;选择RS232.
ACALL DELAY
ACALL DELAY
ACALL DELAY
MOV SBUF,A
SCWAIT14: JNB TI,SCWAIT14 ;发送未完,则循环等待.
CLR TI ;数据发送完毕.
CLR ODD_BIT ;清除奇校验位.
CJNE A,#00H,SCNEXT2 ;判断是否为结束命令字.
AJMP FINISHPRG ;收到结束命令字,返回.
SCNEXT2: CJNE A,#25H,SCNEXT3 ;判断是否为结束命令字.
AJMP FINISHPRG ;收到结束命令字,返回.
SCNEXT3: CJNE A,#1AH,SCCONTINU2 ;判断是否为结束命令字.
AJMP FINISHPRG ;收到结束命令字,返回.
SCCONTINU2: AJMP SCREAD ;未收到结束命令字,继续接收.
FINISHPRG: SETB RS485IO ;允许RS485输出.禁止RS485输入.
CLR RS232CE
SETB RS485CE ;选择RS485.
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
MOV A,#FINISH_BYTE ;发送结束命令字.
CPL C
MOV ODD_BIT,C ;加奇校验.
MOV SBUF,A
SCWAIT13: JNB TI,SCWAIT13 ;发送未完,则循环等待.
CLR TI ;数据发送完毕.
AJMP SCPRG
;---------------------------------------------------------------------------------
;看门狗喂狗子程序:
WATCHDOG: SETB DOGIN
NOP
NOP
NOP
NOP
CLR DOGIN
RET
;---------------------------------------------------------------------------------
;串行口初始化子程序:
COMRST: MOV TMOD,#21H
MOV TH1,#0FDH
MOV TL1,#0FDH ;波特率: 9600 bit/s
SETB TR1
MOV SCON,#50H ;串口方式1并允许接收.
RET
;---------------------------------------------------------------------------------
;设置定时器子程序:
TIMESET: MOV TMOD,#21H
MOV TH0,#00H
MOV TL0,#01H
MOV R6,#TIMEH
MOV R7,#TIMEL ;置定时常数.(60S)
SETB EA
SETB ET0 ;开定时器0中断.
SETB TR0 ;定时器0开始计时.
RET
;---------------------------------------------------------------------------------
;关定时器子程序:
TIMEOFF: CLR TR0
CLR ET0
RET
;---------------------------------------------------------------------------------
;定时器中断服务子程序:
T0PRG: MOV A_BYTE,A ;保护累加器.
MOV C_BIT,C ;保护进位标志.
CLR TR0 ;关定时.
CLR ET0 ;关中断.
MOV A,R7
CLR C
SUBB A,#01H
MOV R7,A
MOV A,R6
SUBB A,#00H
MOV R6,A ;TIMEH:TIMEL-1
CJNE R6,#00H,TIME_CONTINU
CJNE R7,#00H,TIME_CONTINU
MOV A,SP ;定时时间到,系统软复位.
CLR C
SUBB A,#02H
MOV SP,A
MOV DPTR,#MAIN
PUSH DPL
PUSH DPH
RETI
TIME_CONTINU: MOV TH0,#00H ;定时时间未到,继续.
MOV TL0,#01H
SETB ET0 ;开定时器0中断.
SETB TR0 ;定时器0开始计时.
MOV A,A_BYTE ;恢复累加器.
MOV C,C_BIT ;恢复进位标志.
RETI
;---------------------------------------------------------------------------------------
;延时20US
DELAY: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -