要求:
1、开关一控制电机转停;
2、开关二控制电机转动的方向;
3、开关三控制电机转动的速度;
4:电机相关的状态可以在三极管中显示出来。
使用软件:
proteus
代码如下:
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK;注意这里格式,程序段,数据段,栈堆段都需要
ORG 800H;
START:
;2注意 DS数据段地址 SS栈堆段地址 SP栈顶地址写入。同步后边更改DS SS SP时候注意寄存器保护和恢复(PUSH POP)
MOV AX,DATA
MOV DS,AX
MOV AX,STACK;使用了子函数,中断函数等,必须要有,才能对现场进行入栈保护。
MOV SS,AX
MOV SP,64H
;注意,为了中断系统运行正常,建议第一优先初始化好中断,然后进行其他接口的初始化
;注意:入下中断向量表写入时候借用了DS,必须保护DS
CLI
START1: MOV DX,8006H ;;初始化8255
MOV AX,90H ;方式0,A口输入,B、C口输出
OUT DX,AX
START2: MOV CX,8 ;8拍为一次循环
MOV DX,8002H ;电机停,数码管关闭
MOV AL,0H
OUT DX,AL
START3: MOV DX,8000H
IN AL,DX
TEST AL,01H ;检测是否停止
JZ START2
MOV DX,8002H ;数码管显示
MOV AL,0FFH
OUT DX,AL
MOV DX,8000H ;检测点击转动方向
IN AL,DX
TEST AL,02H
JNZ CIRCLE2
CIRCLE1 : LEA SI,FR ;反转
MOV DX,8004H
MOV AL,60H
OUT DX,AL
JMP R1
CIRCLE2: LEA SI,ZR ;正转
MOV DX,8004H
MOV AL,50H
OUT DX,AL
JMP R1
R1: MOV DX,8004H
MOV AL,[SI+BX] ;高电平,确定所要取那个节拍
OUT DX,AL
CALL DELAY1
LOW1: MOV DX,8004H
MOV AL,050H
OUT DX,AL ;低电平,即一次方波结束
MOV DX,8000H
IN AL,DX
TEST AL,04H ;检测转动快慢,快速跳转
JZ F1
TEST AL,08H ;检测转动快慢,中速跳转
JZ M1
JMP L1
L1: CALL DELAY2 ;低速转
JMP STILL
M1: CALL DELAY1 ;中速转
JMP STILL
F1: CALL DELAY0 ;快速转
JMP STILL
STILL: ;INC SI
DEC CX
MOV BX,CX ;转到哪一拍
CMP CX,0
JNZ START3
JMP START2
;;;;;;;;;;;;;;;;;;;;延迟程序,不同延迟程序控制电机转动快慢
DELAY0:
PUSH CX
MOV CX,20H
LOOP $
POP CX
RET
DELAY1:
PUSH CX
MOV CX,40H
LOOP $
POP CX
RET
DELAY2:
PUSH CX
MOV CX,0D0H
LOOP $
POP CX
RET
DELAY3:
PUSH CX
MOV CX,01F0H
LOOP $
POP CX
RET
CODE ENDS
;数据段
DATA SEGMENT
ZR DB 01H,03H,02H,06H,04H,0CH,08H,09H ;正转
FR DB 09H,08H,0CH,04H,06H,02H,03H,01H ;反转
DATA ENDS
;栈堆段
STACK SEGMENT
STA DB 200 DUP(0)
TOP EQU LENGTH STA
STACK ENDS
END START
连接电路图:
作者代码编写能力较差,望感兴趣的大佬路过能提供更好的思路。