原创 红外遥控六足爬虫机器人设计

2008-8-22 18:44 1567 1 2 分类: MCU/ 嵌入式
五、控制程序
; 红外遥控爬虫机器人ASM程序
;-----------------------------------------------------------------------------------------------------------------------------------------
HOME EQU 14 ;伺服马达回到中点时间常数
BACK EQU 3 ;伺服马达反转时间常数
FOR EQU 25 ;伺服马达正转时间常数
; ----------------------------------------------------------------------------------------------------------------------------------------
;遥控器按键1~6比较码
CODE_K1 EQU 19H ;机器人前进比较码
CODE_K2 EQU 18H ;机器人后退比较码
CODE_K3 EQU 0AH ;机器人左转比较码
CODE_K4 EQU 09H ;机器人右转比较码
CODE_K5 EQU 0BH ;机器人回到中点比较码
CODE_K6 EQU 14H ;机器人行走启动进比较码
; ----------------------------------------------------------------------------------------------------------------------------------------
IRCOM EQU 30H ;红外线信号解码数据放置变量起始地址
COM EQU 32H ;比较第3字节变量
; ----------------------------------------------------------------------------------------------------------------------------------------
IRIN EQU P3.2 ;红外线IR信号输入位引脚定义
WLED EQU P3.7 ;发光二极管引脚定义
SPK EQU P3.4 ;压电喇叭引脚定义
DJZ EQU P1.0 ;中间伺服马达引脚定义
DJL EQU P1.1 ;左侧伺服马达引脚定义
DJR EQU P1.2 ;右侧伺服马达引脚定义
; ----------------------------------------------------------------------------------------------------------------------------------------
?ORG 0H ;程序代码由地址0开始执行
?JMP BEGIN ;进入主程序
; ----------------------------------------------------------------------------------------------------------------------------------------
BEGIN:
CLR DJZ ;关闭中间伺服马达
 CLR DJL ;关闭左侧伺服马达
CLR DJR ;关闭右侧伺服马达
CLR SPK ;关闭压电喇叭
? CALL LED_BL ;发光二极管闪烁,表示程序开始执行
? CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_HOME ;全部伺服马达回到中点
? CALL LED_BL ;发光二极管闪烁,表示机器人准备完毕
? CALL BZ ;压电喇叭发出嘀的一声
CALL QD ;运行行走启动子程序,摆好行走姿态
SETB IRIN ;红外线信号IR输入位设为高电平,准备接收红外信号
LOOP:
?MOV R0,#IRCOM ;设置IR解码起始地址
?CALL IR_IN ;进行IR解码
CALL OP ;进行解码比较,并控制机器人动作
? JMP LOOP ;继续循环执行
; ----------------------------------------------------------------------------------------------------------------------------------------
DELAY:MOV R6,#50 ;10ms延时子程序
D1:  MOV R7,#99
? DJNZ R7,$
? DJNZ R6,D1
? DJNZ R5,DELAY
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
LED_BL: MOV R1,#4 ;发光二极管闪烁子程序
LE1: CPL WLED ;发光二极管反向
? MOV R5,#10 ?
? CALL DELAY ;进行100ms延时
? DJNZ R1,LE1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
BZ: MOV R6,#0 ;压电喇叭发声子程序
B1: SETB SPK ;压电喇叭得电,开始发声
? DJNZ R6,B1?
? MOV R5,#5
CALL DELAY ;进行50ms延时
? CLR SPK ;关闭压电喇叭
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
DEL: ;0.1ms延时子程序
? MOV R5,#1
DELAY1:
? MOV R6,#2
E1: MOV R7,#22
E2: DJNZ R7,E2
? DJNZ R6,E1
? DJNZ R5,DELAY1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
IR_IN: ;红外解码子程序
I1: JNB IRIN,I2 ;等待红外IR信号出现
JMP I1
I2: MOV R4,#20 ;发现红外IR信号,延时一下
I20: CALL DEL
?DJNZ R4,I20
?JB IRIN,I1 ;确认红外IR信号出现
I21: JB IRIN,I3 ;等待IR变为高电平
?CALL DEL
?JMP I21
I3: MOV R3,#0 ;8位数清0
LL: JNB IRIN,I4 ;等待IR变为低电平
?CALL DEL
?JMP LL
I4: JB IRIN,I5 ;等待IR变为高电平
?CALL DEL
?JMP I4
I5: MOV R2,#0 ;0.1ms 计数
L1: CALL DEL
?JB IRIN,N1 ;等待IR变为高电平
?MOV A,#8 ;设置减数为8
?CLR C ;清除借位标志C
?SUBB A,R2 ;判断高低位
?MOV A,@R0 ;取出内存中原先数据
?RRC A ;右移指令,将借位标志C右移进入A寄存器中
? MOV @R0, A ;将数据写入内存中
? INC R3 ;处理完成一位,R3+1(R3计数)
?CJNE R3,#8, LL ;循环处理8位
?MOV R3,#0 ;R3清0
?INC R0 ;处理完成1个字节,R0+1(R0计数)
?CJNE R0,#34H, LL ;循环收集到4个字节
?JMP OK ;至完成返回
N1: INC R2 ;R2+1(R2计数)
?CJNE R2,#30, L1 ;0.1ms 计数过长,时间到自动离开
OK: RET ;完成返回
; ----------------------------------------------------------------------------------------------------------------------------------------
OP: 执行解码动作子程序
?MOV A,COM
?CJNE A,#CODE_K5, A1 ;对解码进行比较,看是否是回到中点指令,否就转至下一项比较
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
CALL GO_HOME ;执行回到中点
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
RET
A1:
?MOV A,COM
?CJNE A,#CODE_K1, A2 ;对解码进行比较,看是否是前进指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
?CALL GO_FOR ;执行前进
? RET
A2:
?MOV A,COM
?CJNE A,#CODE_K2, A3 ;对解码进行比较,看是否是后退指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_BACK ;执行后退
? RET
A3: ;L
?MOV A,COM
?CJNE A,#CODE_K3, A4 ;对解码进行比较,看是否是左转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_L ;执行左转
? RET
A4: ;R?
? MOV A,COM ?
?CJNE A,#CODE_K4, A5 ;对解码进行比较,看是否是右转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_R ;执行右转
?RET
A5:
MOV A,COM
CJNE A,#CODE_K6, A6 ;对解码进行比较,看是否是行走启动指令,否就转至下一项
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? CALL QD ;执行行走启动
?CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? RET
A6:
? RET ;返回
; ----------------------------------------------------------------------------------------------------------------------------------------
HOME1: SETB DJZ ;各伺服电机回中点控制子程序
? SETB DJL
?SETB DJR
?MOV R4,#HOME
G1: CALL DEL
?DJNZ R4,G1
?CLR DJZ
CLR DJL
?CLR DJR
?MOV R4,#(200-HOME)
G2: CALL DEL
?DJNZ R4,G2
?RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_HOME: MOV R3,#15 ;机器人回中点子程序
H1: CALL HOME1
? DJNZ R3,H1?
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_FOR: SETB DJZ ;中间电机正转子程序
? MOV R4,#FOR
FZ1: CALL DEL
? DJNZ R4,FZ1
? CLR DJZ ?
? MOV R4,#(200-FOR)
FZ2: CALL DEL
? DJNZ R4,FZ2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_FOR: SETB DJL ;左侧电机正转子程序
? MOV R4,#FOR
FL1: CALL DEL
? DJNZ R4,FL1
? CLR DJL ?
? MOV R4,#(200-FOR)
FL2: CALL DEL
? DJNZ R4,FL2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_FOR: SETB DJR ;右侧电机正转子程序
? MOV R4,#FOR
FR1: CALL DEL
? DJNZ R4,FR1
? CLR DJR ?
? MOV R4,#(200-FOR)
FR2: CALL DEL
? DJNZ R4,FR2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_BACK: SETB DJZ ;中间电机反转子程序
? MOV R4,#BACK
DJZBA1: CALL DEL
? DJNZ R4,DJZBA1
? CLR DJZ ?
? MOV R4,#(200-BACK)
DJZB2: CALL DEL
? DJNZ R4,DJZB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_BACK: SETB DJL ;左侧电机反转子程序
? MOV R4,#BACK
DJLBA1: CALL DEL
? DJNZ R4,DJLBA1
? CLR DJL ?
? MOV R4,#(200-BACK)
DJLB2: CALL DEL
? DJNZ R4,DJLB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_BACK: SETB DJR ;右侧电机反转子程序
? MOV R4,#BACK
DJRBA1: CALL DEL
? DJNZ R4,DJRBA1
? CLR DJR ?
? MOV R4,#(200-BACK)
DJRB2: CALL DEL
? DJNZ R4,DJRB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_FOR: MOV R3,#5 ;机器人向前行走子程序
F1: CALL DJZ_FOR
? DJNZ R3,F1
? MOV R3,#10
F2: CALL DJR_BACK
? DJNZ R3,F2
? MOV R3,#10
F3: CALL DJL_BACK
? DJNZ R3,F3
? MOV R3,#5
F4: CALL DJZ_BACK
? DJNZ R3,F4
? MOV R3,#10
F5: CALL DJL_FOR
? DJNZ R3,F5
? MOV R3,#10
F6: CALL DJR_FOR
? DJNZ R3,F6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_BACK: MOV R3,#10 ;机器人向后行走子程序
BA1: CALL DJL_BACK
? DJNZ R3,BA1
? MOV R3,#10
BA2: CALL DJR_BACK
? DJNZ R3,BA2
? MOV R3,#5
BA4: CALL DJZ_FOR
? DJNZ R3,BA4
? MOV R3,#10
BA5: CALL DJR_FOR
? DJNZ R3,BA5
? MOV R3,#10
BA6: CALL DJL_FOR
? DJNZ R3,BA6
? MOV R3,#5
BA7: CALL DJZ_BACK
? DJNZ R3,BA7
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_L: MOV R3,#10 ;机器人左转行走子程序
GL1: CALL DJL_BACK
? DJNZ R3,GL1
? MOV R3,#5
GL2: CALL DJZ_FOR?
? DJNZ R3,GL2
? MOV R3,#10
GL3: CALL DJR_BACK
? DJNZ R3,GL3
? MOV R3,#10
GL7: CALL DJL_FOR
? DJNZ R3,GL7
? MOV R3,#5
GL4: CALL DJZ_BACK
? DJNZ R3,GL4
? MOV R3,#10
GL5: CALL DJR_FOR
? DJNZ R3,GL5?
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_R: MOV R3,#10 ;机器人右转行走子程序
GR1: CALL DJR_BACK
? DJNZ R3,GR1
? MOV R3,#5
GR2: CALL DJZ_FOR?
? DJNZ R3,GR2
? MOV R3,#10
GR3: CALL DJL_BACK
? DJNZ R3,GR3
? MOV R3,#10
GR4: CALL DJR_FOR
? DJNZ R3,GR4
? MOV R3,#5
GR5: CALL DJZ_BACK
? DJNZ R3,GR5
? MOV R3,#10
GR6: CALL DJL_FOR
? DJNZ R3,GR6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
QD: MOV R3,#5 ;机器人行走启动子程序
Q1: CALL DJZ_BACK
? DJNZ R3,Q1
? MOV R3,#5
Q2: CALL DJR_FOR
? DJNZ R3,Q2
? MOV R3,#5
Q3: CALL DJL_FOR
? DJNZ R3,Q3
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
? END


五、控制程序
; 红外遥控爬虫机器人ASM程序
;-----------------------------------------------------------------------------------------------------------------------------------------
HOME EQU 14 ;伺服马达回到中点时间常数
BACK EQU 3 ;伺服马达反转时间常数
FOR EQU 25 ;伺服马达正转时间常数
; ----------------------------------------------------------------------------------------------------------------------------------------
;遥控器按键1~6比较码
CODE_K1 EQU 19H ;机器人前进比较码
CODE_K2 EQU 18H ;机器人后退比较码
CODE_K3 EQU 0AH ;机器人左转比较码
CODE_K4 EQU 09H ;机器人右转比较码
CODE_K5 EQU 0BH ;机器人回到中点比较码
CODE_K6 EQU 14H ;机器人行走启动进比较码
; ----------------------------------------------------------------------------------------------------------------------------------------
IRCOM EQU 30H ;红外线信号解码数据放置变量起始地址
COM EQU 32H ;比较第3字节变量
; ----------------------------------------------------------------------------------------------------------------------------------------
IRIN EQU P3.2 ;红外线IR信号输入位引脚定义
WLED EQU P3.7 ;发光二极管引脚定义
SPK EQU P3.4 ;压电喇叭引脚定义
DJZ EQU P1.0 ;中间伺服马达引脚定义
DJL EQU P1.1 ;左侧伺服马达引脚定义
DJR EQU P1.2 ;右侧伺服马达引脚定义
; ----------------------------------------------------------------------------------------------------------------------------------------
?ORG 0H ;程序代码由地址0开始执行
?JMP BEGIN ;进入主程序
; ----------------------------------------------------------------------------------------------------------------------------------------
BEGIN:
CLR DJZ ;关闭中间伺服马达
 CLR DJL ;关闭左侧伺服马达
CLR DJR ;关闭右侧伺服马达
CLR SPK ;关闭压电喇叭
? CALL LED_BL ;发光二极管闪烁,表示程序开始执行
? CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_HOME ;全部伺服马达回到中点
? CALL LED_BL ;发光二极管闪烁,表示机器人准备完毕
? CALL BZ ;压电喇叭发出嘀的一声
CALL QD ;运行行走启动子程序,摆好行走姿态
SETB IRIN ;红外线信号IR输入位设为高电平,准备接收红外信号
LOOP:
?MOV R0,#IRCOM ;设置IR解码起始地址
?CALL IR_IN ;进行IR解码
CALL OP ;进行解码比较,并控制机器人动作
? JMP LOOP ;继续循环执行
; ----------------------------------------------------------------------------------------------------------------------------------------
DELAY:MOV R6,#50 ;10ms延时子程序
D1:  MOV R7,#99
? DJNZ R7,$
? DJNZ R6,D1
? DJNZ R5,DELAY
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
LED_BL: MOV R1,#4 ;发光二极管闪烁子程序
LE1: CPL WLED ;发光二极管反向
? MOV R5,#10 ?
? CALL DELAY ;进行100ms延时
? DJNZ R1,LE1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
BZ: MOV R6,#0 ;压电喇叭发声子程序
B1: SETB SPK ;压电喇叭得电,开始发声
? DJNZ R6,B1?
? MOV R5,#5
CALL DELAY ;进行50ms延时
? CLR SPK ;关闭压电喇叭
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
DEL: ;0.1ms延时子程序
? MOV R5,#1
DELAY1:
? MOV R6,#2
E1: MOV R7,#22
E2: DJNZ R7,E2
? DJNZ R6,E1
? DJNZ R5,DELAY1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
IR_IN: ;红外解码子程序
I1: JNB IRIN,I2 ;等待红外IR信号出现
JMP I1
I2: MOV R4,#20 ;发现红外IR信号,延时一下
I20: CALL DEL
?DJNZ R4,I20
?JB IRIN,I1 ;确认红外IR信号出现
I21: JB IRIN,I3 ;等待IR变为高电平
?CALL DEL
?JMP I21
I3: MOV R3,#0 ;8位数清0
LL: JNB IRIN,I4 ;等待IR变为低电平
?CALL DEL
?JMP LL
I4: JB IRIN,I5 ;等待IR变为高电平
?CALL DEL
?JMP I4
I5: MOV R2,#0 ;0.1ms 计数
L1: CALL DEL
?JB IRIN,N1 ;等待IR变为高电平
?MOV A,#8 ;设置减数为8
?CLR C ;清除借位标志C
?SUBB A,R2 ;判断高低位
?MOV A,@R0 ;取出内存中原先数据
?RRC A ;右移指令,将借位标志C右移进入A寄存器中
? MOV @R0, A ;将数据写入内存中
? INC R3 ;处理完成一位,R3+1(R3计数)
?CJNE R3,#8, LL ;循环处理8位
?MOV R3,#0 ;R3清0
?INC R0 ;处理完成1个字节,R0+1(R0计数)
?CJNE R0,#34H, LL ;循环收集到4个字节
?JMP OK ;至完成返回
N1: INC R2 ;R2+1(R2计数)
?CJNE R2,#30, L1 ;0.1ms 计数过长,时间到自动离开
OK: RET ;完成返回
; ----------------------------------------------------------------------------------------------------------------------------------------
OP: 执行解码动作子程序
?MOV A,COM
?CJNE A,#CODE_K5, A1 ;对解码进行比较,看是否是回到中点指令,否就转至下一项比较
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
CALL GO_HOME ;执行回到中点
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
RET
A1:
?MOV A,COM
?CJNE A,#CODE_K1, A2 ;对解码进行比较,看是否是前进指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
?CALL GO_FOR ;执行前进
? RET
A2:
?MOV A,COM
?CJNE A,#CODE_K2, A3 ;对解码进行比较,看是否是后退指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_BACK ;执行后退
? RET
A3: ;L
?MOV A,COM
?CJNE A,#CODE_K3, A4 ;对解码进行比较,看是否是左转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_L ;执行左转
? RET
A4: ;R?
? MOV A,COM ?
?CJNE A,#CODE_K4, A5 ;对解码进行比较,看是否是右转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_R ;执行右转
?RET
A5:
MOV A,COM
CJNE A,#CODE_K6, A6 ;对解码进行比较,看是否是行走启动指令,否就转至下一项
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? CALL QD ;执行行走启动
?CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? RET
A6:
? RET ;返回
; ----------------------------------------------------------------------------------------------------------------------------------------
HOME1: SETB DJZ ;各伺服电机回中点控制子程序
? SETB DJL
?SETB DJR
?MOV R4,#HOME
G1: CALL DEL
?DJNZ R4,G1
?CLR DJZ
CLR DJL
?CLR DJR
?MOV R4,#(200-HOME)
G2: CALL DEL
?DJNZ R4,G2
?RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_HOME: MOV R3,#15 ;机器人回中点子程序
H1: CALL HOME1
? DJNZ R3,H1?
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_FOR: SETB DJZ ;中间电机正转子程序
? MOV R4,#FOR
FZ1: CALL DEL
? DJNZ R4,FZ1
? CLR DJZ ?
? MOV R4,#(200-FOR)
FZ2: CALL DEL
? DJNZ R4,FZ2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_FOR: SETB DJL ;左侧电机正转子程序
? MOV R4,#FOR
FL1: CALL DEL
? DJNZ R4,FL1
? CLR DJL ?
? MOV R4,#(200-FOR)
FL2: CALL DEL
? DJNZ R4,FL2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_FOR: SETB DJR ;右侧电机正转子程序
? MOV R4,#FOR
FR1: CALL DEL
? DJNZ R4,FR1
? CLR DJR ?
? MOV R4,#(200-FOR)
FR2: CALL DEL
? DJNZ R4,FR2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_BACK: SETB DJZ ;中间电机反转子程序
? MOV R4,#BACK
DJZBA1: CALL DEL
? DJNZ R4,DJZBA1
? CLR DJZ ?
? MOV R4,#(200-BACK)
DJZB2: CALL DEL
? DJNZ R4,DJZB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_BACK: SETB DJL ;左侧电机反转子程序
? MOV R4,#BACK
DJLBA1: CALL DEL
? DJNZ R4,DJLBA1
? CLR DJL ?
? MOV R4,#(200-BACK)
DJLB2: CALL DEL
? DJNZ R4,DJLB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_BACK: SETB DJR ;右侧电机反转子程序
? MOV R4,#BACK
DJRBA1: CALL DEL
? DJNZ R4,DJRBA1
? CLR DJR ?
? MOV R4,#(200-BACK)
DJRB2: CALL DEL
? DJNZ R4,DJRB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_FOR: MOV R3,#5 ;机器人向前行走子程序
F1: CALL DJZ_FOR
? DJNZ R3,F1
? MOV R3,#10
F2: CALL DJR_BACK
? DJNZ R3,F2
? MOV R3,#10
F3: CALL DJL_BACK
? DJNZ R3,F3
? MOV R3,#5
F4: CALL DJZ_BACK
? DJNZ R3,F4
? MOV R3,#10
F5: CALL DJL_FOR
? DJNZ R3,F5
? MOV R3,#10
F6: CALL DJR_FOR
? DJNZ R3,F6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_BACK: MOV R3,#10 ;机器人向后行走子程序
BA1: CALL DJL_BACK
? DJNZ R3,BA1
? MOV R3,#10
BA2: CALL DJR_BACK
? DJNZ R3,BA2
? MOV R3,#5
BA4: CALL DJZ_FOR
? DJNZ R3,BA4
? MOV R3,#10
BA5: CALL DJR_FOR
? DJNZ R3,BA5
? MOV R3,#10
BA6: CALL DJL_FOR
? DJNZ R3,BA6
? MOV R3,#5
BA7: CALL DJZ_BACK
? DJNZ R3,BA7
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_L: MOV R3,#10 ;机器人左转行走子程序
GL1: CALL DJL_BACK
? DJNZ R3,GL1
? MOV R3,#5
GL2: CALL DJZ_FOR?
? DJNZ R3,GL2
? MOV R3,#10
GL3: CALL DJR_BACK
? DJNZ R3,GL3
? MOV R3,#10
GL7: CALL DJL_FOR
? DJNZ R3,GL7
? MOV R3,#5
GL4: CALL DJZ_BACK
? DJNZ R3,GL4
? MOV R3,#10
GL5: CALL DJR_FOR
? DJNZ R3,GL5?
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_R: MOV R3,#10 ;机器人右转行走子程序
GR1: CALL DJR_BACK
? DJNZ R3,GR1
? MOV R3,#5
GR2: CALL DJZ_FOR?
? DJNZ R3,GR2
? MOV R3,#10
GR3: CALL DJL_BACK
? DJNZ R3,GR3
? MOV R3,#10
GR4: CALL DJR_FOR
? DJNZ R3,GR4
? MOV R3,#5
GR5: CALL DJZ_BACK
? DJNZ R3,GR5
? MOV R3,#10
GR6: CALL DJL_FOR
? DJNZ R3,GR6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
QD: MOV R3,#5 ;机器人行走启动子程序
Q1: CALL DJZ_BACK
? DJNZ R3,Q1
? MOV R3,#5
Q2: CALL DJR_FOR
? DJNZ R3,Q2
? MOV R3,#5
Q3: CALL DJL_FOR
? DJNZ R3,Q3
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
? END


五、控制程序
; 红外遥控爬虫机器人ASM程序
;-----------------------------------------------------------------------------------------------------------------------------------------
HOME EQU 14 ;伺服马达回到中点时间常数
BACK EQU 3 ;伺服马达反转时间常数
FOR EQU 25 ;伺服马达正转时间常数
; ----------------------------------------------------------------------------------------------------------------------------------------
;遥控器按键1~6比较码
CODE_K1 EQU 19H ;机器人前进比较码
CODE_K2 EQU 18H ;机器人后退比较码
CODE_K3 EQU 0AH ;机器人左转比较码
CODE_K4 EQU 09H ;机器人右转比较码
CODE_K5 EQU 0BH ;机器人回到中点比较码
CODE_K6 EQU 14H ;机器人行走启动进比较码
; ----------------------------------------------------------------------------------------------------------------------------------------
IRCOM EQU 30H ;红外线信号解码数据放置变量起始地址
COM EQU 32H ;比较第3字节变量
; ----------------------------------------------------------------------------------------------------------------------------------------
IRIN EQU P3.2 ;红外线IR信号输入位引脚定义
WLED EQU P3.7 ;发光二极管引脚定义
SPK EQU P3.4 ;压电喇叭引脚定义
DJZ EQU P1.0 ;中间伺服马达引脚定义
DJL EQU P1.1 ;左侧伺服马达引脚定义
DJR EQU P1.2 ;右侧伺服马达引脚定义
; ----------------------------------------------------------------------------------------------------------------------------------------
?ORG 0H ;程序代码由地址0开始执行
?JMP BEGIN ;进入主程序
; ----------------------------------------------------------------------------------------------------------------------------------------
BEGIN:
CLR DJZ ;关闭中间伺服马达
 CLR DJL ;关闭左侧伺服马达
CLR DJR ;关闭右侧伺服马达
CLR SPK ;关闭压电喇叭
? CALL LED_BL ;发光二极管闪烁,表示程序开始执行
? CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_HOME ;全部伺服马达回到中点
? CALL LED_BL ;发光二极管闪烁,表示机器人准备完毕
? CALL BZ ;压电喇叭发出嘀的一声
CALL QD ;运行行走启动子程序,摆好行走姿态
SETB IRIN ;红外线信号IR输入位设为高电平,准备接收红外信号
LOOP:
?MOV R0,#IRCOM ;设置IR解码起始地址
?CALL IR_IN ;进行IR解码
CALL OP ;进行解码比较,并控制机器人动作
? JMP LOOP ;继续循环执行
; ----------------------------------------------------------------------------------------------------------------------------------------
DELAY:MOV R6,#50 ;10ms延时子程序
D1:  MOV R7,#99
? DJNZ R7,$
? DJNZ R6,D1
? DJNZ R5,DELAY
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
LED_BL: MOV R1,#4 ;发光二极管闪烁子程序
LE1: CPL WLED ;发光二极管反向
? MOV R5,#10 ?
? CALL DELAY ;进行100ms延时
? DJNZ R1,LE1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
BZ: MOV R6,#0 ;压电喇叭发声子程序
B1: SETB SPK ;压电喇叭得电,开始发声
? DJNZ R6,B1?
? MOV R5,#5
CALL DELAY ;进行50ms延时
? CLR SPK ;关闭压电喇叭
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
DEL: ;0.1ms延时子程序
? MOV R5,#1
DELAY1:
? MOV R6,#2
E1: MOV R7,#22
E2: DJNZ R7,E2
? DJNZ R6,E1
? DJNZ R5,DELAY1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
IR_IN: ;红外解码子程序
I1: JNB IRIN,I2 ;等待红外IR信号出现
JMP I1
I2: MOV R4,#20 ;发现红外IR信号,延时一下
I20: CALL DEL
?DJNZ R4,I20
?JB IRIN,I1 ;确认红外IR信号出现
I21: JB IRIN,I3 ;等待IR变为高电平
?CALL DEL
?JMP I21
I3: MOV R3,#0 ;8位数清0
LL: JNB IRIN,I4 ;等待IR变为低电平
?CALL DEL
?JMP LL
I4: JB IRIN,I5 ;等待IR变为高电平
?CALL DEL
?JMP I4
I5: MOV R2,#0 ;0.1ms 计数
L1: CALL DEL
?JB IRIN,N1 ;等待IR变为高电平
?MOV A,#8 ;设置减数为8
?CLR C ;清除借位标志C
?SUBB A,R2 ;判断高低位
?MOV A,@R0 ;取出内存中原先数据
?RRC A ;右移指令,将借位标志C右移进入A寄存器中
? MOV @R0, A ;将数据写入内存中
? INC R3 ;处理完成一位,R3+1(R3计数)
?CJNE R3,#8, LL ;循环处理8位
?MOV R3,#0 ;R3清0
?INC R0 ;处理完成1个字节,R0+1(R0计数)
?CJNE R0,#34H, LL ;循环收集到4个字节
?JMP OK ;至完成返回
N1: INC R2 ;R2+1(R2计数)
?CJNE R2,#30, L1 ;0.1ms 计数过长,时间到自动离开
OK: RET ;完成返回
; ----------------------------------------------------------------------------------------------------------------------------------------
OP: 执行解码动作子程序
?MOV A,COM
?CJNE A,#CODE_K5, A1 ;对解码进行比较,看是否是回到中点指令,否就转至下一项比较
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
CALL GO_HOME ;执行回到中点
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
RET
A1:
?MOV A,COM
?CJNE A,#CODE_K1, A2 ;对解码进行比较,看是否是前进指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
?CALL GO_FOR ;执行前进
? RET
A2:
?MOV A,COM
?CJNE A,#CODE_K2, A3 ;对解码进行比较,看是否是后退指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_BACK ;执行后退
? RET
A3: ;L
?MOV A,COM
?CJNE A,#CODE_K3, A4 ;对解码进行比较,看是否是左转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_L ;执行左转
? RET
A4: ;R?
? MOV A,COM ?
?CJNE A,#CODE_K4, A5 ;对解码进行比较,看是否是右转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_R ;执行右转
?RET
A5:
MOV A,COM
CJNE A,#CODE_K6, A6 ;对解码进行比较,看是否是行走启动指令,否就转至下一项
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? CALL QD ;执行行走启动
?CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? RET
A6:
? RET ;返回
; ----------------------------------------------------------------------------------------------------------------------------------------
HOME1: SETB DJZ ;各伺服电机回中点控制子程序
? SETB DJL
?SETB DJR
?MOV R4,#HOME
G1: CALL DEL
?DJNZ R4,G1
?CLR DJZ
CLR DJL
?CLR DJR
?MOV R4,#(200-HOME)
G2: CALL DEL
?DJNZ R4,G2
?RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_HOME: MOV R3,#15 ;机器人回中点子程序
H1: CALL HOME1
? DJNZ R3,H1?
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_FOR: SETB DJZ ;中间电机正转子程序
? MOV R4,#FOR
FZ1: CALL DEL
? DJNZ R4,FZ1
? CLR DJZ ?
? MOV R4,#(200-FOR)
FZ2: CALL DEL
? DJNZ R4,FZ2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_FOR: SETB DJL ;左侧电机正转子程序
? MOV R4,#FOR
FL1: CALL DEL
? DJNZ R4,FL1
? CLR DJL ?
? MOV R4,#(200-FOR)
FL2: CALL DEL
? DJNZ R4,FL2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_FOR: SETB DJR ;右侧电机正转子程序
? MOV R4,#FOR
FR1: CALL DEL
? DJNZ R4,FR1
? CLR DJR ?
? MOV R4,#(200-FOR)
FR2: CALL DEL
? DJNZ R4,FR2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_BACK: SETB DJZ ;中间电机反转子程序
? MOV R4,#BACK
DJZBA1: CALL DEL
? DJNZ R4,DJZBA1
? CLR DJZ ?
? MOV R4,#(200-BACK)
DJZB2: CALL DEL
? DJNZ R4,DJZB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_BACK: SETB DJL ;左侧电机反转子程序
? MOV R4,#BACK
DJLBA1: CALL DEL
? DJNZ R4,DJLBA1
? CLR DJL ?
? MOV R4,#(200-BACK)
DJLB2: CALL DEL
? DJNZ R4,DJLB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_BACK: SETB DJR ;右侧电机反转子程序
? MOV R4,#BACK
DJRBA1: CALL DEL
? DJNZ R4,DJRBA1
? CLR DJR ?
? MOV R4,#(200-BACK)
DJRB2: CALL DEL
? DJNZ R4,DJRB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_FOR: MOV R3,#5 ;机器人向前行走子程序
F1: CALL DJZ_FOR
? DJNZ R3,F1
? MOV R3,#10
F2: CALL DJR_BACK
? DJNZ R3,F2
? MOV R3,#10
F3: CALL DJL_BACK
? DJNZ R3,F3
? MOV R3,#5
F4: CALL DJZ_BACK
? DJNZ R3,F4
? MOV R3,#10
F5: CALL DJL_FOR
? DJNZ R3,F5
? MOV R3,#10
F6: CALL DJR_FOR
? DJNZ R3,F6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_BACK: MOV R3,#10 ;机器人向后行走子程序
BA1: CALL DJL_BACK
? DJNZ R3,BA1
? MOV R3,#10
BA2: CALL DJR_BACK
? DJNZ R3,BA2
? MOV R3,#5
BA4: CALL DJZ_FOR
? DJNZ R3,BA4
? MOV R3,#10
BA5: CALL DJR_FOR
? DJNZ R3,BA5
? MOV R3,#10
BA6: CALL DJL_FOR
? DJNZ R3,BA6
? MOV R3,#5
BA7: CALL DJZ_BACK
? DJNZ R3,BA7
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_L: MOV R3,#10 ;机器人左转行走子程序
GL1: CALL DJL_BACK
? DJNZ R3,GL1
? MOV R3,#5
GL2: CALL DJZ_FOR?
? DJNZ R3,GL2
? MOV R3,#10
GL3: CALL DJR_BACK
? DJNZ R3,GL3
? MOV R3,#10
GL7: CALL DJL_FOR
? DJNZ R3,GL7
? MOV R3,#5
GL4: CALL DJZ_BACK
? DJNZ R3,GL4
? MOV R3,#10
GL5: CALL DJR_FOR
? DJNZ R3,GL5?
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_R: MOV R3,#10 ;机器人右转行走子程序
GR1: CALL DJR_BACK
? DJNZ R3,GR1
? MOV R3,#5
GR2: CALL DJZ_FOR?
? DJNZ R3,GR2
? MOV R3,#10
GR3: CALL DJL_BACK
? DJNZ R3,GR3
? MOV R3,#10
GR4: CALL DJR_FOR
? DJNZ R3,GR4
? MOV R3,#5
GR5: CALL DJZ_BACK
? DJNZ R3,GR5
? MOV R3,#10
GR6: CALL DJL_FOR
? DJNZ R3,GR6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
QD: MOV R3,#5 ;机器人行走启动子程序
Q1: CALL DJZ_BACK
? DJNZ R3,Q1
? MOV R3,#5
Q2: CALL DJR_FOR
? DJNZ R3,Q2
? MOV R3,#5
Q3: CALL DJL_FOR
? DJNZ R3,Q3
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
? END


五、控制程序
; 红外遥控爬虫机器人ASM程序
;-----------------------------------------------------------------------------------------------------------------------------------------
HOME EQU 14 ;伺服马达回到中点时间常数
BACK EQU 3 ;伺服马达反转时间常数
FOR EQU 25 ;伺服马达正转时间常数
; ----------------------------------------------------------------------------------------------------------------------------------------
;遥控器按键1~6比较码
CODE_K1 EQU 19H ;机器人前进比较码
CODE_K2 EQU 18H ;机器人后退比较码
CODE_K3 EQU 0AH ;机器人左转比较码
CODE_K4 EQU 09H ;机器人右转比较码
CODE_K5 EQU 0BH ;机器人回到中点比较码
CODE_K6 EQU 14H ;机器人行走启动进比较码
; ----------------------------------------------------------------------------------------------------------------------------------------
IRCOM EQU 30H ;红外线信号解码数据放置变量起始地址
COM EQU 32H ;比较第3字节变量
; ----------------------------------------------------------------------------------------------------------------------------------------
IRIN EQU P3.2 ;红外线IR信号输入位引脚定义
WLED EQU P3.7 ;发光二极管引脚定义
SPK EQU P3.4 ;压电喇叭引脚定义
DJZ EQU P1.0 ;中间伺服马达引脚定义
DJL EQU P1.1 ;左侧伺服马达引脚定义
DJR EQU P1.2 ;右侧伺服马达引脚定义
; ----------------------------------------------------------------------------------------------------------------------------------------
?ORG 0H ;程序代码由地址0开始执行
?JMP BEGIN ;进入主程序
; ----------------------------------------------------------------------------------------------------------------------------------------
BEGIN:
CLR DJZ ;关闭中间伺服马达
 CLR DJL ;关闭左侧伺服马达
CLR DJR ;关闭右侧伺服马达
CLR SPK ;关闭压电喇叭
? CALL LED_BL ;发光二极管闪烁,表示程序开始执行
? CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_HOME ;全部伺服马达回到中点
? CALL LED_BL ;发光二极管闪烁,表示机器人准备完毕
? CALL BZ ;压电喇叭发出嘀的一声
CALL QD ;运行行走启动子程序,摆好行走姿态
SETB IRIN ;红外线信号IR输入位设为高电平,准备接收红外信号
LOOP:
?MOV R0,#IRCOM ;设置IR解码起始地址
?CALL IR_IN ;进行IR解码
CALL OP ;进行解码比较,并控制机器人动作
? JMP LOOP ;继续循环执行
; ----------------------------------------------------------------------------------------------------------------------------------------
DELAY:MOV R6,#50 ;10ms延时子程序
D1:  MOV R7,#99
? DJNZ R7,$
? DJNZ R6,D1
? DJNZ R5,DELAY
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
LED_BL: MOV R1,#4 ;发光二极管闪烁子程序
LE1: CPL WLED ;发光二极管反向
? MOV R5,#10 ?
? CALL DELAY ;进行100ms延时
? DJNZ R1,LE1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
BZ: MOV R6,#0 ;压电喇叭发声子程序
B1: SETB SPK ;压电喇叭得电,开始发声
? DJNZ R6,B1?
? MOV R5,#5
CALL DELAY ;进行50ms延时
? CLR SPK ;关闭压电喇叭
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
DEL: ;0.1ms延时子程序
? MOV R5,#1
DELAY1:
? MOV R6,#2
E1: MOV R7,#22
E2: DJNZ R7,E2
? DJNZ R6,E1
? DJNZ R5,DELAY1
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
IR_IN: ;红外解码子程序
I1: JNB IRIN,I2 ;等待红外IR信号出现
JMP I1
I2: MOV R4,#20 ;发现红外IR信号,延时一下
I20: CALL DEL
?DJNZ R4,I20
?JB IRIN,I1 ;确认红外IR信号出现
I21: JB IRIN,I3 ;等待IR变为高电平
?CALL DEL
?JMP I21
I3: MOV R3,#0 ;8位数清0
LL: JNB IRIN,I4 ;等待IR变为低电平
?CALL DEL
?JMP LL
I4: JB IRIN,I5 ;等待IR变为高电平
?CALL DEL
?JMP I4
I5: MOV R2,#0 ;0.1ms 计数
L1: CALL DEL
?JB IRIN,N1 ;等待IR变为高电平
?MOV A,#8 ;设置减数为8
?CLR C ;清除借位标志C
?SUBB A,R2 ;判断高低位
?MOV A,@R0 ;取出内存中原先数据
?RRC A ;右移指令,将借位标志C右移进入A寄存器中
? MOV @R0, A ;将数据写入内存中
? INC R3 ;处理完成一位,R3+1(R3计数)
?CJNE R3,#8, LL ;循环处理8位
?MOV R3,#0 ;R3清0
?INC R0 ;处理完成1个字节,R0+1(R0计数)
?CJNE R0,#34H, LL ;循环收集到4个字节
?JMP OK ;至完成返回
N1: INC R2 ;R2+1(R2计数)
?CJNE R2,#30, L1 ;0.1ms 计数过长,时间到自动离开
OK: RET ;完成返回
; ----------------------------------------------------------------------------------------------------------------------------------------
OP: 执行解码动作子程序
?MOV A,COM
?CJNE A,#CODE_K5, A1 ;对解码进行比较,看是否是回到中点指令,否就转至下一项比较
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
CALL GO_HOME ;执行回到中点
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
RET
A1:
?MOV A,COM
?CJNE A,#CODE_K1, A2 ;对解码进行比较,看是否是前进指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
?CALL GO_FOR ;执行前进
? RET
A2:
?MOV A,COM
?CJNE A,#CODE_K2, A3 ;对解码进行比较,看是否是后退指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_BACK ;执行后退
? RET
A3: ;L
?MOV A,COM
?CJNE A,#CODE_K3, A4 ;对解码进行比较,看是否是左转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_L ;执行左转
? RET
A4: ;R?
? MOV A,COM ?
?CJNE A,#CODE_K4, A5 ;对解码进行比较,看是否是右转指令,否就转至下一项比较
?CALL BZ ;压电喇叭发出嘀的一声
? CALL GO_R ;执行右转
?RET
A5:
MOV A,COM
CJNE A,#CODE_K6, A6 ;对解码进行比较,看是否是行走启动指令,否就转至下一项
CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? CALL QD ;执行行走启动
?CALL LED_BL ;发光二极管闪烁
CALL BZ ;压电喇叭发出嘀的一声
? RET
A6:
? RET ;返回
; ----------------------------------------------------------------------------------------------------------------------------------------
HOME1: SETB DJZ ;各伺服电机回中点控制子程序
? SETB DJL
?SETB DJR
?MOV R4,#HOME
G1: CALL DEL
?DJNZ R4,G1
?CLR DJZ
CLR DJL
?CLR DJR
?MOV R4,#(200-HOME)
G2: CALL DEL
?DJNZ R4,G2
?RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_HOME: MOV R3,#15 ;机器人回中点子程序
H1: CALL HOME1
? DJNZ R3,H1?
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_FOR: SETB DJZ ;中间电机正转子程序
? MOV R4,#FOR
FZ1: CALL DEL
? DJNZ R4,FZ1
? CLR DJZ ?
? MOV R4,#(200-FOR)
FZ2: CALL DEL
? DJNZ R4,FZ2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_FOR: SETB DJL ;左侧电机正转子程序
? MOV R4,#FOR
FL1: CALL DEL
? DJNZ R4,FL1
? CLR DJL ?
? MOV R4,#(200-FOR)
FL2: CALL DEL
? DJNZ R4,FL2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_FOR: SETB DJR ;右侧电机正转子程序
? MOV R4,#FOR
FR1: CALL DEL
? DJNZ R4,FR1
? CLR DJR ?
? MOV R4,#(200-FOR)
FR2: CALL DEL
? DJNZ R4,FR2
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJZ_BACK: SETB DJZ ;中间电机反转子程序
? MOV R4,#BACK
DJZBA1: CALL DEL
? DJNZ R4,DJZBA1
? CLR DJZ ?
? MOV R4,#(200-BACK)
DJZB2: CALL DEL
? DJNZ R4,DJZB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJL_BACK: SETB DJL ;左侧电机反转子程序
? MOV R4,#BACK
DJLBA1: CALL DEL
? DJNZ R4,DJLBA1
? CLR DJL ?
? MOV R4,#(200-BACK)
DJLB2: CALL DEL
? DJNZ R4,DJLB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
DJR_BACK: SETB DJR ;右侧电机反转子程序
? MOV R4,#BACK
DJRBA1: CALL DEL
? DJNZ R4,DJRBA1
? CLR DJR ?
? MOV R4,#(200-BACK)
DJRB2: CALL DEL
? DJNZ R4,DJRB2
? RET ?
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_FOR: MOV R3,#5 ;机器人向前行走子程序
F1: CALL DJZ_FOR
? DJNZ R3,F1
? MOV R3,#10
F2: CALL DJR_BACK
? DJNZ R3,F2
? MOV R3,#10
F3: CALL DJL_BACK
? DJNZ R3,F3
? MOV R3,#5
F4: CALL DJZ_BACK
? DJNZ R3,F4
? MOV R3,#10
F5: CALL DJL_FOR
? DJNZ R3,F5
? MOV R3,#10
F6: CALL DJR_FOR
? DJNZ R3,F6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_BACK: MOV R3,#10 ;机器人向后行走子程序
BA1: CALL DJL_BACK
? DJNZ R3,BA1
? MOV R3,#10
BA2: CALL DJR_BACK
? DJNZ R3,BA2
? MOV R3,#5
BA4: CALL DJZ_FOR
? DJNZ R3,BA4
? MOV R3,#10
BA5: CALL DJR_FOR
? DJNZ R3,BA5
? MOV R3,#10
BA6: CALL DJL_FOR
? DJNZ R3,BA6
? MOV R3,#5
BA7: CALL DJZ_BACK
? DJNZ R3,BA7
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_L: MOV R3,#10 ;机器人左转行走子程序
GL1: CALL DJL_BACK
? DJNZ R3,GL1
? MOV R3,#5
GL2: CALL DJZ_FOR?
? DJNZ R3,GL2
? MOV R3,#10
GL3: CALL DJR_BACK
? DJNZ R3,GL3
? MOV R3,#10
GL7: CALL DJL_FOR
? DJNZ R3,GL7
? MOV R3,#5
GL4: CALL DJZ_BACK
? DJNZ R3,GL4
? MOV R3,#10
GL5: CALL DJR_FOR
? DJNZ R3,GL5?
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
GO_R: MOV R3,#10 ;机器人右转行走子程序
GR1: CALL DJR_BACK
? DJNZ R3,GR1
? MOV R3,#5
GR2: CALL DJZ_FOR?
? DJNZ R3,GR2
? MOV R3,#10
GR3: CALL DJL_BACK
? DJNZ R3,GR3
? MOV R3,#10
GR4: CALL DJR_FOR
? DJNZ R3,GR4
? MOV R3,#5
GR5: CALL DJZ_BACK
? DJNZ R3,GR5
? MOV R3,#10
GR6: CALL DJL_FOR
? DJNZ R3,GR6
? RET
; ----------------------------------------------------------------------------------------------------------------------------------------
QD: MOV R3,#5 ;机器人行走启动子程序
Q1: CALL DJZ_BACK
? DJNZ R3,Q1
? MOV R3,#5
Q2: CALL DJR_FOR
? DJNZ R3,Q2
? MOV R3,#5
Q3: CALL DJL_FOR
? DJNZ R3,Q3
? RET?
; ----------------------------------------------------------------------------------------------------------------------------------------
? END




PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户461316 2008-8-23 01:10

顶起!!!!
相关推荐阅读
我要评论
1
1
关闭 站长推荐上一条 /1 下一条