之前做過的紅外小車避障可以做個參考,是固定的障礙,要過障礙還是要通過算法,要自己算一下,
控制小車的運動一直是實驗室中的重點項目之一,這次我們進行的項目就是運用紅外檢測模塊對小車進行運動控制,從而讓小車達到自動前進避開障礙物的目的。此次實驗我們要用到AT89C51 單片機來控制,實現(xiàn)的目標(biāo)為讓小車自動走出迷宮以及記錄障礙物遇到的個數(shù)。
基本內(nèi)容
在一個有障礙物的區(qū)域內(nèi),小車可以自由前進,不碰撞到任何障礙物。
在行進的過程中,記錄下遇到障礙物的個數(shù)
2.?dāng)U展內(nèi)容
小車在光源的引導(dǎo)下,進入停車區(qū)到達車庫并停止
小車的行走電機由兩個H橋驅(qū)動,Q1到Q6是左邊電機的驅(qū)動電路,Q3,Q4,Q7,Q8,Q11,Q12是右邊電機的驅(qū)動電路,電路如圖所示,圖中的邏輯門電路U6A,U6B,U6C.U6D構(gòu)成了一個邏輯互鎖電路,避免H橋驅(qū)動電路中Q3與Q4同時導(dǎo)通,使得Q7,Q8,Q11,Q12全部導(dǎo)通,造成短路。其執(zhí)行時Q3的基極為高電平時,Q3導(dǎo)通Q8,Q11也導(dǎo)通,右電機反轉(zhuǎn)。當(dāng)Q4的基極為高電平時,Q4導(dǎo)通Q7,Q12也導(dǎo)通,右電機正轉(zhuǎn)。
第二節(jié) 紅外模塊介紹要保證小車在前進運動中正確地避開障礙物,至少需要三組紅外傳感器來探測障礙物是在左面還是右面或者是在前方,并且三組傳感器還要能探測到小車正前方的障礙物。為達到此要求,傳感器的使用方案如下: 在小車的正中向前的方向安裝紅外接收模塊,在小車前面朝左右方向各安裝-一 個發(fā)射模塊。安裝時要注意調(diào)整安裝位置,要確保反射回來的紅外線能被接收到,所以要調(diào)整好方位。如果三個發(fā)射模塊同時發(fā)射,接受模塊將無法區(qū)分所接收到的信號來自何方。如果我們采用時分復(fù)用的方法就可以解決這個問題,讓他們交替工作,只要交替的速度快就可以保證檢測的正確性。 L為“1”表示接收模塊接收到左面的反射信號,為“0”表示沒有 接收到反射信號R為“1”表示接收模塊接收到右面的反射信號,為“0”表示沒有接收到反射信號。程序中除了要對判斷是否有障礙外,還要對障礙物的方位做出準(zhǔn)確的判斷才能使小車做出正確的避讓。先選擇三個標(biāo)志位,用于表示前,左,右 
是否有障礙。有障礙置1,無障礙置0,最好是選擇相鄰的位,便于邏輯判斷。 左邊為紅外發(fā)射模塊電路圖,右為紅外接受電路圖。
第三章 軟件程序
第一節(jié) 流程圖編寫本系統(tǒng)采用匯編語言編程。軟件程序由主程序,PWM調(diào)速程序,紅外模塊控制程序,判斷障礙物方位程序,障礙物個數(shù)顯示程序和延時子程序組成。小車開機,檢測先進行PWM調(diào)速,在對障礙物的方位進行檢測從而對小車的運動狀態(tài)進行調(diào)整,最后在對障礙物個數(shù)進行計數(shù)并且順利走出搭建迷宮以完成實驗。實驗流程圖如下:
第二節(jié) 程序編寫PWM調(diào)速: 調(diào)用調(diào)速模塊,設(shè)置各項初值以及PWM調(diào)速的頻率,最后改變其占空比來實現(xiàn)對小車速度的控制。 控制障礙物方位; 設(shè)置一個寄存器20H,使其高五位清零,再把三個傳感器分別檢測到障礙物個數(shù)時的情況列舉出來,設(shè)置有障礙物為1沒有障礙物為0,并和20H相與,最后得到檢測障礙物方向的結(jié)論。 障礙物數(shù)目顯示: 在轉(zhuǎn)向時說明是檢測到了前方有障礙物,讓R7置1,轉(zhuǎn)向變?yōu)橹毙姓f明前方已經(jīng)沒有了障礙物,就檢測R7是否為1,如果為1,就說明有障礙物,那顯示就加一 紅外檢測: 先關(guān)閉所有發(fā)射端口,設(shè)定發(fā)送脈沖數(shù)目,然后接受寄存器清零,然后啟動第一個發(fā)射模塊,然后給延時,判斷是否接受到反射信號,接收到就脈沖數(shù)目加1,沒有就停止發(fā)射,延時,然后判斷是否發(fā)射10次,沒有就繼續(xù)啟動發(fā)射模塊重復(fù)直到10次發(fā)射完畢,然后判斷接受脈沖數(shù)目是否等于或者大于2(等于或者大于2是為了檢測更加靈敏),小于2就是沒有障礙物,等于或者大于2就是有障礙物,另外兩個模塊也是這樣。 附錄1 傳感器接口與其引腳功能
單片機源程序如下: - CCON DATA 0D8H
- CMOD DATA 0D9H
- CCAPM0 DATA 0DAH
- CCAPM1 DATA 0DBH
- CCAPM2 DATA 0DCH
- CCAPM3 DATA 0DDH
- CCAPM4 DATA 0DEH
- CL DATA 0E9H
- CCAP0L DATA 0EAH
- CCAP1L DATA 0EBH
- CCAP2L DATA 0ECH
- CCAP3L DATA 0EDH
- CCAP4L DATA 0EEH
- CH DATA 0F9H
- CCAP0H DATA 0FAH
- CCAP1H DATA 0FBH
- CCAP2H DATA 0FCH
- CCAP3H DATA 0FDH
- CCAP4H DATA 0FEH
-
- ORG 0000H
- LJMP MAIN
- ORG 0030H
-
- MAIN:
-
- MOV 20H,#00H
- LCALL PWM // PWM初始化
- N1:
-
- CLR P3.2 //關(guān)閉紅外發(fā)射端口P3.2
- CLR P3.4 //關(guān)閉紅外發(fā)射端口P3.4
- CLR P3.7 //關(guān)閉紅外發(fā)射端口P3.7
- MOV R0,#10 //設(shè)定脈沖發(fā)射數(shù)目
- MOV R1,#00 //接收寄存器清零
- LOOP0:
- SETB P3.7 //打開紅外發(fā)射端口P3.7
- LCALL DE600U //延時
- JB P2.3,LOOP1//判斷接收端口P2.3是否為1,不是則跳轉(zhuǎn)到LOOP1
- INC R1 //接收端口為1,R1加一
- LOOP1:
- CLR P3.7 //關(guān)閉紅外發(fā)射端口P3.7
- LCALL DE600U //延時
- DJNZ R0,LOOP0 //判斷R0減一是否為0不為零則跳轉(zhuǎn)到LOOP0
- CJNE R1,#2,LOOP2 //判斷R1是否等于2,不等則跳轉(zhuǎn)
- LOOP2:
-
- JC N2 //有進位、即CF=1,則跳轉(zhuǎn)N2
- SETB 02H //02H置1
- N2:
-
- CLR P3.2 //關(guān)閉紅外發(fā)射端口P3.2
- CLR P3.4 //關(guān)閉紅外發(fā)射端口P3.4
- CLR P3.7 //關(guān)閉紅外發(fā)射端口P3.7
- MOV R2,#10 //設(shè)定脈沖發(fā)射數(shù)目
- MOV R3,#00 //接收寄存器清零
- LOOP3:
- SETB P3.4 //打開紅外發(fā)射端口P3.4
- LCALL DE600U //延時
- JB P3.5,LOOP4//判斷接收端口P3.5是否為1,不是則跳轉(zhuǎn)到LOOP4
- INC R3 //接收端口為1,R3加一
- LOOP4:
- CLR P3.4 //關(guān)閉紅外發(fā)射端口P3.4
- LCALL DE600U //延時
- DJNZ R2,LOOP3 //判斷R2減一是否為0不為零則跳轉(zhuǎn)到LOOP3
- CJNE R3,#2,LOOP5 //判斷R3是否等于2,不等則跳轉(zhuǎn)到LOOP5
- LOOP5:
-
- JC MAIN1 //有進位、即CF=1,則跳轉(zhuǎn)MAIN1
- SETB 01H //01H置1
- MAIN1:
-
- CLR P3.2 //關(guān)閉紅外發(fā)射端口P3.2
- CLR P3.4 //關(guān)閉紅外發(fā)射端口P3.4
- CLR P3.7 //關(guān)閉紅外發(fā)射端口P3.7
- MOV R4,#10 //設(shè)定脈沖發(fā)射數(shù)目
- MOV R5,#00 //接收寄存器清零
- LOOP6:
- SETB P3.2 //打開紅外發(fā)射端口P3.2
- LCALL DE600U //延時
- JB P3.3,LOOP7//判斷接收端口P3.3是否為1,不是則跳轉(zhuǎn)到LOOP7
- INC R5 //接收端口為1,R5加一
- LOOP7:
- CLR P3.2 //關(guān)閉紅外發(fā)射端口P3.2
- LCALL DE600U //延時
- DJNZ R4,LOOP6 //判斷R4減一是否為0不為零則跳轉(zhuǎn)到LOOP6
- CJNE R5,#2,LOOP8 //判斷R5是否等于2,不等則跳轉(zhuǎn)到LOOP8
- LOOP8:
-
- JC PD//有進位、即CF=1,則跳轉(zhuǎn)PD
- SETB 00H //00H置1
-
- PD:
-
- ANL 20H,#07H //把20H里的值和07H相與
- MOV A,20H //把20H里的值給A
- CJNE A,#00H, PD0 //判斷A是否等于00H,不等則跳轉(zhuǎn)到PD0
- LCALL mansu //進入直行慢速子程序
- CJNE R7,#01H,SL //判斷R7是否等于01H,不等則跳轉(zhuǎn)到SL
- LCALL JSXS //進入計數(shù)顯示子程序
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- PD0:
- CJNE A,#01H,PD1 //判斷A是否等于01H,不等則跳轉(zhuǎn)到PD1
- LCALL mansu1 //進入直行慢速1子程序
- CJNE R7,#01H,SL //判斷R7是否等于01H,不等則跳轉(zhuǎn)到SL
- LCALL JSXS //進入計數(shù)顯示子程序
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- PD1:
- CJNE A,#02H,PD2 //判斷A是否等于02H,不等則跳轉(zhuǎn)到PD2
- LCALL mansu2 //進入直行慢速2子程序
- CJNE R7,#01H,SL //判斷R7是否等于01H,不等則跳轉(zhuǎn)到SL
- LCALL JSXS //進入計數(shù)顯示子程序
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- PD2:
- CJNE A,#03H,PD3 //判斷A是否等于03H,不等則跳轉(zhuǎn)到PD3
- LCALL mansu //進入直行慢速子程序
- CJNE R7,#01H,SL //判斷R7是否等于01H,不等則跳轉(zhuǎn)到SL
- LCALL JSXS //進入計數(shù)顯示子程序
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- PD3:
- CJNE A,#04H,PD4 //判斷A是否等于04H,不等則跳轉(zhuǎn)到PD4
- LCALL YZ //進入右轉(zhuǎn)子程序
- MOV R7,#01H //給R7賦值01H
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- PD4:
- CJNE A,#05H,PD5 //判斷A是否等于05H,不等則跳轉(zhuǎn)到PD5
- LCALL ZZ //進入左轉(zhuǎn)子程序
- MOV R7,#01H //給R7賦值01H
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- PD5:
- CJNE A,#06H,PD6 //判斷A是否等于06H,不等則跳轉(zhuǎn)到PD6
- LCALL YZ //進入右轉(zhuǎn)子程序
- MOV R7,#01H //給R7賦值01H
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- PD6:
- CJNE A,#07H,SL //判斷A是否等于07H,不等則跳轉(zhuǎn)到SL
- LCALL YZ //進入右轉(zhuǎn)子程序
- MOV R7,#01H //給R7賦值01H
- SL:
- LJMP MAIN //跳轉(zhuǎn)到MAIN
- DE600U: //延時子程序
- MOV 30H,#200
- K1: NOP
- DJNZ 30H,K1
- RET
- DE: //延時子程序
- MOV 33H,#10
- K4: MOV 31H,#123
- K2: MOV 32H,#200
- K3: DJNZ 32H,K3
- DJNZ 31H,K2
- DJNZ 33H,K4
- RET
- DEL3S: MOV 48H,#60
- DEL0: MOV 49H,#123
- DEL1: MOV 50H,#200
- DEL2: DJNZ 50H,DEL2
- DJNZ 49H,DEL1
- DJNZ 48H,DEL0
- RET
- ST: SETB P1.4 //小車停止程序
- SETB P1.5
- SETB P1.6
- SETB P1.7
- RET
- mansu: //前進慢速子程序
- MOV CCON,#00H
- LCALL ST
- MOV CCAPM1,#00H
- MOV CCAPM3,#00H
- MOV CCAP2H,#48
- MOV CCAPM2,#42H
- MOV CCAP4H,#30
- MOV CCAPM4,#42H
- MOV CCON,#40H
- RET
- mansu1:
- MOV CCON,#00H
- LCALL ST
- MOV CCAPM1,#00H
- MOV CCAPM3,#00H
- MOV CCAP2H,#35
- MOV CCAPM2,#42H
- MOV CCAP4H,#20
- MOV CCAPM4,#42H
- MOV CCON,#40H
- RET
- mansu2:
- MOV CCON,#00H
- LCALL ST
- MOV CCAPM1,#00H
- MOV CCAPM3,#00H
- MOV CCAP2H,#40
- MOV CCAPM2,#42H
- MOV CCAP4H,#30
- MOV CCAPM4,#42H
- MOV CCON,#40H
- RET
- YZ: //右轉(zhuǎn)子程序
- MOV CCON,#00H
- LCALL ST
- MOV CCAPM2,#00H
- MOV CCAPM3,#00H
- MOV CCAPM1,#42H
- MOV CCAP1H,#12
- MOV CCAPM4,#42H
- MOV CCAP4H,#30
- MOV CCON,#40H
- RET
- ZZ: //左轉(zhuǎn)子程序
- MOV CCON,#00H
- LCALL ST
- MOV CCAPM1,#00H
- MOV CCAPM4,#00H
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
以上資料51hei提供下載:
紅外避障小車.docx
(697.52 KB, 下載次數(shù): 20)
2020-12-24 08:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|