?? 避障機(jī)器人.txt
字號(hào):
用單片機(jī)控制直流電機(jī)運(yùn)行,從而控制機(jī)器人運(yùn)動(dòng)
;我們這里只用一個(gè)傳感器來檢測(cè)前方是否有障礙物,用步進(jìn)電機(jī)不斷轉(zhuǎn)動(dòng)掃描
;本程序最大特色是用步進(jìn)電機(jī)帶動(dòng)傳感器不斷掃描,只需要一個(gè)傳感器就可以檢測(cè)各個(gè)角度是否有障礙物
;這時(shí)遇到的最大問題是啟動(dòng)的時(shí)候如何讓步進(jìn)電機(jī)轉(zhuǎn)到0度或者180度的位置(啟動(dòng)復(fù)位)
;作者:全立波
stepIndex EQU 23H ;用來控制步序
stepCount EQU 24H ;用來記錄電機(jī)轉(zhuǎn)動(dòng)步序
TCOUNT EQU 25H ;軟件計(jì)數(shù)器
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(右->左轉(zhuǎn)),PK=1(左->右轉(zhuǎn))
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
;設(shè)置定時(shí)器工作方式
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,代表前方?jīng)]有檢測(cè)到障礙物
;這個(gè)時(shí)候我們通過角位移來判定是左邊有障礙,還是右邊有障礙
JB PK,L_R
;從右->左(PK=0)
MOV A,stepCount
CJNE A,#2,Not_EQU
;右側(cè)有障礙,向左拐
LCALL LEFT_TO
AJMP LOOP
L_R:
;從左->右(PK=1)
MOV A,stepCount
CJNE A,#2,Not_EQU
;左側(cè)有障礙,向右拐
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
;中斷處理程序,這個(gè)地方用來處理電機(jī)的前后左右轉(zhuǎn)動(dòng)
ITL:
;重新設(shè)置定時(shí)時(shí)間
PUSH ACC
PUSH PSW
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
INC TCOUNT ;軟件計(jì)數(shù)器加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;這樣做比直接賦值要好,有效的防止了毛刺的產(chǎn)生
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
;步進(jìn)電機(jī)掃描范圍,先從右到左掃描(0~180),然后再?gòu)淖蟮接覓呙?180~0)
;在掃描過程中一旦發(fā)現(xiàn)障礙,單片機(jī)控制機(jī)器人做相應(yīng)轉(zhuǎn)向
;通過我的觀察該步進(jìn)電機(jī)轉(zhuǎn)動(dòng)10下走一圈
;從右->左我們規(guī)定步序(1,2)為右側(cè)發(fā)現(xiàn)障礙;步序(3,4,5)為左側(cè)發(fā)現(xiàn)障礙
;從左->右我們規(guī)定步序(3,2,1)為右側(cè)發(fā)現(xiàn)障礙,步序(5,4)為左側(cè)發(fā)現(xiàn)障礙
;剛開始啟動(dòng)電機(jī)從右往左轉(zhuǎn),當(dāng)步序到6后電機(jī)從左往右轉(zhuǎn)
rightToLeftTab:DB 11111110B,11111101B
leftToRightTab:DB 11111011B,11110111B
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -