尋線式電腦鼠的設(shè)計_第1頁
尋線式電腦鼠的設(shè)計_第2頁
尋線式電腦鼠的設(shè)計_第3頁
尋線式電腦鼠的設(shè)計_第4頁
尋線式電腦鼠的設(shè)計_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、一、 任務(wù)和總體設(shè)計1、 任務(wù)要求要求設(shè)計一個尋線型電腦鼠,能夠在88的迷宮中搜索路徑并且根據(jù)所搜尋的路線走出最短路徑。其中迷宮由25cm的黑線組成。電腦鼠第一次進(jìn)入迷宮和返回迷宮時,可以循著黑線走到終點并記錄迷宮信息,第二次進(jìn)入迷宮時,根據(jù)第一次所記錄的迷宮信息選擇最短路徑?jīng)_刺到終點。2、 總體設(shè)計硬件部分主要由傳感器,單片機,電機所組成。傳感器采用紅外傳感器,由發(fā)射管和接收管組成,可以探測迷宮中黑線。單片機采用STC15W413AS芯片,用于編寫程序。電機由單片機產(chǎn)生的PWM以及L9110芯片進(jìn)行驅(qū)動。軟件部分主要由產(chǎn)生占空比函數(shù),電腦鼠在迷宮中搜尋路徑法則,記錄迷宮信息,測速盤計數(shù)組成。

2、電腦鼠搜尋迷宮時按照左手法則進(jìn)行搜尋,根據(jù)測速盤的計數(shù)得到迷宮坐標(biāo),用88的數(shù)組對迷宮信息進(jìn)行儲存。第一次搜尋時,對死路和走得通的路進(jìn)行標(biāo)定,第二次走時,仍然按照左手法則進(jìn)行,但不走第一次標(biāo)定的死路。由此達(dá)到在迷宮中走最短路徑的目的。二、 硬件設(shè)計1、 設(shè)計步驟設(shè)計原理圖后生成PCB板后進(jìn)行布線。根據(jù)PCB板將元件焊上。將輪子,軸,軸承以及電機,齒輪進(jìn)行組裝,調(diào)整傳感器角度。測試電路。2、主控模塊包括STC15W413AS芯片以及連接電腦的下載部分。 原理圖: STC15W413AS芯片中包括中央處理器(CPU)、程序存儲(Flash)、數(shù)據(jù)存儲器(SRAM)、定時器/計數(shù)器、掉電喚醒專用計時

3、器、I/O口、高速A/D轉(zhuǎn)換(30萬次/秒)、比較器、看門狗、高速異步串行通信端UART、CCP/PWM/PCA、高速同步串行端口SPI、片內(nèi)高精度R/C時鐘以及高可靠復(fù)位等模塊。單片機內(nèi)部結(jié)構(gòu): 管腳圖: 3、電機驅(qū)動模塊 主要運用L9110芯片和兩個74HC00芯片進(jìn)行電機驅(qū)動。 原理圖: (1)L9110:L9110 是為控制和驅(qū)動電機設(shè)計的兩通道推挽式功率放大專用集成電路器件,將分立電路集成在單片IC 之中,使外圍器件成本降低,整機可靠性提高。該芯片有兩個TTL/CMOS兼容電平的輸入,具有良好的抗干擾性;兩個輸出端能直接驅(qū)動電機的正反向運動,它具有較大的電流驅(qū)動能力,每通道能通過80

4、0mA 的持續(xù)電流,峰值電流能力可達(dá)1.5A;同時它具有較低的輸出飽和壓降;內(nèi)置的鉗位二極管能釋放感性負(fù)載的反向沖擊電流,使它在驅(qū)動繼電器、直流電機、步進(jìn)電機或開關(guān)功率管的使用上安全可靠。應(yīng)用電路:管腳圖: (2)74HC00: 該芯片是輸入端四與非門。 4、測速模塊 運用測速盤和兩個側(cè)向發(fā)射接收管。 原理圖: 實物圖: 5、傳感器模塊 運用五個LED紅外發(fā)射管和LM339和LM393芯片。 原理圖: 實物圖:(1)LM339LM393是四電壓比較器集成電路。該電路的特點如下:工作電源電壓范圍寬,單電源、雙電源均可工作,單電源: 236V,雙電源:118V;消耗電流小, Icc=1.3mA;輸

5、入失調(diào)電壓小, VIO=2mV;共模輸入電壓范圍寬, Vic=0Vcc-1.5V;輸出與TTL,DTL,MOS,CMOS 等兼容;輸出可以用開路集電極連接“或”門;采用雙列直插14 腳塑料封裝(DIP14)和微形的雙列14 腳塑料(SOP14)內(nèi)部結(jié)構(gòu):(2)LM393 與LM339類似。內(nèi)部結(jié)構(gòu):6、元件清單元件名稱數(shù)量元件名稱數(shù)量L9110100uF電容0.1uF電容104電容1N914Header5IR_LED紅外發(fā)射Header2LED紅色發(fā)光管ST256Header 2HLCD511020K電阻10K電阻2K電阻2316115172215610360R1K電阻5.1K電阻300R51

6、0R2K電位器SW-PBSTC15W413ASTL413BSGPT324BLLM339LM39374HC00干電池盒72111121151122三、 軟件設(shè)計 程序總流程圖:中斷返回中斷YYYYN結(jié)束N結(jié)束N結(jié)束N結(jié)束路口檢測路程控制行走控制紅外檢測,讀取傳感器的值迷宮檢測子程序路徑優(yōu)化子程序沖刺子程序結(jié)束是否沖刺到終點?是否檢測到終點?是否回到起點?MCU各狀態(tài)字初始化是否等待出發(fā)?開始軟件部分主要是由以下三個部分組成。(1)、電機驅(qū)動部分PWM產(chǎn)生函數(shù)驅(qū)動電機,通過調(diào)節(jié)占空比進(jìn)行調(diào)速,通過控制四個I/O口來控制電機的正反轉(zhuǎn)以及停轉(zhuǎn)。根據(jù)芯片以及PCB板控制單片機的CCP_S0,CCP_S1

7、為0X20和0X10。電腦鼠轉(zhuǎn)彎和直走時用不同速度進(jìn)行控制。同時在轉(zhuǎn)彎和直線時,采用不同的占空比調(diào)速,使得電腦鼠在行走過程中速度能在快的同時達(dá)到穩(wěn)定的效果。/-PWM初始化函數(shù)-/void PWM_Init() ACC = P_SW1;ACC &= (CCP_S0|CCP_S1);ACC |= CCP_S0;P_SW1 = ACC; CCON = 0;CL = 0;CH = 0;CMOD = 0x02;CR=1;/-調(diào)整速度函數(shù)-/void speed(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I4=d; PCA_PWM0 = 0X00;CCAP0H =

8、CCAP0L =46; CCAPM0 = 0x42;PCA_PWM1 = 0X00;CCAP1H = CCAP1L =51; CCAPM1 = 0x42;(2)、中斷產(chǎn)生部分 中斷用于測速盤測速,用兩個中斷源進(jìn)行控制,分別用于左輪計數(shù)和右輪計數(shù)。根據(jù)測速盤轉(zhuǎn)過的圈數(shù),中斷計數(shù)的數(shù)字判斷電腦鼠是否走過一格,根據(jù)走過的格子進(jìn)行坐標(biāo)的加減。/-外部中斷初始化函數(shù)-/void Exti_InterruptInit()/-INT0-/ IT0=1; EX0=1;/-INT1-/ IT1=1; EX1=1; EA=1; /所有中斷開放/-外部中斷0 左輪計數(shù)器-/void Exit0_LeftWheel(

9、) interrupt 0 EX0=0; if(left_count8;/-PWM寄存器定義-/sfr P_SW1 = 0xA2;sfr CCON = 0xD8;sbit CCF0 = CCON0;sbit CCF1 = CCON1;sbit CR = CCON6;sbit CF = CCON7;sfr CMOD = 0xD9;sfr CL = 0xE9;sfr CH = 0xF9;sfr CCAPM0 = 0xDA;sfr CCAP0L = 0xEA;sfr CCAP0H = 0XFA;sfr CCAPM1 = 0xDB;sfr CCAP1L = 0xEB;sfr CCAP1H = 0xFB

10、;sfr CCAPM2 = 0xDC;sfr CCAP2L = 0xEC;sfr CCAP2H = 0xFC;sfr PCA_PWM0 = 0xf2;sfr PCA_PWM1 = 0xf3;sfr PCA_PWM2 = 0xf4;/-PWM初始化函數(shù)-/void PWM_Init() ACC = P_SW1;ACC &= (CCP_S0|CCP_S1);ACC |= CCP_S0;P_SW1 = ACC; /CCP_S0,CCP_S10,1P3.5.CCP0_2,P3.6.CCP1_2,P3.7.CCP2_2 /其余I/O口詳見芯片手冊CCON = 0;CL = 0;CH = 0;CMOD =

11、 0x02;CR=1;/-調(diào)整函數(shù)-f_pwm=PCA_clk/256-/void speed(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I4=d; PCA_PWM0 = 0X00;CCAP0H = CCAP0L =46; /修改此處數(shù)值0255可以調(diào)節(jié)CCP2_0占空比CCAPM0 = 0x42;PCA_PWM1 = 0X00;CCAP1H = CCAP1L =51; /修改此處數(shù)值0255可以調(diào)節(jié)CCP2_1占空比zuoCCAPM1 = 0x42;void speed2(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I

12、4=d; PCA_PWM0 = 0X00;CCAP0H = CCAP0L =60; /修改此處數(shù)值0255可以調(diào)節(jié)CCP2_0占空比CCAPM0 = 0x42;PCA_PWM1 = 0X00;CCAP1H = CCAP1L =65; /修改此處數(shù)值0255可以調(diào)節(jié)CCP2_1占空比CCAPM1 = 0x42; void speed3(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I4=d; PCA_PWM0 = 0X00;CCAP0H = CCAP0L =255; /修改此處數(shù)值0255可以調(diào)節(jié)CCP2_0占空比CCAPM0 = 0x42;PCA_PWM1 =

13、 0X00;CCAP1H = CCAP1L =255; /修改此處數(shù)值0255可以調(diào)節(jié)CCP2_1占空比CCAPM1 = 0x42; /-PWM模式使能函數(shù)-/void PWM_Cmd(bit cmd) if(cmd=ENABLE) CR=1; else if(cmd=DISABLE) CR=0;/-延時函數(shù)-/void Delay(u16 count) u16 i; for(i=0;icount;i+);/-外部中斷初始化函數(shù)-/void Exti_InterruptInit()/-INT0-/ IT0=1; EX0=1;/-INT1-/ IT1=1; EX1=1; EA=1; /所有中斷開

14、放 void adjust2() if(Left_Front_Detector=0) speed(1,0,0,1); else if(Right_Front_Detector=0) speed(0,1,1,0); else speed(0,1,0,1);void Go() speed(0,1,0,1);/-小車右轉(zhuǎn)函數(shù)-/void TurnRight()/ u8 flg=1; speed2(0,1,1,0); /左輪前轉(zhuǎn),右輪后轉(zhuǎn)/ left_count=right_count=0; /* while(flg=1) if(left_count=12|right_count=12) speed(

15、0,0,0,0); /兩輪停轉(zhuǎn) left_count=0; right_count=0; flg=0; for(flg=0;flg 前 - 左 并且存儲即將行走的下一個格子的坐標(biāo)*/void LeftMethod (void) u8 leftmap,rightmap,frontmap; leftmap=GetNextGridmap(MOUSELEFT); rightmap=GetNextGridmap(MOUSERIGHT); frontmap=GetNextGridmap(MOUSEFRONT);/* if(mouselocate.cX=3&mouselocate.cY=3) /判斷當(dāng)前的坐

16、標(biāo)是否為目標(biāo)地點 comeback=1; Stop(); TurnBack(); mouseface=(mouseface+2)%4; Stop(); left_count=35; right_count=35; return;*/ if(Left_Detector=0&(leftmap&0x0f)=0x00) / 未走過的之路 if(mouseface=FACE_NORTH) mouselocate.cY+; led1=!led1; if(mouseface=FACE_SOUTH) mouselocate.cY-; led1=!led1; mouseface=(mouseface+3)%4;

17、 TurnLeft(); left_count=0; right_count=0; return; if(Front_Detector=0&(frontmap&0x0f)=0x00) / 未走過的支路 Go(); return;/直走 什么都不做if(Right_Detector=1&(rightmap&0x0f)=0x00) / 未走過的支路 if(mouseface=FACE_NORTH) mouselocate.cY+; led1=!led1; if(mouseface=FACE_SOUTH) mouselocate.cY-; led1=!led1; mouseface=(mousefa

18、ce+1)%4;/根據(jù)轉(zhuǎn)向調(diào)整絕對方向 TurnRight(); left_count=0; right_count=0; return; if(Left_Detector=1&Right_Detector=0&Front_Detector=1) TurnBack(); mouseface=(mouseface+2)%4; mapmouselocate.cXmouselocate.cY|=0x0f; /將該支路標(biāo)志為不通 left_count=0; right_count=0; return; if(Left_Detector=0) TurnLeft(); mouseface=(mousefa

19、ce+3)%4; mapmouselocate.cXmouselocate.cY|=0x0f; left_count=0; right_count=0; return; if(Front_Detector=0) mapmouselocate.cXmouselocate.cY|=0x0f; return; if(Right_Detector=1) TurnRight(); mouseface=(mouseface+1)%4;/根據(jù)轉(zhuǎn)向調(diào)整絕對方向 mapmouselocate.cXmouselocate.cY|=0x0f; left_count=0; right_count=0; return;

20、void LeftMethod2()unsigned char i; if(Left_Detector=0&Front_Detector=0&Right_Detector=1) Go();for(i=0;i4;i+) Delay(20000); if(Left_Detector=0&Front_Detector=0&Right_Detector=1) speed3(0,0,0,0);led1=0;while(Rstart_Key=1);led1=1; elseTurnLeft(); if(Left_Detector=0) TurnLeft(); else if(Front_Detector=0

21、) Go(); else if(Right_Detector=1) TurnRight(); else if(Left_Detector=1&Front_Detector=1&Right_Detector=0) TurnBack();void LeftMethod3() u8 leftmap,rightmap,frontmap;leftmap=GetNextGridmap(MOUSELEFT);rightmap=GetNextGridmap(MOUSERIGHT);frontmap=GetNextGridmap(MOUSEFRONT);if(mouselocate.cX=0&mouseloca

22、te.cY=0) /判斷當(dāng)前的坐標(biāo)是否為目標(biāo)地點 task=OVER; return; if(leftbuf=0& /左邊有支路(leftmap&0x0f)=0x0a) / 走得通的支路 TurnLeft(); mouseface=(mouseface+3)%4; return; if(frontbuf=0& / 前方有支路(frontmap&0x0f)=0x0a) / 走得通的支路 Go();return;/直走 什么都不做 if(rightbuf=1& / 右方有支路(rightmap&0x0f)=0x0a) / 走得通的支路 Stop(); TurnRight(); mouseface=

23、(mouseface+1)%4;/根據(jù)轉(zhuǎn)向調(diào)整絕對方向 return;void LeftMethod4() if(Left_Detector=0) TurnLeft(); else if(Front_Detector=0) Go(); else if(Right_Detector=1) TurnRight(); else if(Left_Detector=1&Front_Detector=1&Right_Detector=0) TurnBack();/*function name :void Dir_Trans()*param :none*return value :none*description :計算下一個到達(dá)的格子坐標(biāo) */void DirTrans()switch(mouseface) /計算下一個到達(dá)的格子坐標(biāo) case FACE_NORTH: /如果車的頭部是向北的 縱價標(biāo)加1 mouselocate.cY+; led1=!led1; break; case FACE_SOUTH: / 如果車的頭部是向南的縱坐標(biāo)減1 mouselocate.cY-; led1=!led1; break; case FACE_EAST: /如果車的頭部是向東的 橫坐標(biāo)加1 mouselocate.cX+;/ led

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論