仿真与实验箱
代码
SSTACK SEGMENT STACK DW 256 DUP(?) SSTACK ENDS DATA SEGMENT led db 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH ;数码管倒计时序列9~0 ioporta equ 600h ;端口A地址 ioportb equ 602h ;端口B地址 ioportc equ 604h ;端口C地址 TABDT DB 01H,03H,02H,06H,04H,0CH,08H,09H ;步进电机序列 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: ;====================Begin=========================== MOV AX, DATA MOV DS, AX mov dx,606h mov al,88H ;方式0,A输出,B输出,C低四位输出 out dx,al BEGIN: CALL TUBE_STOP MOV DX, 0604H IN AL, DX ;读C口输入 MOV BL, AL MOV CL, 4 SHR BL, CL ;获取低四位 CMP BL, 0 JZ BEGIN CMP BL, 1 ;若开关1打开,甩干模式 JZ FASTEST CMP BL, 02H JZ FAST CMP BL, 04H JZ SLOW JMP BEGIN FASTEST: CMP DI,10 ;甩干模式出来停止 JZ BEGIN call meantime ;MOV DI, 1000H ;约定使用DI来传递参数(延时长短) ;CALL SPEED ;甩干模式,急速快 FAST: MOV DI, 4000H ;约定使用DI来传递参数(延时长短) CALL SPEED ;开关1被打开,速度1标准 SLOW: MOV DI, 8000H ;约定使用DI来传递参数(延时长短) CALL SPEED ;开关2被打开,速度2轻柔 ;**************读取开关子程序************** READ PROC PUSH DX PUSH AX PUSH BX PUSH CX MOV DX, 0604H IN AL, DX ;读C口输入 MOV BL, AL MOV CL, 4 SHR BL, CL ;获取低四位 CMP BL, 0 JZ BEGIN ; CMP BL, 1 ;若开关1打开,甩干模式 ; JZ Q1 ; CMP BL, 02H ;若开关2打开,标准模式 ; JZ FAST ; CMP BL, 04H ;若开关3打开,轻柔模式 ; JZ SLOW POP CX POP BX POP AX POP DX RET READ ENDP ;动态数码管停止; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TUBE_STOP PROC PUSH AX PUSH BX PUSH DX mov dx,606h mov al,88H;方式0,A输出,B输出,C低四位输出 out dx,al ;初始化8255 mov bx,offset led mov al,11111001b ;选择全部 mov dx,ioportc out dx,al ;出C口 选择个位 mov al,[bx+9] ; mov dx,ioporta out dx,al ;从a口输出 POP DX POP BX POP AX RET TUBE_STOP ENDP ;**************同步************** meantime proc mov dx,606h mov al,10001000b;方式0,A输出,B输出,C输出 out dx,al ;初始化8255 mov bx,offset led mov si,0;个位 mov di,8;十位 mov cx,12 digit1: ;动态刷新一次数码管数字 CALL GEW ;从a口输出 call delay;1000 CALL TEN CALL shuaigan call read ;读开关 loop digit1 digit3: mov cx,12 inc si cmp si,9 jbe digit1 CMP DI,9 ;只为判断最后一次00情况 Ja DIGIT4 inc di ;满十进一 ;添加,刷新00之后,si=10,跳转到tube_stop CMP DI,9 ;只为判断最后一次00情况 Ja DIGIT4 mov si,0;清零个位 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; digit2: ;个位刷成0,十位刷成 原来-1 CALL GEW call delay;1000 CALL TEN CALL shuaigan call read ;读开关 loop digit2 mov cx,12 CMP DI,9 JBe DIGIT3 DIGIT4: ;输出为0结束程序 call tube_stop jmp begin meantime endp ;******************个位******************* GEW PROC PUSH AX PUSH BX PUSH DX PUSH SI mov bx,offset led mov al,11111011b ;选择个位 mov dx,ioportC out dx,al ;出C口 选择个位 mov al,[bx+SI] ; ;NOT AL ;这条指令与数码管共阴极或共阳极有关,具体可根据实际情况,添加或删除 mov dx,ioporta out dx,al ;从a口输出 POP SI POP DX POP BX POP AX RET GEW ENDP ;******************十位******************* TEN PROC PUSH AX PUSH BX PUSH DX PUSH DI mov bx,offset led mov al,11111101B ;选择十位 mov dx,ioportC out dx,al ;出c口 选择十位 mov al,[bx+di]; ;NOT AL ;这条指令与数码管共阴极或共阳极有关,具体可根据实际情况,添加或删除 mov dx,ioporta out dx,al ;从a口输出 POP DI POP DX POP BX POP AX RET TEN ENDP ;**************延时子程序***************** delay proc push cx mov cx,500h del: ;nop nop loop del pop cx ret delay endp ;**************甩干子程序**************** shuaigan proc push ax push bx push cx push dx MOV BX, OFFSET TABDT MOV CX, 0008H Q2: call gew MOV AL,[BX] MOV DX, 0602H ; 写B口 OUT DX, AL INC BX call delay ; 控制步进电机的+转速1000 call delay call delay call delay CALL TEN call delay call delay call delay call delay LOOP Q2 pop dx pop cx pop bx pop ax ret shuaigan endp ;***************延时子程序**************** DALLY PROC ; PUSH DI PUSH CX MOV CX, DI A3: PUSH AX POP AX LOOP A3 POP CX ; POP DI RET DALLY ENDP ;*************电机驱动子程序******************** SPEED PROC MAIN: MOV AL, 88H ; 控制B口工作于方式0,输出 MOV DX, 0606H OUT DX, AL MOV SI, 0 ;SI用于计算反转时间 ;***************正转***************** A1: MOV BX, OFFSET TABDT MOV CX, 0008H A2: MOV AL,[BX] MOV DX, 0602H ; 写B口 OUT DX, AL CALL DALLY ; 控制步进电机的+转速 INC BX LOOP A2 CALL READ INC SI ;SI用于计算反转时间 CMP SI, 8H ;8次后反转 JB A1 ;PUSH DI ;MOV DI, 0FFFFH ;CALL DALLY ;正反转切换,需停止休息 ;POP DI ;PUSH DI ;MOV DI, 0FFFFH ;CALL DALLY ;正反转切换,需停止休息 ;POP DI ;PUSH DI ;MOV DI, 0FFFFH ;CALL DALLY ;正反转切换,需停止休息 ;POP DI JMP A5 A8: JMP A1 ; CALL DALLY ;正反转切换,需停止休息(模仿现实中洗衣机) ; CALL DALLY ;正反转切换,需停止休息 ;***************反转*************** A5: MOV BX, OFFSET TABDT+7 MOV CX, 0008H A4: MOV AL,[BX] MOV DX, 0602H ; 写B口 OUT DX, AL CALL DALLY ; 控制步进电机的+转速 DEC BX LOOP A4 CALL READ DEC SI ;SI用于计算反转时间 CMP SI, 0 ;0后正转 JA A5 ;PUSH DI ;MOV DI,0FFFFH ;CALL DALLY ;正反转切换,需停止休息 ;POP DI ;PUSH DI ;MOV DI,0FFFFH ;CALL DALLY ;正反转切换,需停止休息 ;POP DI ;PUSH DI ;MOV DI,0FFFFH ;CALL DALLY ;正反转切换,需停止休息 ;POP DI ; CALL DALLY ;正反转切换,需停止休息 ; CALL DALLY ;正反转切换,需停止休息 JZ A8 RET SPEED ENDP CODE ENDS END START
含步进电机
代码改进后
SSTACK SEGMENT STACK
DW 256 DUP(?)
SSTACK ENDS
DATA SEGMENT
led db 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH ;????????9~0
ioporta equ 600h ;??A??
ioportb equ 602h ;??B??
ioportc equ 604h ;??C??
TABDT DB 01H,03H,02H,06H,04H,0CH,08H,09H ;??????
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
;====================Begin===========================
MOV AX, DATA
MOV DS, AX
mov dx,606h
mov al,88H ;??0,A??,B??,C?????
out dx,al
BEGIN:
CALL TUBE_STOP
MOV DX, 0604H
IN AL, DX ;?C???
MOV BL, AL
MOV CL, 4
SHR BL, CL ;?????
CMP BL, 1000
JZ BEGIN
CMP BL, 1001B ;???1??,????
JZ FASTEST
CMP BL, 1010B
JZ FAST
CMP BL, 1100B
JZ SLOW
JMP BEGIN
FASTEST:
CMP DI,10 ;????????
JZ BEGIN
call meantime
;MOV DI, 1000H ;????DI?????(????)
;CALL SPEED ;????,???
FAST:
MOV DI, 4000H ;????DI?????(????)
CALL FAST1 ;??1???,??1??
SLOW:
MOV DI, 8000H ;????DI?????(????)
CALL SLOW1 ;??2???,??2??
;**************???????**************
READ PROC
PUSH DX
PUSH AX
PUSH BX
PUSH CX
MOV DX, 0604H
IN AL, DX ;?C???
MOV BL, AL
MOV CL, 4
SHR BL, CL ;?????
CMP BL, 0
JZ BEGIN
; CMP BL, 1 ;???1??,????
; JZ Q1
; CMP BL, 1010B ;???2??,????
; JZ FAST
; CMP BL, 04H ;???3??,????
; JZ SLOW
POP CX
POP BX
POP AX
POP DX
RET
READ ENDP
;???????;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TUBE_STOP PROC
PUSH AX
PUSH BX
PUSH DX
mov dx,606h
mov al,88H;??0,A??,B??,C?????
out dx,al ;???8255
mov bx,offset led
mov al,11111001b ;????
mov dx,ioportc
out dx,al ;?C? ????
mov al,[bx+9] ;
mov dx,ioporta
out dx,al ;?a???
POP DX
POP BX
POP AX
RET
TUBE_STOP ENDP
;**************??**************
meantime proc
mov dx,606h
mov al,10001000b;??0,A??,B??,C??
out dx,al ;???8255
mov bx,offset led
mov si,0;??
mov di,8;??
mov cx,12
digit1: ;???????????
CALL GEW ;?a???
call delay;1000
CALL TEN
CALL shuaigan
call read ;???
loop digit1
digit3:
mov cx,12
inc si
cmp si,9
jbe digit1
CMP DI,9 ;????????00??
Ja DIGIT4
inc di ;????
;??,??00??,si=10,???tube_stop
CMP DI,9 ;????????00??
Ja DIGIT4
mov si,0;????
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
digit2: ;????0,???? ??-1
CALL GEW
call delay;1000
CALL TEN
CALL shuaigan
call read ;???
loop digit2
mov cx,12
CMP DI,9
JBe DIGIT3
DIGIT4: ;???0????
call tube_stop
jmp begin
meantime endp
;******************??*******************
GEW PROC
PUSH AX
PUSH BX
PUSH DX
PUSH SI
mov bx,offset led
mov al,11111011b ;????
mov dx,ioportC
out dx,al ;?C? ????
mov al,[bx+SI] ;
;NOT AL ;?????????????????,?????????,?????
mov dx,ioporta
out dx,al ;?a???
POP SI
POP DX
POP BX
POP AX
RET
GEW ENDP
;******************??*******************
TEN PROC
PUSH AX
PUSH BX
PUSH DX
PUSH DI
mov bx,offset led
mov al,11111101B ;????
mov dx,ioportC
out dx,al ;?c? ????
mov al,[bx+di];
;NOT AL ;?????????????????,?????????,?????
mov dx,ioporta
out dx,al ;?a???
POP DI
POP DX
POP BX
POP AX
RET
TEN ENDP
;**************?????*****************
delay proc
push cx
mov cx,500h
del:
;nop
nop
loop del
pop cx
ret
delay endp
;**************?????****************
shuaigan proc
push ax
push bx
push cx
push dx
MOV BX, OFFSET TABDT
MOV CX, 0008H
Q2:
call gew
MOV AL,[BX]
MOV DX, 0602H ; ?B?
OUT DX, AL
INC BX
call delay ; ???????+??1000
call delay
call delay
call delay
CALL TEN
call delay
call delay
call delay
call delay
LOOP Q2
pop dx
pop cx
pop bx
pop ax
ret
shuaigan endp
;***************?????****************
DALLY PROC
; PUSH DI
PUSH CX
MOV CX, DI
A3: PUSH AX
POP AX
LOOP A3
POP CX
; POP DI
RET
DALLY ENDP
FAST1 proc
MOV AL, 88H ; ??B??????0,??
MOV DX, 0606H
OUT DX, AL
mov dx,ioportc
mov al,11111011b
out dx,al
mov dx,ioporta
mov al,06h
;not al
out dx,al
call speed
ret
FAST1 endp
SLOW1 proc
MOV AL, 88H ; ??B??????0,??
MOV DX, 0606H
OUT DX, AL
mov dx,ioportc
mov al,11111011b
out dx,al
mov dx,ioporta
mov al,5bh
;not al
out dx,al
call speed
ret
SLOW1 endp
;*************???????********************
SPEED PROC
MAIN:
MOV SI, 0 ;SI????????
;***************??*****************
A1:
MOV BX, OFFSET TABDT
MOV CX, 0008H
A2: MOV AL,[BX]
MOV DX, 0602H ; ?B?
OUT DX, AL
CALL DALLY ; ???????+??
INC BX
LOOP A2
CALL READ
INC SI ;SI????????
CMP SI, 0CH ;8????
JB A1
;PUSH DI
;MOV DI, 0FFFFH
;CALL DALLY ;?????,?????
;POP DI
;PUSH DI
;MOV DI, 0FFFFH
;CALL DALLY ;?????,?????
;POP DI
;PUSH DI
;MOV DI, 0FFFFH
;CALL DALLY ;?????,?????
;POP DI
JMP A5
A8: JMP A1
; CALL DALLY ;?????,?????(????????)
; CALL DALLY ;?????,?????
;***************??***************
A5:
MOV BX, OFFSET TABDT+7
MOV CX, 0008H
A4:
MOV AL,[BX]
MOV DX, 0602H ; ?B?
OUT DX, AL
CALL DALLY ; ???????+??
DEC BX
LOOP A4
CALL READ
DEC SI ;SI????????
CMP SI, 0 ;0???
JA A5
;PUSH DI
;MOV DI,0FFFFH
;CALL DALLY ;?????,?????
;POP DI
;PUSH DI
;MOV DI,0FFFFH
;CALL DALLY ;?????,?????
;POP DI
;PUSH DI
;MOV DI,0FFFFH
;CALL DALLY ;?????,?????
;POP DI
; CALL DALLY ;?????,?????
; CALL DALLY ;?????,?????
JZ A8
RET
SPEED ENDP
CODE ENDS
END START
连线不变
现象KEY2
电路板