這是一個智能電動車制作資料及源程序,
03年全國大學生電子設計競賽試題。很大參考價值
一只置于軌道中間,兩只置于軌道外側,當小車脫離軌道時,即當置于中間的一只光電開關脫離軌道時,等待外面任一只檢測到黑線后,做出相應的轉向調整,直到中間的光電開關重新檢測到黑線(即回到軌道)再恢復正向行駛。現場實測表明,雖然小車在尋跡過程中有一定的左右搖擺(因為所購小車的內部結構決定了光電開光之間的距離到達不了精確計算值1厘米),但只要控制好行駛速度就可保證車身基本上接近于沿靠軌道行駛。
方案三、采用一只紅外傳感器置于小車右側并與小車前進方向呈一固定角度。
基于對C點后行車地圖中光源及障礙物尺寸、位置的分析,我們采用了從C點出發即獲得光源對行車方向的控制,在向光源行駛的過程之中檢查障礙物并做出相應的反應,這樣不僅只使用一只紅外傳感器就實現了避障,而且避免因小車自然轉彎而導致的盲目方向控制,同時為后面以最簡單直接的路線和在最短時間內駛入車庫創造了機會。
智能小車應以準確、智能見優,采用方案三。
4.尋找光源方案分析與比較
方案三、利用多只光源定位器。
在方案二所得數據的基礎上,結合光敏電阻的敏感性,只用三到五只光敏電阻就可以達到目的,只是因其對光非常敏感,所以必需為每只光敏電阻加上黑色隔離板。雖然制作有一定難度,但其能見長度和相對簡明的控制措施顯示了很大的優越性。
綜合考慮以上方案,方案三更具準確性和獨創性,故我們采用方案三。
由于本次實驗需要捍接的器件較多,各器件對于電源電流的需要極大,我們先以雙電源開始調試,發現所有的開關器件很難穩定地給單片機送正確值,只有當更換新電池或小車剛剛啟動時才會很準確,經過思考,這都是開關元件消耗電量很大的原因,一旦電池電量不足其工作將會萎靡不振,于是我們將所有開關器件劃成一個部分,由一塊電池專門供電。
在前輪PWM驅動轉向電路運行中,我們發現,電機只給一個轉向力,但保持長期轉向時,電機的轉動由于受到強行制動而處于一種相對靜止的狀態,導致PWM驅動電路產生大量的熱量,我們既利用軟件使其盡量減少長期單向轉動狀態,又在硬件上,在PWM驅動板上涂上了一層散熱膠,即使發熱,也不會燒壞PWM驅動電路。
在安裝上避障用光電開關之后,其與其它所有開關元件共用同一電源,在運行時發現三個用于尋跡用的開關元件不能全部正常工作了,據分析,避障用光電開關由于探測距離遠,功率大,很可能影響其他元件改用單一電源供電后,小車正常工作。
在所有電源開啟后,系統即進入6秒鐘倒計時狀態,6秒鐘倒計時完畢之后,有時后輪電機不能正常啟動。經分析,這是屬于正常情況,因為其啟動需要克服很大的慣性,而其電源又不能在瞬間提供很大的電流,所以就沒有動靜。此時,關掉單片機電源,再重新打開后即可進入正常狀態去正常運行。
單片機源程序如下:
- ORG 0000H
- LJMP MAIN
- ORG 0003H
- LJMP MINE_BOMB
- ORG 000BH
- LJMP TIMER
- ORG 0013H
- LJMP HUOER
- ORG 001BH
- LJMP SPEED
- ;**************************************************
- ORG 0030H
- ;**************************************************
- MINE_BOMB:
- PUSH A
- PUSH PSW
- INC 3AH
- MOV A,40H
- MOV 3BH,A
- MOV A,41H
- MOV 3CH,A
- CLR 20H.3
- SETB P3.4
- SETB P3.5
- POP PSW
- POP A
- RETI
- ;**************************************************
- TIMER:
- PUSH A
- PUSH PSW
- MOV TL0,#0F0H
- MOV TH0,#0D8H
- INC 37H
- MOV A,37H
- CJNE A,#100,TIMEREND
- ;is 1second
- IS_HUN:
- MOV 37H,#0
- ; IS C_MINE,STOP AND THAN XUAN
- JB 20H.0,QI_LAI ;THIS TIME,THE CAR IS WAITTING IN THE END,
- DEC 39H
- MOV A,39H
- CJNE A,#0H,TIMEREND
- SETB 20H.0
- LJMP TIMEREND
- QI_LAI:
- JB 20H.1,WAKE_UP
- DEC 38H
- CPL P3.4
- MOV A,38H
- CJNE A,#0H,WAKE_UP
- SETB 20H.1
- CLR P3.4
- SETB TR1
- MOV 5AH,#23
- WAKE_UP:
- INC 43H
- MOV A,43H
- CJNE A,#30,GOGOGO_DOWN
- MOV A,42H
- JZ GOGOGO_DOWN
- LJMP HOME
- GOGOGO_DOWN:
- MOV A,43H
- CJNE A,#60,TIMEREND
- MOV 43H,#0
- INC 42H
- MOV A,42H
- CJNE A,#60,TIMEREND
- MOV 42H,#0
- TIMEREND:
- POP PSW
- POP A
- RETI
- ;**************************************************
- HUOER:
- PUSH A
- PUSH PSW
- MOV A,3FH
- CLR C
- ADD A,#64 ;加上6.3毫米
- CJNE A,#100,CHECK_CM
- CHECK_CM:
- JC ADD_CM
- SUBB A,#100 ;大于10個毫米了,要作調整
- MOV 3FH,A
- INC 41H
- ADD_CM: ;厘米上要加2
- INC 41H
- INC 41H
- MOV A,41H
- CJNE A,#100,CHECK_M
- CHECK_M:
- JC HUOER_END
- SUBB A,#100 ;大于一米了,要調整一下
- MOV 41H,A
- INC 40H
- ;查看是否是兩米了,是的話就算到了B區
- MOV A,40H
- CJNE A,#2,HUOER_END
- MOV 36H,#0BH
- HUOER_END:
- POP PSW
- POP A
- RETI
- ;**************************************************
- SPEED:
- PUSH A
- PUSH PSW
- MOV TL1,#0B0H
- MOV TH1,#03CH
- INC 5BH
- MOV A,5BH
- CJNE A,5AH,SPEED_NO_EQUAL ; 5A中放了速度值,比5A大,剛置為停,小則行
- CLR P3.0 ; 等于5A了,置為停
- LJMP SP_END
- SPEED_NO_EQUAL: ; 不是5A
- JC IS_GOGOGO ; 小于5A,則向前走
- CJNE A,#40,SP_BIG_TOTAL ; 是不是比總脈沖值大
- SETB P3.0
- MOV 5BH,#0H
- LJMP SP_END
- IS_GOGOGO: ;是行,就置行
- SETB P3.0
- LJMP SP_END
- SP_BIG_TOTAL: ; 大于5A,不是40
- CLR P3.0
- JC SP_END ;比40小則是停,就不管
- MOV 5AH,#0H
- SP_END:
- POP PSW
- POP A
- RETI
- ;**************************************************
- ;**************************************************
- MAIN:
- MOV SP,#5FH
- LCALL INIT
- ; LJMP HOME;\\\\\\\\\
- SIX_SECOND:
- JB 20H.0,GO_MINE_ZEON
- MOV R1,#39H
- LCALL SETCODEALL
- LCALL OUT
- LJMP SIX_SECOND
- GO_MINE_ZEON:
- SETB TR1
- LJMP MINE_WAY
- RET
- ;**************************************************
- ;**************************************************
- INIT:
- MOV R1,#36H
- MOV R2,#34
- INIT_LOOP:
- MOV @R1,#0
- INC R1
- DJNZ R2,INIT_LOOP
- MOV 20H,#0H
- SETB 20H.1
- SETB 20H.3
- MOV 39H,#6H ;倒計時654321
- MOV 38H,#5H ;倒計時54321
- MOV 5AH,#24 ;用于車速控制
- MOV 36H,#0AH
- MOV P3,#0CH
- MOV P2,#0H
- INT_ZONE:
- LCALL SET_INT
- RET
- ;**************************************************
- SET_INT:
- MOV TMOD,#01H
- MOV TL0,#0F0H
- MOV TH0,#0D8H
- MOV TL1,#0B0H
- MOV TH1,#03CH
- SETB TR0
- CLR TR1
- SETB EA
- SETB ET0
- SETB ET1
- SETB EX0
- SETB IT0
- SETB EX1
- SETB IT1
- RET
- ;**************************************************
- SETCODEALL:;6543210
- MOV R0,#30H
- MOV R2,#6
- SETCODEALL_LOOP:
- MOV A,@R1
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV @R0,A
- INC R0
- DJNZ R2,SETCODEALL_LOOP
- RET
- ;**************************************************
- ;**************************************************
- MINE_WAY:
- LCALL TRACK
- JB 20H.3,MINE_WAY
- MOV C,P3.2 ;下面有雷,就是低
- JC MINE_WAY
- ;下面是關小燈和蜂鳴器
- CLR P3.4
- CLR P3.5
- ;看看長度是否超過4米
- MOV A,40H
- CJNE A,#4H,PASS_C
- LJMP C_POINT
- PASS_C:
- JNC C_POINT
- ;下面調用一般雷的處理方法,再返回主程序
- LCALL NORMAL_MINE
- LJMP MINE_WAY
- ;下面是到達C點了
- C_POINT:
- CLR 20H.1
- LCALL FIVE_SECOND
- SETB 20H.3
- SETB TR1
- MOV 5AH,#23
- LJMP BOLK
- RET
- ;****************************************************
- TRACK:
- MOV A,P0
- ANL A,#07H
- CJNE A,#7H,SET_TURN
- LJMP LIGHT_END
- SET_TURN:
- CJNE A,#3H,LIGHT_NEXT
- RIGHT_LIGHT: ; 看右邊的光敏元件
- CLR P2.7 ;這時就要向右轉彎了
- SETB P2.6
- LCALL TURN_DELAY
- CLR P2.6
- RET
- LIGHT_NEXT: ; 左轉了
- CJNE A,#06H,LIGHT_END
- SETB P2.7
- SETB P2.6
- LCALL TURN_DELAY
- CLR P2.6
- RET
- LIGHT_END:
- CLR P2.6
- RET
- ;****************************************************
- TURN_DELAY:
- MOV 5AH,#26
- MOV C, P0.1
- JC TURN_DELAY
- MOV A,36H
-
- CJNE A,#0AH,IS_ZONE_B
- MOV 5AH,#24
- LJMP TURN_DELAY_END
- IS_ZONE_B:
- MOV 5AH,#20
- TURN_DELAY_END:
- RET
- ;****************************************************
- NORMAL_MINE:
- CLR TR1
- CLR P2.6
- ;以下是保存雷長度
- MOV A,3CH
- ADD A,#53H
- MOV R0,A
- CLR C
- MOV A,41H
- ADD A,#100
- SUBB A,3CH
- CJNE A,#100,NORMAL_MINE_LENGTH
- NORMAL_MINE_LENGTH:
- JC NO_CHANGE
- SUBB A,#100
- NO_CHANGE:
- MOV @R0,A
- ;以下是計算中點距起點的距離
- MOV B,#2H
- DIV AB
- ADD A,3CH
- CJNE A,#100,SET_CENTER
- SET_CENTER:
- JC NO_P_WAY
- SUBB A,#100
- INC 3BH
- NO_P_WAY:
- MOV 3CH,A
- ;保存中點距離
- MOV A,3AH
- DEC A
- MOV B,#2H
- MUL AB
- MOV R0,48H
- ADD A,R0
- MOV R0,A
- MOV A,3BH
- MOV @R0,A
- INC R0
- MOV A,3CH
- MOV @R0,A
- CLR P3.0
- CLR P3.1
- CLR P2.6
- CLR TR1
- ;以下是延時顯示程序
- LCALL DELAY_MINE2
- CLR P3.1
- SETB P3.0
- SETB TR1
- SETB 20H.3
- RET
- ;****************************************************
- DELAY_MINE1:
- MOV R6,#2H
- DELAY_LOOP_MINE1:
- LCALL DELAY
- DJNZ R6,DELAY_LOOP_MINE1
- RET
- ;****************************************************
- ;****************************************************
- DELAY_MINE2:
- LCALL SET_CODE_MINE
- MOV R5,#03H
- DELAY_LOOP_MINE_F:
- MOV R6,#08FH
- DELAY_LOOP_MINE2:
- LCALL OUT
- DJNZ R6,DELAY_LOOP_MINE2
- DJNZ R5,DELAY_LOOP_MINE_F
- RET
- ;****************************************************
- SET_CODE_MINE:
- MOV A,3BH
- MOV B,#0AH
- DIV AB
- MOV 44H,A
- MOV 45H,B
- MOV A,3CH
- MOV B,#0AH
- DIV AB
- MOV 46H,A
- MOV 47H,B
- LCALL SET_CODE
- RET
- ;****************************************************
- FIVE_SECOND:
- CLR TR1
- CLR P2.6
- SETB P3.1
- SETB P3.0
- LCALL DELAY_MINE1
- CLR P3.0
- CLR P3.1
- CLR P2.6
- SETB P3.5
- SETB P3.4
- CLR TR1
- STOP_AT_C:
- MOV R1,#38H
- LCALL SETCODEALL
- JB 20H.1,C_WAKE_LE
- LCALL OUT
- LJMP STOP_AT_C
- C_WAKE_LE:
- SETB TR1
- RET
- ;****************************************************
- ;****************************************************
- BOLK:
- SETB TR1
- MOV 5AH,#20
-
- MOV R5,#05H
- FIRST_TURN_RIGHT1:
- MOV R6,#0FFH
- FIRST_TURN_RIGHT2:
- LCALL DELAY
- DJNZ R6,FIRST_TURN_RIGHT2
- DJNZ R5,FIRST_TURN_RIGHT1
-
-
- SEEK_LAMP:
- LCALL TURN_TO_LAMP
- MOV C,P0.1
- JNC HOME
- JB 20H.6,SEEK_LAMP
- MOV C,P0.6
- JC SEEK_LAMP
- AV: LCALL AVOID_WHITE_BOLK
- MOV C,P0.6
- JNC AV
- SETB 20H.6
- LJMP SEEK_LAMP
- RET
- ;******************************************************
- TURN_TO_LAMP:
- MOV C,P0.3
- JNC LOOK_RIGHT
- LCALL TURN_LEFT_MIDDLE
- RET
- LOOK_RIGHT:
- MOV C,P0.5
- MOV R6,#4FH
- FORWARDLIGHT:
- LCALL DELAY
- DJNZ R6,FORWARDLIGHT
- JNC TURN_TO_LAMP_END
- LCALL TURN_RIGHT_MIDDLE
- RET
- TURN_TO_LAMP_END:
- RET
- ;******************************************************
- ;******************************************************
- AVOID_WHITE_BOLK:
- SETB P2.7
- SETB P2.6
- MOV 5AH,#30
- MOV R6,#3FH
- AVOID_LOOP:
- LCALL DELAY
- DJNZ R6,AVOID_LOOP
- MOV C,P0.6
- JNC AVOID_WHITE_BOLK
- MOV 5AH,#23
- CLR P2.6
- RET
- ;******************************************************
- TURN_RIGHT_MIDDLE:
- MOV 5AH,#30
- TURN_RIGHT_MIDDLE_START:
- CLR P2.7
- SETB P2.6
- MOV C,P0.3
- JNC TURN_RIGHT_MIDDLE_START
- CLR P2.6
- MOV 5AH,#23
- RET
- ;******************************************************
- TURN_LEFT_MIDDLE:
- MOV 5AH,#30
- TURN_LEFT_MIDDLE_START:
- SETB P2.7
- SETB P2.6
- MOV C,P0.5
- JNC TURN_RIGHT_MIDDLE_START
- CLR P2.6
- MOV 5AH,#23H
- RET
- ;******************************************************
- DELAY:
- MOV R7,#0FFH
- DELAY_LOOP:
- DJNZ R7,DELAY_LOOP
- RET
- ;******************************************************
- ;****************************************************
- HOME:
- MOV IE,#0H
- MOV IE,#0H
- CLR P2.6
- CLR P3.0
- HOME_WAIT:
- CLR P2.6
- CLR P3.0
- SETB P3.4
- LCALL KEY_QUERY ; 查詢鍵盤
- LCALL TIP_SET_CODE ; 設置顯示值
- MOV R1,#44H
- LCALL SET_CODE
- LCALL OUT ; LED 輸出
- LJMP HOME_WAIT
- RET
- ;******************************************************
- KEY_QUERY:
- LCALL KEY
- JNC KEY_QUERY_END
- LCALL KEY
- JNC KEY_QUERY_END
- LCALL DEAL_KEY
- KEY_WA:
- LCALL KEY
- JC KEY_WA
- KEY_QUERY_END:
- RET
- RET
- ;******************************************************
- TIP_SET_CODE:
- MOV A,59H
- JZ SET_TIME
- MOV R0,#46H
- MOV B,#02H
- MUL AB
- ADD A,R0
- MOV R0,A
- SET_NUM:
- MOV A,@R0
- MOV B,#0AH
- DIV AB
- MOV 44H,A
- MOV 45H,B
- INC R0
- MOV B,#0AH
- MOV A,@R0
- DIV AB
- MOV 46H,A
- MOV 47H,B
- RET
- SET_TIME:
- MOV R0,#42H
- LJMP SET_NUM
- RET
- ;*****************************************************
- OUT:
- MOV R0,#30H
- MOV R2,#6H
- MOV R4,#0H
- LOOP:
- MOV A,@R0
- LCALL OUTPUT
- INC R0
- INC R4
- DJNZ R2,LOOP
- RET
- ;*******************************************************
- OUTPUT: ;在A中是要顯示的數據,R4中是要顯示的位
- MOV R3,#8H
- CLR P1.3
- OUT_LOOP:
- RLC A
- MOV P1.2,C
- CLR P1.4
- NOP
- NOP
- NOP
- SETB P1.4
- NOP
- NOP
- NOP
- DJNZ R3,OUT_LOOP
- OUT_LOOP_END:
- MOV P1,R4
- SETB P1.3
- LCALL DELAY
- CLR P1.3
- RET
- ;******************************************************
- SET_CODE:
- MOV R0,#44H
- MOV R1,#30H
- MOV R2,#4H
- SET_CODE_LOOP:
- MOV A,@R0
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV @R1,A
- INC R0
- INC R1
- DJNZ R2,SET_CODE_LOOP
- ;以下是顯示是第幾個雷
- MOV A,3AH
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV 35H,A
- ;以下是使一個LED為暗
- MOV 34H,#0H
- RET
- ;******************************************************
- TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
- ;*****************************************************
- KEY:
- MOV 58H,#0FEH;
- MOV R1,#4H
- KEY_LOOP:
- MOV P1,58H
- MOV A,P1
- CJNE A,58H,KEY_NEXT1
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
大賽用智能電動車制作源程序.rar
(124.43 KB, 下載次數: 14)
2019-1-17 21:48 上傳
點擊文件名下載附件
|