
AJMP MAIN
ORG 0023H
AJMP RXD1
ORG 0100H
MAIN:
MOV SCON, #50H ;串行方式1,8位数据位,允许串行接收
MOV PCON, #80H
MOV TMOD, #20H ;定时器1,工作方式2,8位自动装入时间常数
MOV TL1, #0F4H ;波特率BR=4800
MOV TH1, #0F4H
MOV IE, #90H ;全局中断允许位打开,串行口中断允许位打开
SETB TR1 ;T1运行控制位打开
MOV DPTR, #0000H ;外部RAM初始地址
MOV P1, #0FFH ;控制电机1和电机2有效, 继电器断电
GO_ON:
MOV A, #01H
JNZ $ ;$自循环的符号,表示重复执行本条指令
MOV DPTR, #0000H
MOV R2, #00H ;地址计数清零
AJMP DRIVE ;执行驱动程序 (绝对跳转指令双字节)
ORG 0130H ;指定一个地址,后面的程序或数据从这个地址值开始分配
RXD1:
JNB RI, $ ;接收结束等待,结束则RI=1,否则等待
CLR RI
MOV A, SBUF ;接收串行数据
MOVX @DPTR, A ;存数据
INC DPTR ;地址加一
CJNE A, #2EH, RXD1 ;如果A中不为“.”,则继续接收数据,为"."则接收结束,中断返主
CLR A
RETI
ORG 0140H
DRIVE: ;开始执行控制程序,从DPTR指针首地址开始,连续取该地址下数据
MOVX A, @DPTR
CJNE A, #0FFH, SOL_ON ;判断该数据是否为电磁铁的通电信号,是-127则继续往下执行,否则跳转到SOL_OFF继续判断
SETB P1.0 ;是-127则抬笔
ACALL DELAY1 ;绝对调用指令
INC DPTR
INC R2
AJMP NEXT
SOL_ON:
CJNE A, #7FH, SIGAN ;是否为电磁铁的断电信号,是127则继续往下走,否则转为执行驱动步进电机程序
CLR P1.0 ;继电器通电,笔尖下移
ACALL DELAY1 ;调用延迟程序
INC DPTR
INC R2
AJMP NEXT
ORG 0160H
SIGAN:
CJNE A, #7EH, SIGAN2 ;比较A和7E两数不想等跳转至SIGAN2,若A=7E则继续下面
SETB P3.4 ;令 P3.4=1
SETB P3.3 ;令 P3.3=1
ACALL YIDONG_9MM ;调用YIDONG-9mm
INC DPTR ;DPTR=DPTR+1
INC R2 ;R2=R2+1
AJMP NEXT ;绝对转移指令
SIGAN2:
CJNE A, #7DH, MOTOR ;A=7D继续下面,不等跳转至MOROR
SETB P3.4
CLR P3.3;P3.4=ENA=1驱动板使能,P3.3=DIR=0电机反转
ACALL YIDONG_9MM ;电机转9圈丝,左移9mm
INC DPTR
INC R2
AJMP NEXT
ORG 0180H
MOTOR:
MOV A, R2 ;把此时数据的地址数送A,判断奇偶,以选择控制步进电机1或2
ANL A, #01H
JNZ MOTOR2 ;地址数为偶,则控制步进电机1,否则控制步进电机2
MOTOR1:
MOVX A, @DPTR ;重新取数据
JZ NEXT ;数据中若为零,则跳出,重新取下一个数据
ANL A, #80H ;判断数据的符号位
JNZ MOTOR1_CW ;首位为0,则CCW,否则CW
MOTOR1_CCW: ;电机1反转子程序
MOVX A, @DPTR
SETB P1.3
CLR P1.2
CCW_ROTATE1:
CLR P1.1
ACALL DELAY2
SETB P1.1
ACALL DELAY2
DEC A
JNZ CCW_ROTATE1
AJMP NEXT
MOTOR1_CW: ;电机1正转子程序
MOVX A, @DPTR
CLR C
SUBB A, #80H
SETB P1.3
SETB P1.2
CW_ROTATE1:
CLR P1.1
ACALL DELAY2
SETB P1.1
ACALL DELAY2
DEC A
JNZ CW_ROTATE1
AJMP NEXT
ORG 01C0H
MOTOR2:
MOVX A, @DPTR ;重新取数据
JZ NEXT ;数据中若为零,则跳出,重新取下一个数据
ANL A, #80H ;判断数据的符号位
JNZ MOTOR2_CW ;首位为0,则反转,否则正转
MOTOR2_CCW: ;电机2反转子程序
MOVX A, @DPTR
SETB P1.6
CLR P1.5
CCW_ROTATE2:
CLR P1.4
ACALL DELAY2
SETB P1.4
ACALL DELAY2
DEC A
JNZ CCW_ROTATE2
AJMP NEXT
MOTOR2_CW: ;电机2正转子程序
MOVX A, @DPTR
CLR C
SUBB A, #80H
SETB P1.6
SETB P1.5
CW_ROTATE2:
CLR P1.4
ACALL DELAY2
SETB P1.4
ACALL DELAY2
DEC A
JNZ CW_ROTATE2
AJMP NEXT
ORG 0200H ;取下一个数据程序
NEXT:
INC DPTR
INC R2
MOVX A, @DPTR
CJNE A, #2EH, DRIVE1 ;该地址下数据若为“.”的ASCII码(2EH),则结束,否则进入驱动程序
CLR A
AJMP START ;返回开始,继续等待串行中断
DRIVE1:
AJMP DRIVE ;返回驱动执行驱动程序
ORG 0210H
DELAY1: ;电磁铁延时程序
MOV R7, #0FH
LOOP1:
MOV R6, #0E8H
LOOP2:
MOV R5, #0FAH
DJNZ R5, $
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET ;子程序返回
DELAY: ;步进电机延时程序
MOV R7, #0FH
LOOP:
MOV R6, #0FFH
DJNZ R6, $
DJNZ R7, LOOP
RET ;子程序返回
DELAY2: ;步进电机延时程序
MOV R7, #0A1H
LOOP5:
MOV R6, #0FDH
DJNZ R6, $
DJNZ R7, LOOP5
RET ;子程序返回
YIDONG_9MM: ;丝杆移动9mm子程序
MOV R4, #02H
LOOP4:
MOV R3, #0C8H
LOOP3:
CLR P3.2
ACALL DELAY
SETB P3.2
ACALL DELAY
DJNZ R3,LOOP3
DJNZ R4,LOOP4
RET ;子程序返回
END
ORG 0023H
AJMP RXD1
ORG 0100H
MAIN:
MOV SCON, #50H ;串行方式1,8位数据位,允许串行接收
MOV PCON, #80H
MOV TMOD, #20H ;定时器1,工作方式2,8位自动装入时间常数
MOV TL1, #0F4H ;波特率BR=4800
MOV TH1, #0F4H
MOV IE, #90H ;全局中断允许位打开,串行口中断允许位打开
SETB TR1 ;T1运行控制位打开
MOV DPTR, #0000H ;外部RAM初始地址
MOV P1, #0FFH ;控制电机1和电机2有效, 继电器断电
GO_ON:
MOV A, #01H
JNZ $ ;$自循环的符号,表示重复执行本条指令
MOV DPTR, #0000H
MOV R2, #00H ;地址计数清零
AJMP DRIVE ;执行驱动程序 (绝对跳转指令双字节)
ORG 0130H ;指定一个地址,后面的程序或数据从这个地址值开始分配
RXD1:
JNB RI, $ ;接收结束等待,结束则RI=1,否则等待
CLR RI
MOV A, SBUF ;接收串行数据
MOVX @DPTR, A ;存数据
INC DPTR ;地址加一
CJNE A, #2EH, RXD1 ;如果A中不为“.”,则继续接收数据,为"."则接收结束,中断返主
CLR A
RETI
ORG 0140H
DRIVE: ;开始执行控制程序,从DPTR指针首地址开始,连续取该地址下数据
MOVX A, @DPTR
CJNE A, #0FFH, SOL_ON ;判断该数据是否为电磁铁的通电信号,是-127则继续往下执行,否则跳转到SOL_OFF继续判断
SETB P1.0 ;是-127则抬笔
ACALL DELAY1 ;绝对调用指令
INC DPTR
INC R2
AJMP NEXT
SOL_ON:
CJNE A, #7FH, SIGAN ;是否为电磁铁的断电信号,是127则继续往下走,否则转为执行驱动步进电机程序
CLR P1.0 ;继电器通电,笔尖下移
ACALL DELAY1 ;调用延迟程序
INC DPTR
INC R2
AJMP NEXT
ORG 0160H
SIGAN:
CJNE A, #7EH, SIGAN2 ;比较A和7E两数不想等跳转至SIGAN2,若A=7E则继续下面
SETB P3.4 ;令 P3.4=1
SETB P3.3 ;令 P3.3=1
ACALL YIDONG_9MM ;调用YIDONG-9mm
INC DPTR ;DPTR=DPTR+1
INC R2 ;R2=R2+1
AJMP NEXT ;绝对转移指令
SIGAN2:
CJNE A, #7DH, MOTOR ;A=7D继续下面,不等跳转至MOROR
SETB P3.4
CLR P3.3;P3.4=ENA=1驱动板使能,P3.3=DIR=0电机反转
ACALL YIDONG_9MM ;电机转9圈丝,左移9mm
INC DPTR
INC R2
AJMP NEXT
ORG 0180H
MOTOR:
MOV A, R2 ;把此时数据的地址数送A,判断奇偶,以选择控制步进电机1或2
ANL A, #01H
JNZ MOTOR2 ;地址数为偶,则控制步进电机1,否则控制步进电机2
MOTOR1:
MOVX A, @DPTR ;重新取数据
JZ NEXT ;数据中若为零,则跳出,重新取下一个数据
ANL A, #80H ;判断数据的符号位
JNZ MOTOR1_CW ;首位为0,则CCW,否则CW
MOTOR1_CCW: ;电机1反转子程序
MOVX A, @DPTR
SETB P1.3
CLR P1.2
CCW_ROTATE1:
CLR P1.1
ACALL DELAY2
SETB P1.1
ACALL DELAY2
DEC A
JNZ CCW_ROTATE1
AJMP NEXT
MOTOR1_CW: ;电机1正转子程序
MOVX A, @DPTR
CLR C
SUBB A, #80H
SETB P1.3
SETB P1.2
CW_ROTATE1:
CLR P1.1
ACALL DELAY2
SETB P1.1
ACALL DELAY2
DEC A
JNZ CW_ROTATE1
AJMP NEXT
ORG 01C0H
MOTOR2:
MOVX A, @DPTR ;重新取数据
JZ NEXT ;数据中若为零,则跳出,重新取下一个数据
ANL A, #80H ;判断数据的符号位
JNZ MOTOR2_CW ;首位为0,则反转,否则正转
MOTOR2_CCW: ;电机2反转子程序
MOVX A, @DPTR
SETB P1.6
CLR P1.5
CCW_ROTATE2:
CLR P1.4
ACALL DELAY2
SETB P1.4
ACALL DELAY2
DEC A
JNZ CCW_ROTATE2
AJMP NEXT
MOTOR2_CW: ;电机2正转子程序
MOVX A, @DPTR
CLR C
SUBB A, #80H
SETB P1.6
SETB P1.5
CW_ROTATE2:
CLR P1.4
ACALL DELAY2
SETB P1.4
ACALL DELAY2
DEC A
JNZ CW_ROTATE2
AJMP NEXT
ORG 0200H ;取下一个数据程序
NEXT:
INC DPTR
INC R2
MOVX A, @DPTR
CJNE A, #2EH, DRIVE1 ;该地址下数据若为“.”的ASCII码(2EH),则结束,否则进入驱动程序
CLR A
AJMP START ;返回开始,继续等待串行中断
DRIVE1:
AJMP DRIVE ;返回驱动执行驱动程序
ORG 0210H
DELAY1: ;电磁铁延时程序
MOV R7, #0FH
LOOP1:
MOV R6, #0E8H
LOOP2:
MOV R5, #0FAH
DJNZ R5, $
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET ;子程序返回
DELAY: ;步进电机延时程序
MOV R7, #0FH
LOOP:
MOV R6, #0FFH
DJNZ R6, $
DJNZ R7, LOOP
RET ;子程序返回
DELAY2: ;步进电机延时程序
MOV R7, #0A1H
LOOP5:
MOV R6, #0FDH
DJNZ R6, $
DJNZ R7, LOOP5
RET ;子程序返回
YIDONG_9MM: ;丝杆移动9mm子程序
MOV R4, #02H
LOOP4:
MOV R3, #0C8H
LOOP3:
CLR P3.2
ACALL DELAY
SETB P3.2
ACALL DELAY
DJNZ R3,LOOP3
DJNZ R4,LOOP4
RET ;子程序返回
END
