📄 motor_control.asm
字号:
RUB:
MOV R0,#20H ;指向状态计数器
INC @R0 ;计数器加一,正转
MOV P1,@R0 ;送输出口
CLR EA ;关总中断
INC R0 ; 指针指向21H
INC @R0 ;绝对坐标加一
CJNE @R0,#0DH,RUB1;不进位则转
INC R0 ;进位则位加一
INC @R0 ;
CJNE @R0,#0DH,RUB1 ;
INC R0 ;高位加一
INC @R0 ;
RUB1: ;
SETB EA ; 开总中断
DEC R6 ; 增量坐标减
CJNE R6,#0FFH,RUB2 ; 查借位否
DEC R7 ;
;
RUB2: ;;
MOV A,R6 ;
ORL A,R7 ;
JNZ RUB3 ;;查增量坐标为0否
CLR TR0 ;
SJMP RUB4 ; 不为0转出继续执行
RUB3: ;
CLR TR0 ; 加载定时器
MOV A,R2 ;
ADD A,TL0 ;
MOV TL0,A ;
MOV A,R3 ;
ADDC A,TH0 ;
MOV TH0,A ;
SETB TR0 ;
RUB4: ;
RETI ;
mov 21h,#20
mov 22h,#0
mov 23h,#0
;R0:中间结果寄存器;
;20H,状态寄存器;
;21H、22H、23H系统绝对坐标值;
;R1,存储过程速度字,初始存储启动速度字
;R3,存储每档运行的步数,初始存储启动速度档的运行参数sN,s为启动速度字
;24H,25H:存储升速过程总步数1N+2N+....(m-1)N,其中1,2....(m-1)为速度字,m为要求的恒速运行速度字
;26H,27H,28H存储恒速过程总步数,由起点至终点运行的总步数减去两倍升速过程总步数得到
;29H,2AH:存储降速过程总步数,可取与升速过程相同
;R4,存储数据指针,初始存#24H (#24H,表示升速阶段;#26H,表示恒速阶段;#29H,表示降速阶段)
TIM:
MOV R0,#20H ; 取状态计数器
INC @R0 ; 计数器加一,正转一步
MOV P1,@R0 ; 送输出口
CLR EA ; 关总中断
INC R0 ; 指针指向绝对坐标值
INC @R0 ; 绝对坐标值加一
CJNE @R0,#0H,TIM1 ; 判断绝对坐标的低八位(21H)有没有进位,如果有,则向22H进位,
INC R0 ;
INC @R0 ;
CJNE @R0,#0H,TIM1 ; 判断绝对坐标的中间八位(22H)有没有进位,如果有,则向23H进位,
INC R0 ;
INC @R0 ;
TIM1: ;
SETB EA ;开中断
CJNE R4,#24H,TIM4 ;测试R4判断系统处于哪个阶段
MOV R0,#24H ; 是升速段
DEC @R0 ; 升速步数减一
CJNE @R0,#0FFH,TIM2 ; 24H,25H双字节自减一,判断有无借位
INC R0 ;
DEC @R0 ;
TIM2: ;
DJNZ R3,TIM3 ;判断该档速度走完否,否则转
INC R1 ;走完增一档
MOV A,R1 ;计算该档步数
MOV B,#10 ;设置每档走10步
MUL AB ;档数越大,走的步数越多,
MOV R3,A ; 存放该档步数
TIM3: ;
MOV A,24H ;未结束,转重新装载
ORL A,25H ;结束,则重置指针指恒速
JNZ TIM9 ;
MOV R4,#26H ;
SJMP TIM9 ;
TIM4: ;
CJNE R4,#26H,TIM6 ;判断是否恒速段否,否转
MOV R0,#26H ;是,恒速步数减一
DEC @R0 ;
CJNE @R0,#0FFH,TIM5 ;
INC R0 ;
DEC @R0 ;
CJNE @R0,#0FFH,TIM5 ;
INC R0 ;
DEC @R0 ;
TIM5:
MOV A,26H ;判断恒速段结束否
ORL A,27H ;
ORL A,28H ;
JNZ TIM9 ;未结束,转重新装载
MOV R4,#29H ;结束,则重置指针指降速
DEC R1 ;降低第一档步数
MOV A,R1 ;
MOV B,#10 ;设置每档走10步
MUL AB ;
MOV R3,A ;
SJMP TIM9 ;转重新装载
TIM6: ;
MOV R0,#29H ;处理降速段
DEC @R0 ;降速段步数减一
CJNE @R0,#0FFH,TIM7 ;
INC R0 ;
DEC @R0 ;
TIM7: ;
DJNZ R3,TIM8 ;判断该档走完否,否转
DEC R1 ;走完,降一档
MOV A,R1 ;计算该档步数
MOV B,#10 ;设置每档走10步
MUL AB ;
MOV R3,A ;存好步数
TIM8: ;
MOV A,29H ;判断降速段走完否
ORL A,2AH ;
JNZ TIM9 ;未完,转重新装载
CLR TR0 ;完成,则停止定时器,结束运行
SJMP TIM10 ;
TIM9: ;
MOV DPTR,#8F00H ; 开始准备装载定时器
MOV A,R1 ; 提取速度字
RL A ; 乘2,因每档占两个字节
MOV B,A ;
MOVC A,@A+DPTR ; 取低位字节
CLR TR0 ;
ADD A,TL0 ;
MOV TL0,A ; 存低位字节
MOV A,B ;
INC A ;
MOVC A,@A+DPTR ; 取高位字节
ADDC A,TH0 ;
MOV TH0,A ; 存高位字节
cpl p3.1
SETB TR0 ;
TIM10: ;
RETI ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -