📄 pm521.asm
字号:
MOV A,R2
MOV R3,A ;分(BCD)-->R3(二进制数)
CLR C
SUBB A,#60
JC STMB
LJMP ERTM ;分置值>=60,错
STMB:INC R0 ;指向秒
LCALL DBCD
MOV A,R2 ;秒(BCD)-->R2(二进制数)
CLR C
SUBB A,#60
JC STMC
ERTM:MOV A,#89H ;时间设置不正确,重新开始设置
LCALL SENC
MOV A,#0DH
LCALL SENC
MOV CONT,#00H ;清数字输入计数器
MOV R0,#WOK2 ;输入数字暂存区首址WOK2
LJMP ESTM
STMC:MOV CTYR,R7 ;时间设置正确
MOV CTMH,R6 ;将设置的时间送计时单元
MOV CTDY,R5
MOV CTHR,R4
MOV CTMN,R3
MOV CTSE,R2
CLR 11H ;清时间设置标志
SETB ET0 ;开放T0中断,启动T0工作
SETB TR0
MOV A,#01H ;清屏
LCALL SENC
MOV DPTR,#TABS
MOV CNTZ,#16
MOV A,#80H ;显示'**系统参数设置**'(L1)
LCALL SENC
LCALL DSCL
MOV DPTR,#TAB5
MOV CNTZ,#16
MOV A,#90H ;'请输入下位机数目'(L2)
LCALL SENC
LCALL DSCL
MOV WOK2,#00 ;预置下位机数目=20只
MOV WOK2+1,#02
MOV WOK2+2,#00
MOV DPTR,#TAB6
MOV CNTZ,#16
MOV A,#88H ;' 020 只 '
LCALL SENC
LCALL DSCL
MOV A,#8AH ;在输入位置(02)上数字反白闪烁
LCALL SENC
MOV A,#0DH
LCALL SENC
MOV CONT,#00H ;清数字输入计数器
MOV R0,#WOK2 ;输入数字暂存区首址WOK2
SETB 12H ;置下位机数目设置标志
ESTM:RET
NOP
NOP
NOP
BCDH:MOV A,@R0 ;三字节BCD-->二字节二进制数
MOV B,#100 ;R0指向BCD高位字节
MUL AB ;R2R3为二进制结果,高位在前
MOV R3,A ;低位-->R3
MOV A,B
MOV R2,A ;高位-->R2
INC R0
MOV A,@R0
MOV B,#10
MUL AB
ADD A,R3
MOV R3,A
MOV A,B
ADDC A,R2
MOV R2,A
INC R0
MOV A,@R0
ADD A,R3
MOV R3,A
MOV A,R2
ADDC A,#00H
MOV R2,A
RET
NOP
NOP
NOP
SNUM:MOV R0,#WOK2 ;下位机数目设置确认
LCALL BCDH ;三字节BCD-->二字节二进制数
MOV A,R3 ;因小于100,仅一个字节(R3)
JZ ERNM ;下位机数目=0,错
CLR C
SUBB A,#101
JC SNM1 ;<100
JZ SNM1 ;=100
ERNM:MOV A,#8AH ;下位机数目>100,错
LCALL SENC ;下位机数目设置不正确,重设
MOV A,#0DH ;00001101,整体显示,光标不显示,反白闪烁
LCALL SENC
LJMP ESNM
SNM1:MOV NUMB,R3 ;数目设置正确,保存下位机数目
MOV DPTR,#TAB7
MOV CNTZ,#16
MOV A,#90H ;'请输入胶带速度: '(L2)
LCALL SENC
LCALL DSCL
MOV WOK2,#04 ;预置胶带速度= 4 米/ 秒
MOV DPTR,#TAB8
MOV CNTZ,#16
MOV A,#88H ;' 4 米/ 秒 '
LCALL SENC
LCALL DSCL
CLR 12H ;清下位机数目设置标志
MOV A,#8AH ;在输入位置(4)上数字反白闪烁
LCALL SENC
MOV A,#0DH
LCALL SENC
SETB 13H ;置胶带速度设置标志
ESNM:MOV CONT,#00H ;清数字输入计数器
MOV R0,#WOK2 ;输入数字暂存区首址WOK2
RET
NOP
NOP
NOP
SSPD:MOV A,WOK2
JZ ERSP ;速度设置=0,错
CLR C
SUBB A,#06
JNC ERSP ;速度设置>5,错
MOV A,WOK2
MOV SPED,A ;保存速度
CLR P1.7 ;置RS485发送状态
CLR TI
MOV A,#0AAH ;向所有下位机发速度
MOV SBUF,A
SPL1:JNB TI,SPL1
CLR TI
MOV A,SPED
MOV SBUF,A
SPL2:JNB TI,SPL2
CLR TI
SETB P1.7 ;恢复RS485接收状态
MOV A,#01H ;清屏
LCALL SENC
MOV DPTR,#TABO
MOV CNTZ,#16
MOV A,#90H ;显示'**参数设置完毕**'(L2)
LCALL SENC
LCALL DSCL
CLR 13H
MOV A,#0CH
LCALL SENC ;取消LCD反白闪烁
SETB 15H ;参数设置完成15H=1
SJMP ESPD
ERSP:MOV A,#8AH ;有错,在输入位置(4)上数字反白闪烁
LCALL SENC
MOV A,#0DH
LCALL SENC
ESPD:RET
NOP
NOP
NOP
KRUN:JB 07H,ERUN ;已运行,本键无效
JB 0FH,ERUN ;查询时,本键无效
JB 01H,RUN1 ;手动停机,转
JB 08H,RUN1 ;强停机,转
JNB 15H,ERUN ;无设置完成标志,本键无效
RUN1:CLR 01H ;清手动停机标志
CLR 08H ;清强停机制标志
MOV A,#01H ;清屏
LCALL SENC
MOV DPTR,#TABR
MOV CNTZ,#16
MOV A,#80H ;显示'**系统正在运行**'(L1)
LCALL SENC
LCALL DSCL
MOV DPTR,#TABB
MOV CNTZ,#16
MOV A,#98H ;显示' 001: 正常 '(L4)
LCALL SENC
LCALL DSCL
MOV DPTR,#TAB9 ;时间显示格式送显示缓冲区
MOV R0,#BUFD
MOV B,#16
LCALL RIMV
LCALL TINC ;显示当前时间(L2)
MOV DPTR,#TABB ;编号状态格式送显示缓冲区
MOV R0,#BUFA
MOV B,#16
LCALL RIMV
MOV XBHA,#00
CLR P1.6 ;接通继电器
CLR P1.4 ;LED灭
CLR P1.3
CLR P1.2
SETB 07H ;置运行标志00=1
ERUN:RET
NOP
NOP
NOP
STOP:JNB 07H,ESTP ;停止键处理,无运行标志返回
CLR 15H
CLR 07H ;清运行与查询标志
CLR 0FH
SETB 01H ;置手动停机标志01H='1'
SETB P1.6 ;输出停止信息,断开继电器
SETB P1.4 ;LED(红)亮
MOV A,#01H ;清屏
LCALL SENC
MOV DPTR,#TABP
MOV CNTZ,#16
MOV A,#80H ;'**系统暂停工作**'(L1)
LCALL SENC
LCALL DSCL
ESTP:RET
NOP
NOP
NOP
SECH:JNB 07H,ESCH ;查询键处理,无运行标志返回
JNB 0FH,SCH1 ;判查询标志
CLR 0FH ;有查询标志,清标志(乒乓键)
MOV PONT,#00H ;恢复查询指针
MOV DPTR,#TABR ;返回运行状态
MOV CNTZ,#16
MOV A,#80H ;显示'**系统正在运行**'(L1)
LCALL SENC
LCALL DSCL
SJMP ESCH
SCH1:SETB 0FH ;置位查询标志0FH=1
MOV DPTR,#TABH
MOV CNTZ,#16
MOV A,#80H ;显示'系统进入查询状态'(L1)
LCALL SENC
LCALL DSCL
SSSS:LCALL XXMV ;将数据保存区内容送查询区
MOV DPTR,#0200H ;显示查询区第一组数据
SCH2:MOV R1,#WOK1
MOV B,#07
LCALL XIMV
MOV PONT,DPL ;保存查询指针
MOV A,WOK1
CJNE A,#0FFH,SCH3 ;有故障信息,转
MOV DPTR,#TABW
MOV CNTZ,#16
MOV A,#80H ;显示'无纠偏报警等信息'(L1)
LCALL SENC
LCALL DSCL
SJMP ESCH
SCH3:LCALL TRTM ;转换并显示时间
MOV R0,#WOK1+5
MOV A,@R0
LCALL TRBN ;转换编号送缓冲区
MOV R0,#WOK1+6
MOV A,@R0
LCALL TRNX ;转换并显示状态
ESCH:RET
NOP
NOP
NOP
SDEC:JNB 0FH,EDEC ;无查询标志,退出
CLR C
MOV A,PONT ;取指针
SUBB A,#251 ;判范围
JC SDE1
MOV PONT,#00
SDE1:MOV DPH,#02
MOV DPL,PONT
LCALL SCH2
EDEC:RET
NOP
NOP
NOP
;**************************
LCDF:MOV A,#30H ;LCD初始化
LCALL SENC
MOV A,#01H
LCALL SENC
MOV A,#06H
LCALL SENC
MOV A,#0CH
LCALL SENC
RET
NOP
NOP
NOP
DELY:MOV R7,#0FFH ;延时子程序(140MS)
DEL1:MOV R6,#0FFH
DEL2:DJNZ R6,DEL2
DJNZ R7,DEL1
RET
NOP
NOP
NOP
IIMV:MOV A,@R0 ;内部RAM间数据移动
MOV @R1,A ;(R0)-->(R1),字节数在B中
INC R0
INC R1
DJNZ B,IIMV
RET
NOP
NOP
NOP
XIMV:MOVX A,@DPTR ;外部RAM数据移到内部RAM
MOV @R1,A ;(DPTR)-->(R1),字节数在B中
INC R1
INC DPTR
DJNZ B,XIMV
RET
NOP
NOP
NOP
RIMV:CLR A ;ROM数据移到内部RAM
MOVC A,@A+DPTR ;(DPTR)-->(R0),字节数在B中
MOV @R0,A
INC R0
INC DPTR
DJNZ B,RIMV
RET
NOP
NOP
NOP
CHEK:PUSH ACC ;LCD判忙
PUSH DPH
PUSH DPL
MOV DPTR,#8102H
CKLL:MOVX A,@DPTR
RLC A
JC CKLL
POP DPL
POP DPH
POP ACC
RET
NOP
NOP
NOP
SENC:LCALL CHEK ;LCD送命令
PUSH DPH
PUSH DPL
MOV DPTR,#8100H
MOVX @DPTR,A
POP DPL
POP DPH
RET
SEND:LCALL CHEK ;LCD送数据
PUSH DPH
PUSH DPL
MOV DPTR,#8101H
MOVX @DPTR,A
POP DPL
POP DPH
RET
NOP
NOP
NOP
DMOV:CLR A ;显示格式送显示缓冲区
MOVC A,@A+DPTR ;(DPTR)-->(R0),字节数(CONT)
MOV @R0,A
INC DPTR
INC R0
DJNZ CONT,DMOV
RET
NOP
NOP
NOP
D1MS:MOV R6,#230 ;1MS延时
DMSL:NOP
NOP
DJNZ R6,DMSL
RET
NOP
NOP
NOP
XCAL:JB 07H,XCL0
LJMP ENXC ;无运行标志,返回
XCL0:MOV A,XBHA ;向下位机查询信息子程序
INC A ;下位机编号+1
MOV R3,A ;保存下位机编号
CLR C
SUBB A,NUMB ;与数目单元比较
JC XCL1 ;小于和等于,转
JZ XCL1
MOV R3,#01 ;超出,下位机编号恢复为'01'
XCL1:MOV XBHA,R3
CLR P1.7 ;RS485串口准备发送
CLR TI
MOV A,XBHA
MOV SBUF,A ;发下位机编号
XCL2:JNB TI,XCL2 ;等发送完毕
CLR TI
CLR RI
SETB P1.7 ;RS485串口准备接收
MOV B,#03H
XCL3:JBC RI,XCL4 ;接收到回应,转
LCALL D1MS ;延迟1MS
DJNZ B,XCL3
MOV BIAZ,#06
LJMP XCLG ;3MS内接收不到回应,返回
XCL4:MOV A,SBUF ;取入下位机编号,舍弃
MOV B,#03H
XCL5:JBC RI,XCL6 ;接收到信息,转
LCALL D1MS ;延迟1MS
DJNZ B,XCL5
MOV BIAZ,#06
LJMP XCLG ;3MS内接收不到信息,返回
XCL6:MOV A,SBUF
MOV BUFF,A ;信息送缓存单元
JB ACC.7,XCL9 ;下位机信息显示,带报警装置转
CJNE A,#00H,XCL7 ;不正常,转
CLR 03H
CLR P1.2 ;正常,三个LED熄灭
CLR P1.3
CLR P1.4
MOV BIAZ,#07
LJMP ENXC
XCL7:SETB 03H ;置问题标志
JNB ACC.0,XCL8
MOV BIAZ,#00 ;纠偏(右)
SETB P1.2 ;绿灯亮
LJMP XCLG
XCL8:MOV BIAZ,#01 ;纠偏(左)
SETB P1.2 ;绿灯亮
LJMP XCLG
XCL9:CJNE A,#80H,XCLA ;带报警装置,不正常,转
CLR 03H
CLR P1.2 ;正常,三个LED熄灭
CLR P1.3
CLR P1.4
MOV BIAZ,#07
LJMP ENXC
XCLA:SETB 03H ;置问题标志
JNB ACC.4,XCLB
MOV BIAZ,#04 ;超限(右)
SETB P1.3 ;黄灯亮
SETB P1.4 ;红灯亮
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -