機電一體化綜合訓(xùn)練實習(xí)總結(jié)_第1頁
機電一體化綜合訓(xùn)練實習(xí)總結(jié)_第2頁
機電一體化綜合訓(xùn)練實習(xí)總結(jié)_第3頁
機電一體化綜合訓(xùn)練實習(xí)總結(jié)_第4頁
機電一體化綜合訓(xùn)練實習(xí)總結(jié)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

機電一體化綜合訓(xùn)練實習(xí)總結(jié)一、舵機車總結(jié)1、實習(xí)任務(wù)與要求舵機車的實習(xí)任務(wù)主要是通過理解舵機運行的原理,提高自我的動手能力,編寫程序使舵機車實現(xiàn)用傳感器以探測周邊環(huán)境、基于傳感器信息作出決策、操作帶動輪子旋轉(zhuǎn)的電機控制寶貝車運動、與用戶交換信息,從而更好的掌握89C52單片機。2、總結(jié)實習(xí)內(nèi)容2.1巡航控制編程使寶貝車做一些根本的動作:向前、向后、左轉(zhuǎn)、右轉(zhuǎn)和原地旋轉(zhuǎn)。寶貝車向前走:P1_1=1;delay_nus(1300);P1_1=1;P1_0=0;delay_nus(1700);P1_0=0;delay_nms(20);寶貝車向后走:P1_1=1;delay_nus(1300);

P1_1=1;P1_0=0;delay_nus(1700);P1_0=0;delay_nms(20);寶貝車原地左轉(zhuǎn):P1_1=1;delay_nus(1300);P1_1=0;P1_0=1;delay_nus(1300);P1_0=0;delay_nms(20);寶貝車原地右轉(zhuǎn):P1_1=1;delay_nus(1700);P1_1=0;P1_0=1;delay_nus(1700);P1_0=0;delay_nms(20);2.2機器人觸覺導(dǎo)航胡須電路原理下列圖所示為胡須電路原理圖,當(dāng)胡須沒有被觸動,連接胡須的I/O管腳的電壓是5V;當(dāng)胡須被觸動時,I/O短接到地,所以I/O管腳的電壓是0V。微控制器啟動或復(fù)位時,所有的I/O插腳缺省為輸入。也就是說,連接到胡須的I/O管腳會自動作為輸入。作為輸入,如果I/O腳上的電壓為5V〔胡須沒有被觸動〕,那么其相應(yīng)的存放器中的相應(yīng)位存儲1;如果電壓為0V〔胡須被觸動〕,那么存儲0。、胡須檢測到障礙物時編程:if((P1_5state()==0)&&(P2_3state()==0))//兩個胡須同時檢測到障礙物時,后退,再向左轉(zhuǎn)180度{Back_Up();Turn_Left();

Turn_Left();}elseif(P1_5state()==0){Back_Up();Turn_Right();}elseif(P2_3state()==0)//右邊胡須檢測到障礙物時,后退,再向左轉(zhuǎn)90度{Back_Up();Turn_Left();}else //沒有胡須檢測到障礙物時,向前走Forward();對LED胡須測試電路編程:#include<uart.h>intP1.5state(void)//獲取P1.5 的狀態(tài){return(P1&0x20);}intP2.3state(void)//獲取P2.3 的狀態(tài){return(P2&0x08);}intmain(void)

{while(1){if(P1.5state()==0)

P1.0=0;P1.0=1;;if(P2.3state()==0)

P1.1=0;elseP1.1=1;delay_nms(50);}}通過胡須導(dǎo)航讓寶貝車行走,當(dāng)在其路線上遇到障礙物時,它將后退、旋轉(zhuǎn)并向另一個方向行走。編程如下:#include<BoeBot.h>

#include<uart.h>

intP1_5state(void)

{return(P1&0x20)?1:0;}intP2_2state(void){return(P2&0x08)?1:0;}voidForward(void)

{P1_1=1;delay_nus(1700);

P1_1=0;P1_0=1;delay_nus(1300);

P1_0=0;delay_nms(20);}voidLeft_Turn(void){inti;for(i=1;i<=26;i++)

{P1_1=1;delay_nus(1300);

P1_1=0;P1_0=1;delay_nus(1300);

P1_0=0;delay_nms(20);}}voidRight_Turn(void)

{inti;for(i=1;i<=26;i++)

{P1_1=1;delay_nus(1700);

P1_1=0;P1_0=1;delay_nus(1700);

P1_0=0;delay_nms(20);}}voidBackward(void)

{inti;for(i=1;i<=65;i++)

{P1_1=1;delay_nus(1300);

P1_1=0;P1_0=1;delay_nus(1700);

P1_0=0;delay_nms(20);}}intmain(void)

{uart_Init();printf("ProgramRunning!\n");

intcounter;for(counter=1;counter<=1000;counter++)//開始/復(fù)位信號

{P1_4=1;delay_nus(1000);

P1_4=0;delay_nus(1000);}while(1)

{if((P1_5state()==0)&&(P2_3state()==0))

{Backward(); //向后Left_Turn(); //向左Left_Turn(); //向左}elseif(P1_5state()==0){Backward(); //向后Right_Turn(); //向右}elseif(P2_3state()==0)

{Backward(); //向后Left_Turn(); //向左}elseForward(); //向前}}程序中,前行走中的每兩個脈沖之間檢查胡須的狀態(tài)。意味著,寶貝車在向前行走的過程中,每秒檢查障礙物大概43次。因為每個全速前進的脈沖都使得寶貝車旋轉(zhuǎn)大約半厘米。只發(fā)送一個脈沖,然后回去檢查胡須的狀態(tài)是一個好主意。每次程序從Forward()返回后,程序再次從while循環(huán)的開始處執(zhí)行,此時if…else語句會再次檢查胡須的狀態(tài)。2.3用光敏電阻進行導(dǎo)航光探測線路工作原理如下列圖所示,為光敏電阻的光探測線路。設(shè)定為輸入的I/O口實際上并不需要5V來使其輸入存放器的值為1,任何大于1.5V的電壓都會使其存放器的值為1。同樣的,I/O口也不是需要0V來使其輸入存放器的值為0,任何小于1.5V的電壓都會使其存放器的值為0。由于光敏電阻的阻值隨著光照的強弱而改變,Vo點的輸出電壓也隨之改變:當(dāng)R增大時,Vo會減小;當(dāng)R減小時,Vo會增大。Vo正是當(dāng)微控制器的I/O口作為輸入口時檢測到的電壓。如果電路連接到P1_5,當(dāng)Vo的值大于1.5V時,P1存放器的第6位為1,當(dāng)Vo的值小于1.5V時,P1存放器的第6位為0。試驗無陰影編程如下:#include<BoeBot.h>#include<uart.h>intP1_5state(void)

{return(P1&0x20)?1:0;}intP2_3state(void){return(P2&0x08)?1:0;}voidForward(void)

{P1_1=1;delay_nus(1700);

P1_1=0;P1_0=1;delay_nus(1300);

P1_0=0;delay_nms(20);}voidLeft_Turn(void){for(i=1;i<=26;i++)

{P1_1=1;delay_nus(1300);

P1_1=0;P1_0=1;delay_nus(1300);

P1_0=0;delay_nms(20);}}voidRight_Turn(void)

{for(i=1;i<=26;i++)

{P1_1=1;delay_nus(1700);

P1_1=0;P1_0=1;delay_nus(1700);

P1_0=0;delay_nms(20);}}voidBackward(void)

{for(i=1;i<=65;i++)

{P1_1=1;delay_nus(1300);

P1_1=0;P1_0=1;delay_nus(1700);

P1_0=0;delay_nms(20);}}intmain(void)

{uart_Init();printf("ProgramRunning!");for(counter=1;counter<=1000;counter++)//開始/復(fù)位信號

{P1_4=1;delay_nus(1000);P1_4=0delay_nus(1000);}while(1)

{if((P1_5state()==0)&&(P2_3state()==0))

{Backward();//向后

Left_Turn();//向左

Left_Turn();//向左

}elseif(P1_5state()==0)

{Backward();//向后Right_Turn();//向右

}elseif(P2_3state()==0)

{Backward();//向后

Left_Turn();//向左

}elseForward();//向前}}手電筒光束引導(dǎo)寶貝車測試和校正寶貝車機器人的光傳感器,使它能夠識別環(huán)境光和手電筒光束。編程使機器人跟隨指向它前方外表的手電筒光束行走。編程如下:#include<BoeBot.h>#include<uart.h>intmain(void)

{unsignedintcount;UnsignedinttimeLeft,timeRight;

uart_Init();while(1){TH0=TL0=0;TMOD=TMOD|0x01;

P1_5=0;delay_nms(300);

P1_5=1;TR0=1;while((P1&0x20)==0);count=TH0;count=count<<8;

count=count+TL0;

timeLeft=count;TH0=TL0=0;TMOD=TMOD|0x01;

P2_3=0;delay_nms(300);

P2_3=1;TR0=1;while((P2&0x08)==0);count=TH0;count=count<<8;

count=count+TL0;

timeRight=count;printf("L%dus\n",timeLeft);

printf("R%dus\n",timeRight);

delay_nms(50);}}2.4紅外線導(dǎo)航紅外探測工作原理:寶貝車機器人上建立的紅外物體探測系統(tǒng)在許多方面就像汽車的前燈。當(dāng)汽車前燈的射出的光從障礙物體反射回來時,你的眼睛發(fā)現(xiàn)障礙物體,然后你的大腦處理這些信息,并據(jù)此控制你的身體引導(dǎo)汽車。寶貝車機器人使用紅外線兩極管LED作為前燈。發(fā)射紅外光,在一些情況下,紅外線從物體反射從機器人前進的方向折回。寶貝車機器人的眼睛是紅外檢測器。紅外檢測器發(fā)出信號來說明它們是否檢測到從物體反射回的紅外線。上圖所示為紅外發(fā)射電路,編程使寶貝車探測避開障礙物,編程如下:intmain(void){bitirDetectLeft,irDetectRight;inti,counter;uart_Init();printf("ProgramRunning!\n");for(counter=1;counter<=1000;counter++)//開始/復(fù)位信號{P1_3=1;delay_nus(1000);P1_3=0;delay_nus(1000);}while(1){IRLaunch('R');irDetectRight=RightIR;//右邊接收IRLaunch('L');irDetectLeft=LeftIR;//左邊接收if((irDetectLeft==0)&&(irDetectRight==0))//兩邊同時接收到紅外線{Backward();Left_Turn();Left_Turn();}elseif(irDetectLeft==0)//只有左邊接收到紅外線{Backward();Right_Turn();}elseif(irDetectRight==0)//只有右邊接收到紅外線{Backward();Left_Turn();}elseForward();}}2.5實習(xí)過程在做舵機車的過程中,用C語言編程時,我遇到的問題是我按照電路圖接好電路好,程序一直都下載不進去,但是我檢查線路沒有發(fā)現(xiàn)有問題,最后我發(fā)現(xiàn)原來我的下載器壞了,不起作用了。換了新的下載器后,終于能正常下載了,寶貝車也能正常動作了。2.6總結(jié)通過做寶貝車這次實驗,讓我對C52單片機的編程有了進一步的掌握,而且我覺得我自己真正的把以前自己學(xué)的C語言編程與實際結(jié)合起來了。在做這次實驗的過程中,遇到問題,解決問題,不僅提高了我們的動手能力,也讓我積極的面對問題,解決問題,而不是像以前那樣手足無措了。2.7展望這次實驗讓我覺得機電一體化是真正的將機械與電子的有機結(jié)合,在實驗的過程中很好的能讓我把所學(xué)的知識加以穩(wěn)固,加深我對C51單片機的理解。我相信在不久的將來,機電系統(tǒng)的開展會讓我們的生活變得更加方便。二、直流電機小車總結(jié)1、實習(xí)任務(wù)與要求按所給的實驗圖連線,然后用C語言編寫程序,下載到C52單片機,使直流電機小車實現(xiàn)紅外尋跡、藍牙搖控、紅外遙控、超聲波避障、測速等功能。2、總結(jié)實習(xí)內(nèi)容2.1紅外尋跡紅外尋跡傳感器原理尋跡傳感器通常采用紅外的方式,紅外管發(fā)射出來的紅外光通過地面〔白色〕反射回來,在接收管里收到信號,一旦碰到黑線,那么紅外光都被吸收,接收管沒有接收到信號,從而得知傳感器是否壓線,從而調(diào)整小車運行方向。紅外尋跡編程如下:#include<AT89x51.H>#defineLeft_1_ledP3_4 //P3_4接四路尋跡模塊接口第一路輸出信號即中控板上面標(biāo)記為OUT1#defineLeft_2_ledP3_5 //P3_5接四路尋跡模塊接口第二路輸出信號即中控板上面標(biāo)記為OUT2 #defineRight_1_ledP3_6 //P3_6接四路尋跡模塊接口第三路輸出信號即中控板上面標(biāo)記為OUT3#defineRight_2_ledP3_7 //P3_7接四路尋跡模塊接口第四路輸出信號即中控板上面標(biāo)記為OUT4#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}//左邊兩個電機向前走#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個電機向后轉(zhuǎn)#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左邊兩個電機停轉(zhuǎn)#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊兩個電機向前走#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊兩個電機向前走#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊兩個電機停轉(zhuǎn)unsignedcharpwm_val_left=0;unsignedcharpush_val_left=1;//左電機占空比10/40unsignedcharpwm_val_right=0;unsignedcharpush_val_right=1;//右電機占空比10/40bitRight_moto_stop=1;bitLeft_moto_stop=1;/************************************************************************/ //延時函數(shù) voiddelay(unsignedintk){unsignedintx,y; for(x=0;x<k;x++) for(y=0;y<2000;y++);}/************************************************************************///前速前進voidrun(void){Left_moto_go; Right_moto_go;}/*********************************************************************/ /*--主函數(shù)--*/ voidmain(void){delay(100); //延時一段時間run();while(1) /*無限循環(huán)*/ {//有信號為0沒有信號為1if(Left_2_led==0&&Right_1_led==0)run();else { if(Right_1_led==1&&Left_2_led==0) //右邊檢測到黑線 { Left_moto_go; //左邊兩個電機正轉(zhuǎn) Right_moto_back; //右邊兩個電機反轉(zhuǎn)} if(Left_2_led==1&&Right_1_led==0) //左邊檢測到黑線 { Right_moto_go; //右邊兩個電機正轉(zhuǎn) Left_moto_back; //左邊兩個電機反轉(zhuǎn) }}}}2.2藍牙搖控工作原理:通過Android智能下載配套的Android軟件控制小車運行,Android用內(nèi)置藍牙與藍牙無線模塊配對,發(fā)出指令,藍牙無線模塊接收其指令。當(dāng)單片機接收到藍牙無線模塊傳來的指令,執(zhí)行相應(yīng)解碼動作,從而控制小車。用C語言編程如下:#include<AT89x51.H>#defineLeft_1_ledP3_4 //P3_2接四路尋跡模塊接口第一路輸出信號即中控板上面標(biāo)記為OUT1#defineLeft_2_ledP3_5 //P3_3接四路尋跡模塊接口第二路輸出信號即中控板上面標(biāo)記為OUT2 #defineRight_1_ledP3_6 //P3_4接四路尋跡模塊接口第三路輸出信號即中控板上面標(biāo)記為OUT3#defineRight_2_ledP3_7 //P3_5接四路尋跡模塊接口第四路輸出信號即中控板上面標(biāo)記為OUT4#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}//左邊兩個電機向前走#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個電機向后轉(zhuǎn)#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左邊兩個電機停轉(zhuǎn)#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊兩個電機向前走#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊兩個電機向前走#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊兩個電機停轉(zhuǎn)#defineleft'C'#defineright'D'#defineup'A'#definedown'B'#definestop'F'charcodestr[]="收到指令,向前!\n";charcodestr1[]="收到指令,向后!\n";charcodestr2[]="收到指令,向左!\n";charcodestr3[]="收到指令,向右!\n";charcodestr4[]="收到指令,停止!\n";bitflag_REC=0;bitflag=0;unsignedchari=0;unsignedchardat=0;unsignedcharbuff[5]=0;//接收緩沖字節(jié)/************************************************************************/ //延時函數(shù) voiddelay(unsignedintk){unsignedintx,y; for(x=0;x<k;x++) for(y=0;y<2000;y++);}/************************************************************************///字符串發(fā)送函數(shù) voidsend_str()//傳送字串{ unsignedchari=0; while(str[i]!='\0') { SBUF=str[i]; while(!TI); //等特數(shù)據(jù)傳送 TI=0; //去除數(shù)據(jù)傳送標(biāo)志 i++; //下一個字符 } } voidsend_str1()//傳送字串{ unsignedchari=0; while(str1[i]!='\0') { SBUF=str1[i]; while(!TI); //等特數(shù)據(jù)傳送 TI=0; //去除數(shù)據(jù)傳送標(biāo)志 i++; //下一個字符 } } voidsend_str2()//傳送字串{unsignedchari=0; while(str2[i]!='\0') { SBUF=str2[i]; while(!TI); //等特數(shù)據(jù)傳送 TI=0; //去除數(shù)據(jù)傳送標(biāo)志 i++; //下一個字符 } } voidsend_str3()//傳送字串{ unsignedchari=0; while(str3[i]!='\0') { SBUF=str3[i]; while(!TI); //等特數(shù)據(jù)傳送 TI=0; //去除數(shù)據(jù)傳送標(biāo)志 i++; //下一個字符 } } voidsend_str4()//傳送字串{ unsignedchari=0; while(str4[i]!='\0') { SBUF=str4[i]; while(!TI); //等特數(shù)據(jù)傳送 TI=0; //去除數(shù)據(jù)傳送標(biāo)志i++; //下一個字符 } }/************************************************************************///前速前進voidrun(void){Left_moto_go;//左電機往前走 Right_moto_go;//右電機往前走}//前速后退voidbackrun(void){Left_moto_back;//左電機往前走 Right_moto_back;//右電機往前走}//左轉(zhuǎn)voidleftrun(void){Left_moto_back;//左電機往前走 Right_moto_go;//右電機往前走}//右轉(zhuǎn)voidrightrun(void){Left_moto_go;//左電機往前走 Right_moto_back;//右電機往前走}//STOPvoidstoprun(void){Left_moto_Stop;//左電機往前走 Right_moto_Stop;//右電機往前走}/************************************************************************/voidsint()interrupt4 //中斷接收3個字節(jié){if(RI) //是否接收中斷{RI=0;dat=SBUF;if(dat=='O'&&(i==0))//接收數(shù)據(jù)第一幀{buff[i]=dat;flag=1;//開始接收數(shù)據(jù)}elseif(flag==1){i++;buff[i]=dat;if(i>=2){i=0;flag=0;flag_REC=1;}//停止接收} }}/*********************************************************************/ /*--主函數(shù)--*/ voidmain(void){ TMOD=0x20;TH1=0xFd; //11.0592M晶振,9600波特率TL1=0xFd;SCON=0x50;PCON=0x00;TR1=1; ES=1;EA=1;while(1) /*無限循環(huán)*/ { if(flag_REC==1) // { flag_REC=0; if(buff[0]=='O'&&buff[1]=='N') //第一個字節(jié)為O,第二個字節(jié)為N,第三個字節(jié)為控制碼 switch(buff[2]) { caseup: //前進 send_str(); run(); break; casedown: //后退 send_str1(); backrun(); break; caseleft: //左轉(zhuǎn) send_str2(); leftrun(); break; caseright: //右轉(zhuǎn) send_str3(); rightrun(); break; casestop: //停止 send_str4(); stoprun(); break;}} }} 2.3紅外遙控紅外遙控原理:紅外遙控的發(fā)射電路是采用紅外發(fā)光二極管來發(fā)出經(jīng)過調(diào)制的紅外光波;紅外接收電路由紅外接收二極管、三極管或硅光電池組成,它們將紅外發(fā)射器發(fā)射的紅外光轉(zhuǎn)換為相應(yīng)的電信號,再送后置放大器。發(fā)射機一般由指令鍵(或操作桿)、指令編碼系統(tǒng)、調(diào)制電路、驅(qū)動電路、發(fā)射電路等幾局部組成。當(dāng)按下指令鍵或推動操作桿時,指令編碼電路產(chǎn)生所需的指令編碼信號,指令編碼信號對載波進行調(diào)制,再由驅(qū)動電路進行功率放大后由發(fā)射電路向外發(fā)射經(jīng)調(diào)制定的指令編碼信號。接收電路一般由接收電路、放大電路、調(diào)制電路、指令譯碼電路、驅(qū)動電路、執(zhí)行電路(機構(gòu))等幾局部組成。接收電路將發(fā)射器發(fā)出的已調(diào)制的編碼指令信號接收下來,并進行放大后送解調(diào)電路,解調(diào)電路將已調(diào)制的指令編碼信號解調(diào)出來,即復(fù)原為編碼信號。指令譯碼器將編碼指令信號進行譯碼,最后由驅(qū)動電路來驅(qū)動執(zhí)行電路實現(xiàn)各種指令的操作控制〔機構(gòu)〕。紅外遙控小車原理,即紅外遙控發(fā)射出相應(yīng)編碼,被一體化接收頭復(fù)原出信號,再由單片機執(zhí)行相應(yīng)的解碼動作,從而控制小車行進。用C語言編程如下:#include<AT89x51.H>#defineLeft_1_ledP3_4 //P3_2接四路尋跡模塊接口第一路輸出信號即中控板上面標(biāo)記為OUT1#defineLeft_2_ledP3_5 //P3_3接四路尋跡模塊接口第二路輸出信號即中控板上面標(biāo)記為OUT2 #defineRight_1_ledP3_6 //P3_4接四路尋跡模塊接口第三路輸出信號即中控板上面標(biāo)記為OUT3#defineRight_2_ledP3_7 //P3_5接四路尋跡模塊接口第四路輸出信號即中控板上面標(biāo)記為OUT4#defineLeft_moto_go{P1_0=1,P1_1=0,P1_2=1,P1_3=0;}//左邊兩個電機向前走#defineLeft_moto_back{P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左邊兩個電機向后轉(zhuǎn)#defineLeft_moto_Stop{P1_0=0,P1_1=0,P1_2=0,P1_3=0;}//左邊兩個電機停轉(zhuǎn)#defineRight_moto_go{P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右邊兩個電機向前走#defineRight_moto_back{P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右邊兩個電機向后走#defineRight_moto_Stop{P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右邊兩個電機停轉(zhuǎn)#defineImax14000//此處為晶振為11.0592時的取值,#defineImin8000//如用其它頻率的晶振時,#defineInum11450//要改變相應(yīng)的取值。#defineInum2700#defineInum33000unsignedcharf=0;unsignedcharIm[4]={0x00,0x00,0x00,0x00};unsignedcharshow[2]={0,0};unsignedlongm,Tc;unsignedcharIrOK;/************************************************************************/ //延時函數(shù) voiddelay(unsignedintk){unsignedintx,y; for(x=0;x<k;x++) for(y=0;y<2000;y++);}/************************************************************************/ //外部中斷解碼程序voidintersvr1(void)interrupt2using1{Tc=TH0*256+TL0;//提取中斷時間間隔時長TH0=0;TL0=0;//定時中斷重新置零if((Tc>Imin)&&(Tc<Imax)){m=0;f=1;return;}//找到啟始碼if(f==1){if(Tc>Inum1&&Tc<Inum3){Im[m/8]=Im[m/8]>>1|0x80;m++;}if(Tc>Inum2&&Tc<Inum1){Im[m/8]=Im[m/8]>>1;m++;//取碼}if(m==32){m=0;f=0;if(Im[2]==~Im[3]){IrOK=1;}elseIrOK=0;//取碼完成后判斷讀碼是否正確}//準(zhǔn)備讀下一碼}}/************************************************************************///前速前進voidrun(void){Left_moto_go;//左電機往前走 Right_moto_go;//右電機往前走}//前速后退voidbackrun(void){Left_moto_back;//左電機往前走 Right_moto_back;//右電機往前走}//左轉(zhuǎn)voidleftrun(void){Left_moto_back;//左電機往前走 Right_moto_go;//右電機往前走}//右轉(zhuǎn)voidrightrun(void){Left_moto_go;//左電機往前走 Right_moto_back;//右電機往前走}//STOPvoidstoprun(void){Left_moto_Stop;//左電機往前走 Right_moto_Stop;//右電機往前走}/*********************************************************************/ /*--主函數(shù)--*/ voidmain(void){m=0;f=0;IT1=1;EX1=1;TMOD=0x11;TH0=0; TL0=0;TR0=1; EA=1;delay(100); while(1) /*無限循環(huán)*/ {if(IrOK==1){switch(Im[2]) {case0x0e:run(); //前進break;case0x1a:backrun(); //后退break;case0x0a:leftrun(); //左轉(zhuǎn)break; case0x1e:rightrun(); //右轉(zhuǎn)break; case0x05:stoprun(); //停止break; default:break;}IrOK=0;} }}2.4超聲波避障工作原理通過超聲波發(fā)射裝置發(fā)出超聲波,根據(jù)接收器接到超聲波時的時間差就可以知道距離了。這與雷達測距原理相似。超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時刻的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時?!渤暡ㄔ诳諝庵械膫鞑ニ俣葹?40m/s,根據(jù)計時器記錄的時間t,就可以計算出發(fā)射點距障礙物的距離(s),即:s=340t/2〕。用C語言編程如下:voidmain(void){TMOD=0X11; TH1=(65536-100)/256; //100US定時 TL1=(65536-100)%256; TH0=0; TL0=0; TR1=1;ET1=1; ET0=1; EA=1;delay(100);push_val_left=14; //舵機歸中while(1) /*無限循環(huán)*/ {if(timer>=1000) //100MS檢測啟動檢測一次 { timer=0; StartModule();//啟動檢測Conut(); //計算距離if(S<20) //距離小于20CM { stoprun(); //小車停止 COMM(); //方向函數(shù) } else if(S>30) //距離大于,30CM往前走 run(); } }}2.5測速測速原理:當(dāng)小車需要測量往駛速度,或是測量小車往駛距離時,需要用的模塊〔與碼盤一起配合使用〕。碼盤上面有一格一格的“小洞”,碼盤一般是20格,就是把360分為20小格即18度/格。配合測速模塊就可以輸出電信號,供應(yīng)單片機計數(shù),從而計算出碼盤速度與行走距離。用C語言編程如下:/*--主函數(shù)--*/ voidmain(void){TMOD=0X01;TH0=(65536-2000)/256; //2MS定時TL0=(65536-2000)%256; TR0=1; ET0=1;EX0=1; //開啟外部中斷0IT0=1; //下降沿有效 EA=1;run(); while(1) { //有信號為0沒有信號為1if(Left_2_led==0&&Right_1_led==0)run();else { if(Right_1_led==1&&Left_2_led==0) //右邊檢測到黑線 { Left_moto_go; //左邊兩個電機正轉(zhuǎn) Right_moto_back; //右邊兩個電機反轉(zhuǎn)} if(Left_2_led==1&&Right_1_led==0) //左邊檢測到黑線 {Right_moto_go; //右邊兩個電機正轉(zhuǎn) Left_moto_back; //左邊兩個電機反式開始轉(zhuǎn) } }}}2.6實習(xí)過程在做直流電機小車的過程中,在按原理圖接好線以后,我發(fā)現(xiàn)各個局部根本都可以實現(xiàn)其功能,但唯一覺得循跡這一功能很難實現(xiàn)。在確定不是接線問題后,我發(fā)現(xiàn)問題產(chǎn)生的原因是紅外傳感器的靈敏度出了問題。繼而順逆時針調(diào)節(jié)傳感器靈敏度,可經(jīng)過一下午的調(diào)節(jié)仍沒效果,后來在同學(xué)的幫助下才解決這一問題。2.7總結(jié)通過做這次直流電機小車實驗,在讀程序的過程中,發(fā)現(xiàn)自己有些語句沒有讀懂,這表達了我對C51單片機的學(xué)習(xí)還不夠完善,還不夠深入。但是這一過程讓我對機電一體化系統(tǒng)的設(shè)計產(chǎn)生濃厚的興趣。在做實驗的過程中,我覺得所設(shè)計的直流電機小車的尋跡并不是很精確,只要傳感器的精度稍微不準(zhǔn)確,就會產(chǎn)生很大的偏差。2.8展望在做完直流電機這一實驗以后,我覺得收獲很大,不僅穩(wěn)固了知識,也對機電一體化系統(tǒng)有了更深入的學(xué)習(xí)。對于直流電機小車的設(shè)計,我覺得如果能夠?qū)ほE這一功能設(shè)計的更準(zhǔn)確那就將會更好。三、步進電機小車總結(jié)1、實習(xí)任務(wù)與要求要求會連接電路圖,編寫程序使步進電機小車實現(xiàn)前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、紅外避障、紅外尋跡等功能。2、實習(xí)內(nèi)容步進電機工作原理步進電動機是一種將電脈沖信號轉(zhuǎn)換成角位移或線位移的機電元件。步進電動機的輸入量是脈沖序列,輸出量那么為相應(yīng)的增量位移或步進運動。正常運動情況下,它每轉(zhuǎn)一周具有固定的步數(shù);做連續(xù)步進運動時,其旋轉(zhuǎn)轉(zhuǎn)速與輸入脈沖的頻率保持嚴(yán)格的對應(yīng)關(guān)系,不受電壓波動和負載變化的影響。由于步進電動機能直接接受數(shù)字量的控制,所以特別適宜采用微機進行控制。

2.1步進電機小車動作步進電機小車前進C語言編程如下:voidmain(void){delay(10);timer1_init(); while(1) { move_left(10,0,1); move_right(10,1,1); }}voidtimer1_serve()interrupt3{ TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; if(n==speed) { clk_left=~clk_left; clk_right=~clk_right; n=0; }}步進電機小車后退C語言編程如下:voidmain(void){delay(10);timer1_init(); while(1){ move_left(10,1,1); move_right(10,0,1); }}voidtimer1_serve()interrupt3{ TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; if(n==speed) { clk_left=~clk_left; clk_right=~clk_right; n=0; }}步進電機小車左轉(zhuǎn)C語言編程如下:voidmain(void){delay(10);timer1_init(); while(1) { move_left(10,1,1); move_right(10,1,1); delay(200);//可以通過延時時間控制轉(zhuǎn)彎角度. stop(); while(1); }}voidstop(){ TR1=0;}voidtimer1_serve()interrupt3{ TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; if(n==speed) { clk_left=~clk_left; clk_right=~clk_right; n=0; }}步進電機小車右轉(zhuǎn)C語言編程如下:voidmain(void){delay(10);timer1_init(); while(1) { move_left(10,0,1); move_right(10,0,1); delay(200);//可以通過延時時間控制轉(zhuǎn)彎角度. stop();while(1); }}voidstop(){ TR1=0;}voidtimer1_serve()interrupt3{ TH1=(65536-100)/256; TL1=(65536-100)%256; n=n+1; if(n==speed) { clk_left=~clk_left; clk_right=~clk_right; n=0; }}2.2紅外避障功能工作原理在一定范圍內(nèi),如果沒有障礙物,發(fā)射出去的紅外線,因為傳播距離越遠而逐漸減弱,最后消失。如果有障礙物,紅外線遇到障礙物,被反射到達傳感器接收頭。傳感器檢測到這一信號就可以確認正前方有障礙物,并送給單片機,單片機進行一系列的處理分析,協(xié)調(diào)小車兩輪工作,躲避障礙物動作。C語言編程如下:voidmain(void){delay(10);timer1_init(); while(1) { if(ir_left==0&&ir_mid==0&&ir_right==0)//以下是三個紅外傳感器的八種狀態(tài)和對應(yīng)的運動方式 { move_left(15,0,1); move_right(15,0,1); delay(800); } if(ir_left==0&&ir_mid==0&&ir_right==1) { move_left(15,0,1); move_right(15,0,1); delay(400); } if(ir_left==0&&ir_mid==1&&ir_right==0) { move_left(15,0,1); move_right(15,0,1); delay(800); } if(ir_left==0&&ir_mid==1&&ir_right==1) { move_left(15,0,1); move_right(15,0,1); delay(400); } if(ir_left==1&&ir_mid==0&&ir_right==0) { move_left(15,1,1); move_right(15,1,1); delay(400); } if(ir_left==1&&ir_mid==0&&ir_right==1) { move_left(15,0,1); move_right(15,0,1); delay(800); } if(ir_left==1&&ir_mid==1&&ir_right==0) { move_left(15,1,1); move_right(15,1,1); delay

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論