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

📄 zdrsj3.asm

📁 用51单片机制作自排线绕线机
💻 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 + -