📄 避障机器人.txt
字号:
用单片机控制直流电机运行,从而控制机器人运动
;我们这里只用一个传感器来检测前方是否有障碍物,用步进电机不断转动扫描
;本程序最大特色是用步进电机带动传感器不断扫描,只需要一个传感器就可以检测各个角度是否有障碍物
;这时遇到的最大问题是启动的时候如何让步进电机转到0度或者180度的位置(启动复位)
;作者:全立波
stepIndex EQU 23H ;用来控制步序
stepCount EQU 24H ;用来记录电机转动步序
TCOUNT EQU 25H ;软件计数器
TMRVAR EQU 61195
TCOUNTER EQU 252
PK BIT 00H
ORG 0000H
AJMP START
ORG 000BH
AJMP ITL
ORG 30H
START:
MOV SP,#5FH
ORL P1,#00001111B;逻辑或操作
;PK=0(右->左转),PK=1(左->右转)
CLR PK ;刚开始从右-->左
MOV stepIndex,#0 ;0~1
MOV stepCount,#1 ;1~5
MOV TCOUNT,#0
;SETB P2.0
;SETB P2.1
;SETB P2.2
SETB P1.4
SETB P1.5
SETB P1.6
;设置定时器工作方式
MOV TMOD,#00000001B
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
SETB EA
SETB ET0
SETB TR0
LOOP:
; MOV c,P2.2
MOV c,P1.6
JC LNEXT ;如果c=1,代表前方没有检测到障碍物
;这个时候我们通过角位移来判定是左边有障碍,还是右边有障碍
JB PK,L_R
;从右->左(PK=0)
MOV A,stepCount
CJNE A,#2,Not_EQU
;右侧有障碍,向左拐
LCALL LEFT_TO
AJMP LOOP
L_R:
;从左->右(PK=1)
MOV A,stepCount
CJNE A,#2,Not_EQU
;左侧有障碍,向右拐
LCALL RIGHT_TO
AJMP LOOP
Not_EQU:
JC SMALL
JB PK,Not_EQU_L
LCALL RIGHT_TO
AJMP LOOP
Not_EQU_L:
LCALL LEFT_TO
AJMP LOOP
SMALL:
JB PK,SMALL_L
LCALL LEFT_TO
AJMP LOOP
SMALL_L:
LCALL RIGHT_TO
AJMP LOOP
LNEXT:
;SETB P2.0
;SETB P2.1
SETB P1.4
SETB P1.5
AJMP LOOP
LEFT_TO:;朝左拐
;CLR P2.0
;SETB P2.1
CLR P1.4
SETB P1.5
RET
RIGHT_TO:;朝右拐
;SETB P2.0
;CLR P2.1
SETB P1.4
CLR P1.5
RET
;中断处理程序,这个地方用来处理电机的前后左右转动
ITL:
;重新设置定时时间
PUSH ACC
PUSH PSW
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
INC TCOUNT ;软件计数器加1
MOV A,TCOUNT
CJNE A,#TCOUNTER,D_L1
MOV TCOUNT,#0
JB PK,INT_N1
MOV DPTR,#rightToLeftTab ;PK=0(从右-->左)
AJMP INT_N2
INT_N1:
;PK=1(从左-->右)
MOV DPTR,#leftToRightTab
INT_N2:
MOV A,stepIndex
MOVC A,@A+DPTR
ORL P1,#00001111B;如果某位是0的话通过这步操作让0变成1
ANL P1,A;这样做比直接赋值要好,有效的防止了毛刺的产生
INC stepCount
MOV A,stepCount
CJNE A,#6,INT_N3
MOV stepCount,#1
MOV stepIndex,#0
JBC PK,D_L1
SETB PK
AJMP D_L1
INT_N3:
INC stepIndex
MOV A,stepIndex
CJNE A,#2,D_L1
MOV stepIndex,#0
D_L1:
POP PSW
POP ACC
RETI
;步进电机扫描范围,先从右到左扫描(0~180),然后再从左到右扫描(180~0)
;在扫描过程中一旦发现障碍,单片机控制机器人做相应转向
;通过我的观察该步进电机转动10下走一圈
;从右->左我们规定步序(1,2)为右侧发现障碍;步序(3,4,5)为左侧发现障碍
;从左->右我们规定步序(3,2,1)为右侧发现障碍,步序(5,4)为左侧发现障碍
;刚开始启动电机从右往左转,当步序到6后电机从左往右转
rightToLeftTab:DB 11111110B,11111101B
leftToRightTab:DB 11111011B,11110111B
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -