📄 运动控制系统.asm
字号:
;***********************************
SIGN_P_A EQU 20H.0 ;拉伸的标志位(1)表拉
SIGN_P_B EQU 20H.1;拉伸的标志位
SIGN_P_C EQU 20H.2;拉伸的标志位
SIGN_P EQU 20H.3;拉伸的标志位
SIGN_ZERO EQU 20H.4 ;零标志
START_X EQU 40H ;开始输入的X轴对应的坐标
START_Y EQU 41H ;开始输入的Y轴对应的坐标
END_X EQU 42H ;结束输入的X轴对应的坐标
END_Y EQU 43H ;结束输入的Y轴对应的坐标
IN_X EQU 30H ;X轴对应的坐标
IN_Y EQU 31H ;Y轴对应的坐标
MUL2_H EQU 32H ;平方高位
MUL2_L EQU 33H ;平方低位
KAFANG_H EQU 34H ;开方高位
KAFANG_L EQU 35H ;开方低位
OUT_A EQU 36H ;一边的长度
OUT_A_DATE EQU 37H ;小数
OUT_B EQU 38H ;一边的长度
OUT_B_DATE EQU 39H ;小数
OUT_C EQU 3AH ;一边的长度
OUT_C_DATE EQU 3BH ;小数
FACT_X EQU 3CH ;实际输入的X轴对应的坐标
FACT_Y EQU 3DH ;实际输入的Y轴对应的坐标
OUT_1_A EQU 44H ;一边的长度
OUT_1_A_DATE EQU 45H ;小数
OUT_1_B EQU 46H ;一边的长度
OUT_1_B_DATE EQU 47H ;小数
OUT_1_C EQU 48H ;一边的长度
OUT_1_C_DATE EQU 49H ;小数
CASE_1 EQU 4AH ;缓存
LINE_A EQU 4BH ;计算后输出一边的长度
LINE_A_DATE EQU 4CH ;计算后输出小数
LINE_B EQU 4DH
LINE_B_DATE EQU 4EH
LINE_C EQU 4FH
LINE_C_DATE EQU 50H
CASE_2 EQU 56H ;缓存(NO)
CASE_A EQU 57H ;判断
CASE_B EQU 58H ;判断
CASE_C EQU 59H ;判断
5AH
5BH
5CH
CRAM EQU 5DH
;********************************
ORG 00H
LJMP MAIN
ORG 50H
MAIN:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;判断长段和缩放,协调步进电机
START:CLR SIGN_P_A
CLR SIGN_P_B
CLR SIGN_P_C
MOV CASE_A,#02H
MOV CASE_B,#02H
MOV CASE_C,#02H
MOV FACT_X,START_X
MOV FACT_Y,START_Y
ACALL CHANGE_XY
MOV OUT_1_A,OUT_A
MOV OUT_1_A_DATE,OUT_A_DATE
MOV OUT_1_B,OUT_B
MOV OUT_1_B_DATE,OUT_B_DATE
MOV OUT_1_C,OUT_C
MOV OUT_1_C_DATE,OUT_C_DATE
MOV FACT_X,END_X
MOV FACT_Y,END_Y
ACALL CHANGE_XY
MOV R2,OUT_1_A
MOV R3,OUT_1_A_DATE
MOV R4,OUT_A
MOV R5,OUT_A_DATE
ACALL SUBB_2
MOV LINE_A,R6
MOV LINE_A_DATE,R7
JNB SIGN_P THEN_1
SETB SIGN_P_A
AJMP THEN_2
THEN_1:CLR SIGN_P_A
THEN_2:JNB SIGN_P_A,COMPY_1
AJMP MCU_1
COMPY_1:INC CASE_A
MCU_1:MOV R2,OUT_1_B
MOV R3,OUT_1_B_DATE
MOV R4,OUT_B
MOV R5,OUT_B_DATE
ACALL SUBB_2
MOV LINE_B,R6
MOV LINE_B_DATE,R7
JNB SIGN_P THENX_1
SETB SIGN_P_B
AJMP THENX_2
THENX_1:CLR SIGN_P_B
THENX_2:JNB SIGN_P_B,COMPY_2
AJMP MCU_2
COMPY_2: INC CASE_B
MCU_2:MOV R2,OUT_1_C
MOV R3,OUT_1_C_DATE
MOV R4,OUT_C
MOV R5,OUT_C_DATE
ACALL SUBB_2
MOV LINE_C,R6
MOV LINE_C_DATE,R7
JNB SIGN_P THENY_1
SETB SIGN_P_C
AJMP THENY_2
THENY_1:CLR SIGN_P_C
THENY_2:JNB SIGN_P_C,COMPY_3
AJMP MCU_3
COMPY_3:INC CASE_C
MCU_3: AJMP ???
;;***********************************步进电机优先级控制扫描子程序
POCESS_1:MOV R7,#00H
MOV R0,#57H
MOV R6,#03H
MOV R1,#5AH
POCESS_3:MOV A,@R0
CJNE A,#03H,POCESS_2
INC R7
POCESS_2:INC R0
MOV A,R0
CJNE A,#5AH,POCESS_3
MOV A,R7
CJNE A,#02H,POINT_1
MOV R0,#57H
POINT_3: MOV A,@R0
CJNE A,#03H,POINT_2
MOV A,R0
MOV R1,A
INC R1
POINT_2: INC R0
MOV CRAM,#00H
DJNZ R6,POINT_3
RET
POINT_1:
;**********************************带小数的减法子程序
;(6) 标号: SUBB_2 功能:3字节二进制无符号数带小数的减法
;;入口条件:待数在开始的数R2.R3 结束的数R4.R5中
;出口信息:结果在R6.R7中。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
CLR SIGN_P
CLR SIGN_ZERO
SUBB_2:MOV A,R2
CLR C
MOV CASE_1,R4
CJNE A,CASE_1,LOOP_1
MOV A,R3
CLR C
MOV CASE_1,R5
CJNE A,CASE_1,LOOP_2
SETB SIGN_ZERO
RET
LOOP_2:JC LOOP_3
MOV A,R3
CLR C
SUBB A,R5
MOV R7,A
MOV R6,#00H
RET
LOOP_3:MOV A,R5
CLR C
SUBB A,R3
MOV R7,A
MOV R6,#00H
RET
LOOP_1:JC LOOP_4 ;R2>R4
CLR C
MOV A,R3
CLR C
MOV CASE_1,R5
CJNE A,CASE_1,LOOP_5
LOOP_5:JC LOOP_6
SETB SIGN_P ;拉
CLR C
MOV A,R3
SUBB A,R5
MOV R7,A
CLR C
MOV A,R2
SUBB A,R4
MOV R6,A
RET
LOOP_6:CLR C
SETB SIGN_P ;拉
CLR C
MOV A,R3
ADD A,#10
SUBB A,R5
MOV R7,A
CLR C
MOV A,R2
DEC A
SUBB A,R4
MOV R6,A
RET
LOOP_4:
CLR C
MOV A,R5
CLR C
MOV CASE_1,R3
CJNE A,CASE_1,LOOPX_5
LOOPX_5:JC LOOPX_6
CLR SIGN_P ;伸
CLR C
MOV A,R5
SUBB A,R3
MOV R7,A
CLR C
MOV A,R4
SUBB A,R2
MOV R6,A
RET
LOOPX_6:CLR C
CLR SIGN_P ;伸
CLR C
MOV A,R5
ADD A,#10
SUBB A,R3
MOV R7,A
CLR C
MOV A,R4
DEC A
SUBB A,R2
MOV R6,A
RET
;;;******************************************
;******************************坐标转换子程序
CHANGE_XY:MOV A,#30
ADD A,FACT_X
MOV IN_X,A
MOV A,#17
ADD A,FACT_Y
MOV IN_Y,A
;******************************
BELT_B:MOV R2,IN_X
LCALL MUL2
MOV MUL2_H,R2
MOV MUL2_L,R3
MOV R2,IN_Y
LCALL MUL2
MOV R5,MUL2_H
MOV R6,MUL2_L
LCALL ADD2
MOV KAFANG_H,R2
MOV KAFANG_L,R3
LCALL SH2
MOV OUT_B,R2 ;整数
MOV DPTR,#TABLE_SHU ;小数查表
MOV A,R3
MOVC A,@A+DPTR
MOV OUT_A_DATE,A
BELT_C:MOV R2,#60
MOV R3,IN_X
LCALL SUBB1
LCALL MUL2
MOV MUL2_H,R2
MOV MUL2_L,R3
MOV R2,IN_Y
LCALL MUL2
MOV R5,MUL2_H
MOV R6,MUL2_L
LCALL ADD2
MOV KAFANG_H,R2
MOV KAFANG_L,R3
LCALL SH2
MOV OUT_C,R2 ;整数
MOV DPTR,#TABLE_SHU ;小数查表
MOV A,R3
MOVC A,@A+DPTR
MOV OUT_C_DATE,A
BELT_A:CLR C
MOV A,IN_X
CJNE A,#30,NEXT_1
NEXT_1:JC NEXT_2
MOV R2,IN_X
MOV R3,#30
LCALL SUBB1
AJMP NEXT_3
NEXT_2:MOV R2,#30
MOV R3,IN_X
LCALL SUBB1
NEXT_3: LCALL MUL2
MOV MUL2_H,R2
MOV MUL2_L,R3
MOV R2,#52
MOV R3,IN_Y
LCALL SUBB1
LCALL MUL2
MOV R5,MUL2_H
MOV R6,MUL2_L
LCALL ADD2
MOV KAFANG_H,R2
MOV KAFANG_L,R3
LCALL SH2
MOV OUT_A,R2 ;整数
MOV DPTR,#TABLE_SHU ;小数查表
MOV A,R3
MOVC A,@A+DPTR
MOV OUT_A_DATE,A
AJMP $ ;;///
;;**************************************
;(6) 标号: MUL2 功能:单字节二进制无符号数平方
;;入口条件:待平方数在R2中。出口:结果保存在R2,R3中(R2高位,R3,低位)
;出口信息:结果在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R5 堆栈需求: 2字节
MUL2: MOV A,R2 ;;计算R2平方
MOV B,R2
MUL AB
MOV R2,B
MOV R3,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;(6) 标号: MUL2 功能:单字节二进制无符号数R2,R3中(R2高位,R3,低位),R5,R6中(R5高位,R6,低位)
;;入口条件:待加数在R2,R3中,和R5,R6。出口:结果保存在R2,R3中(R2高位,R3,低位)
;出口信息:结果在R2、R3中。
;影响资源:PSW、A、B、R2~R5 堆栈需求: 2字节
ADD2:CLR C
MOV A,R3
ADD A,R6
MOV B,A ;B占存
MOV A,R2
ADDC A,R5
MOV R3,B
MOV R2,A
RET
;;;**********************************************************
;*****************************************************
;*****************************************************
; (12) 标号: SH2 功能:双字节二进制无符号数开平方(快速)
;入口条件:被开方数在R2、R3中。(R2高位,R3,低位)
;出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 。 结果在R2中
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET ;;被开方数为零,不必运算
SH20: MOV R7,#0 ;;左规次数初始化
MOV A,R2
SH22: ANL A,#0C0H ;;被开方数高字节小于40H否?
JNZ SQRH ;;不小于40H,左规格化完成,转开方过程
CLR C ;;每左规一次,被开方数左移两位
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7 ;;左规次数加一
SJMP SH22 ;;继续左规
SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一区间的斜率
MOV R4,#80H ;第一区间的平方根基数
SJMP SQR3
SQR1: MOV B,#0B2H ;第二区间的斜率
MOV R4,#0A0H;第二区间的平方根基数
SJMP SQR3
SQR2: MOV B,#8DH ;第三区间的斜率
MOV R4,#0D0H;第三区间的平方根基数
SQR3: MUL AB ;与区间基点的偏移量乘区间斜率
MOV A,B
ADD A,R4 ;累加到平方根的基数上
MOV R4,A
MOV B,A
MUL AB ;求当前平方根的幂
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用减奇数法校正一个字节的平方根
MOV A,R4 ;当前平方根的两倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于该奇数否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正结束,已达到一个字节的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;继续校正
SQR5: MOV A,R4 ;将一个字节精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最终偏移量的最高位
MOV A,R3
MOV R5,A ;将最终偏移量的低八位存入R5中
MOV R4,#8 ;通过(R5R6/R2)求根的低字节
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 ;根的第二字节计算完,在R3中
MOV A,R7 ;取原被开方数的左规次数
JZ SQRE ;未左规,开方结束
SQR9: CLR C ;按左规次数右移平方根,得到实际根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
;*********************************************************
;*********************************************************
TABLE_SHU: DB 00H,00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H,
DB 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H, 01H,
DB 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H, 02H,
DB 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H, 03H,
DB 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H, 04H,
DB 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H, 05H,
DB 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H, 06H,
DB 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H, 07H,
DB 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H, 08H,
DB 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H,
DB 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H, 09H
;;**************************************************
;(6) 标号: SUBB1 功能
;;入口条件:待被减数在R2,减数 R3中,
;出口信息:结果在R2中。
;影响资源:PSW、A、B、R2~R5 堆栈需求: 2字节
SUBB1:CLR C
MOV A,R2
SUBB A,R3
MOV R2,A
RET
;****************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -