📄 zdrsj3.asm
字号:
; ==========================
; = 可预置绕线机计数器程序 =
; = CPU: AT89C51 =
; ==========================
;================================================
; =============
; =初始化程序=
; =============
ORG 0000H ;程序执行开始地址
LJMP START0 ;跳至START0执行
ORG 0003H ;外中断0入口地址
LJMP INTEXT0 ;
ORG 000BH ;定时器T0中断入口地址
RETI ;中断返回
ORG 0013H ;外中断1入口地址
LJMP INTEXT1 ;
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回
START0: MOV P0,#0FFH ;清I/O口
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV A, #00H ;清寄存器
MOV R0,A ;0
MOV R1,A ;0
MOV R2,A ;0
MOV R3,A ;0
MOV R4,A ;0
MOV R5,A ;0
MOV R6,A ;0
MOV R7,#0AH ;显示L000
;================================================
; ======================
; = 副电机调速设置程序 =
; ======================
ESC: CALL XINS2 ;副电机复位
CLR P1.7 ;开副电机正转继电器
CLR P1.3 ;开副电机正转调速
JB P2.0,ESC ;副电机未到位继续
SETB P1.7 ;到位,关副电机正转继电器
SETB P1.3 ;关副电机正转调速
FLS: CALL XINS2 ;显示副电机预置数
JNB P3.4,FL0 ;扫描按键
JNB P3.5,FL1
JNB P3.6,FL2
MOV 34H,R4 ;保存副电机预置数
MOV 35H,R5
MOV 36H,R6
MOV 37H,R7
JNB P3.0,ZLS ;转主电机设置
JMP FLS ;继续设置副电机
;------------------------------------------------
FL0: CALL YS2 ;延时防抖动
JNB P3.4,FL0
INC R4 ;个位加1
CJNE R4,#0AH,FL0S ;个位是否到9
MOV R4,#00H ;如到了,个位置0
FL0S: JMP FLS ;转按键扫描
FL1: CALL YS2
JNB P3.5,FL1
INC R5 ;十位加1
CJNE R5,#0AH,FL1S
MOV R5,#00H
FL1S: JMP FLS
FL2: CALL YS2
JNB P3.6,FL2
INC R6 ;百位加1
CJNE R6,#0AH,FL2S
MOV R6,#00H
FL2S: JMP FLS
;================================================
; ======================
; = 主电机转数预置程序 =
; ======================
ZLS: CALL XINS1 ;延时防抖动
JNB P3.4,ZL0 ;扫描按键
JNB P3.5,ZL1
JNB P3.6,ZL2
JNB P3.7,ZL3
MOV 30H,R0 ;保存主电机预置数
MOV 31H,R1
MOV 32H,R2
MOV 33H,R3
JNB P3.1,MAIN ;主电机开始计数否?
JMP ZLS ;继续等待
;------------------------------------------------
ZL0: CALL YS1 ;延时防抖动
JNB P3.4,ZL0
INC R0 ;个位加1
CJNE R0,#0AH,ZL0S ;个位是否到9
MOV R0,#00H ;如到了,个位置0
ZL0S: JMP ZLS ;转按键扫描
ZL1: CALL YS1
JNB P3.5,ZL1
INC R1 ;十位加1
CJNE R1,#0AH,ZL1S
MOV R1,#00H
ZL1S: JMP ZLS
ZL2: CALL YS1
JNB P3.6,ZL2
INC R2 ;百位加1
CJNE R2,#0AH,ZL2S
MOV R2,#00H
ZL2S: JMP ZLS
ZL3: CALL YS1
JNB P3.7,ZL3
INC R3 ;千位加1
CJNE R3,#0AH,ZL3S
MOV R3,#00H
ZL3S: JMP ZLS
;================================================
; ====================
; =主电机正向计数程序=
; ====================
MAIN: CALL YS1 ;延时防抖动
SETB IT0 ;开中断
SETB EX0
SETB IT1
SETB EX1
SETB EA
CLR P1.2 ;开主电机
ZDJJ: LJMP FDJZ ;转副电机正转程序
JSJ1: JNB P3.0,ZT1 ;需要暂停吗?
CJNE R0,#00H,ZDJJ ;主电机到预置数否?
CJNE R1,#00H,ZDJJ
CJNE R2,#00H,ZDJJ
CJNE R3,#00H,ZDJJ ;未到继续
CLR IT0 ;到,关总中断
CLR EX0
SETB IT1
SETB EX1
CLR EA
SETB P1.2 ;关主电机
SETB P1.3
SETB P1.6
SETB P1.7
CALL BAOJ ;主电机到预置数报警
JMP ZLS ;重新开始
;================================================
; ==================
; = 副电机正转程序 =
; ==================
FDJZ: CLR P1.6 ;开副电机正转继电器
ZSH: SETB P1.3 ;关闭副电机正转调速
CALL XINS1 ;延时
CJNE R4,#00H,JSJ1 ;副电机到预置数否?
CJNE R5,#00H,JSJ1
CJNE R6,#00H,JSJ1 ;未到继续
CLR P1.3 ;开副电机正转调速
CALL YS3 ;延时
JB P2.1,MM1 ;副电机未到位继续
SETB P1.6 ;关副电机正转继电器
SETB P1.3 ;关闭副电机正转调速
MOV R4,34H ;还原预置数
MOV R5,35H
MOV R6,36H
MOV R7,37H
JMP MAIN2 ;转主电机反向计数程序
MM1: CALL XINS1
MOV R4,34H ;还原预置数
MOV R5,35H
MOV R6,36H
MOV R7,37H
JMP ZSH
;================================================
; ===========
; =暂停程序=
; ===========
ZT1: CALL XINS1
CLR IT0 ;关总中断
CLR EX0
SETB IT1
SETB EX1
CLR EA
SETB P1.2 ;关主电机
SETB P1.3 ;关副电机
SETB P1.6
SETB P1.7
JNB P3.1,W1
JMP ZT1
W1: CALL XINS1
SETB IT0 ;开中断
SETB EX0
SETB IT1
SETB EX1
SETB EA
CLR P1.2
JMP JSJ1
;---------------------------------------------------
ZT2: CALL XINS1
CLR IT0 ;关总中断
CLR EX0
SETB IT1
SETB EX1
CLR EA
SETB P1.2 ;关主电机
SETB P1.3 ;关副电机
SETB P1.6
SETB P1.7
JNB P3.1,W2
JMP ZT2
W2: CALL XINS1
SETB IT0 ;开中断
SETB EX0
SETB IT1
SETB EX1
SETB EA
CLR P1.2
JMP JSJ2
;================================================
; ====================
; =主电机反向计数程序=
; ====================
MAIN2: LJMP FDJF ;转副电机反转程序
JSJ2: JNB P3.0,ZT2 ;需要暂停吗?
CJNE R0,#00H,MAIN2 ;主电机到预置数否?
CJNE R1,#00H,MAIN2
CJNE R2,#00H,MAIN2
CJNE R3,#00H,MAIN2 ;未到继续
CLR IT0 ;到,关总中断
CLR EX0
SETB IT1
SETB EX1
CLR EA
SETB P1.2 ;关主电机
SETB P1.3
SETB P1.6
SETB P1.7
CALL BAOJ ;主电机到预置数报警
JMP ZLS ;重新开始
;===================================================
; ==================
; = 副电机反转程序 =
; ==================
FDJF: CLR P1.7 ;开副电机反转继电器
FSH: SETB P1.3 ;关闭副电机反转调速
CALL XINS1 ;延时
CJNE R4,#00H,JSJ2 ;副电机到预置数否?
CJNE R5,#00H,JSJ2
CJNE R6,#00H,JSJ2 ;未到继续
CLR P1.3 ;开副电机反转调速
CALL YS3 ;延时
JB P2.0,MM2 ;副电机未到位继续
SETB P1.7 ;关副电机反转继电器
SETB P1.3 ;关闭副电机反转调速
MOV R4,34H ;还原预置数
MOV R5,35H
MOV R6,36H
MOV R7,37H
LJMP JSJ1 ;返回JSJ1开始
MM2: CALL XINS1
MOV R4,34H ;还原预置数
MOV R5,35H
MOV R6,36H
MOV R7,37H
JMP FSH
;=================================================
; ===============
; =主电机减1程序=
; ===============
INTEXT0: PUSH ACC ;进栈
PUSH PSW
DEC R0 ;个位寄存器减1
CLR C
CJNE R0,#0FFH,INT0OUT
MOV R0,#09H
DEC R1 ;十位寄存器减1
CLR C
CJNE R1,#0FFH,INT0OUT
MOV R1,#09H
DEC R2 ;百位寄存器减1
CLR C
CJNE R2,#0FFH,INT0OUT
MOV R2,#09H
DEC R3 ;千位寄存器减1
CLR C
CJNE R3,#0FFH,INT0OUT
MOV R3,#09H
INT0OUT: POP PSW ;出栈
POP ACC
RETI
;=================================================
; ===============
; =副电机减1程序=
; ===============
INTEXT1: PUSH ACC ;进栈
PUSH PSW
DEC R4 ;个位寄存器减1
CLR C
CJNE R4,#0FFH,INT1OUT
MOV R4,#09H
DEC R5 ;十位寄存器减1
CLR C
CJNE R5,#0FFH,INT1OUT
MOV R5,#09H
DEC R6 ;百位寄存器减1
CLR C
CJNE R6,#0FFH,INT1OUT
MOV R6,#09H
INT1OUT: POP PSW ;出栈
POP ACC
RETI
;================================================
; ================
; =主电机显示程序=
; ================
XINS1: MOV DPTR,#NUMTAB ;取表格数据
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7 ;开个数位显示
ACALL D1MS
SETB P2.7
MOV A,R1
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6 ;开十位数显示
ACALL D1MS
SETB P2.6
MOV A,R2
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5 ;开百位数显示
ACALL D1MS
SETB P2.5
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4 ;开千位数显示
ACALL D1MS
SETB P2.4
RET
;================================================
; ================
; =副电机显示程序=
; ================
XINS2: MOV DPTR,#NUMTAB ;取表格数据
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7 ;开个数位显示
ACALL D1MS
SETB P2.7
MOV A,R5
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6 ;开十位数显示
ACALL D1MS
SETB P2.6
MOV A,R6
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5 ;开百位数显示
ACALL D1MS
SETB P2.5
MOV A,R7
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4 ;开千位数显示
ACALL D1MS
SETB P2.4
RET
;================================================
; =====================
; =报警/还原设置数程序=
; =====================
BAOJ: MOV 71H,#00H
MOV 71H,#250 ;报警脉冲长度
MOV 72H,#00H
MOV 72H,#3 ;报警3次
BJ0: CLR P1.4 ;开报警器
BJ1: CALL XINS1
DJNZ 71H,BJ1 ;报警脉冲次数未到继续
SETB P1.4 ;到了,关报警器
BJ2: CALL XINS1
DJNZ 71H,BJ2 ;报警脉冲次数未到继续
DJNZ 72H,BJ0 ;报警次数未到继续
ESC2: CALL XINS1
CLR P1.7 ;副电机复位
CLR P1.3 ;开副电机正转调速
JB P2.0,ESC2 ;副电机未到位继续
SETB P1.7 ;关副电机正转继电器
SETB P1.3 ;关副电机正转调速
MOV R0,30H ;还原主电机预置数
MOV R1,31H
MOV R2,32H
MOV R3,33H
MOV R4,34H ;还原副电机预置数
MOV R5,35H
MOV R6,36H
MOV R7,37H
RET ;返回
;================================================
; ==========
; =延时程序=
; ==========
D1MS: MOV 50H,#80 ;延时1毫秒子程序
DJNZ 50H,$
RET
YS1: MOV 60H,#200 ;延时100毫秒子程序
L1: CALL XINS1
DJNZ 60H,L1
RET
YS2: MOV 70H,#200 ;延时100毫秒子程序
L2: CALL XINS2
DJNZ 70H,L2
RET
YS3: MOV 70H,#25 ;延时20毫秒子程序
L3: CALL XINS1
DJNZ 70H,L3
RET
;================================================
; ==========
; =查表程序=
; ==========
NUMTAB: DB 03FH;0
DB 006H;1
DB 05BH;2
DB 04FH;3
DB 066H;4
DB 06DH;5
DB 07DH;6
DB 007H;7
DB 07FH;8
DB 06FH;9
DB 038H;L
;================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -