智能小車(chē)循跡避障紅外遙控C語(yǔ)言代碼特制材料
《智能小車(chē)循跡避障紅外遙控C語(yǔ)言代碼特制材料》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《智能小車(chē)循跡避障紅外遙控C語(yǔ)言代碼特制材料(13頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、
//智能小車(chē)避障、循跡、紅外遙控C語(yǔ)言代碼
//實(shí)現(xiàn)功能有超聲波避障,紅外遙控智能小車(chē),紅外傳感器實(shí)現(xiàn)小車(chē)自動(dòng)循跡,1602顯示小車(chē)的工作狀態(tài),另有三個(gè)獨(dú)立按鍵分別控制三種狀態(tài)的轉(zhuǎn)換
//注:每個(gè)小車(chē)的引腳配置都不一樣,要注意引腳的配置,但是我的代碼注釋比較多,看起來(lái)比較容易一點(diǎn)
#include
2、 ENCHAR_PuZh1[8]=" run ";//1602顯示數(shù)組 uchar ENCHAR_PuZh2[8]=" back "; uchar ENCHAR_PuZh3[8]=" stop "; uchar ENCHAR_PuZh4[8]=" left "; uchar ENCHAR_PuZh5[8]=" right "; uchar ENCHAR_PuZh6[8]=" xunji "; uchar ENCHAR_PuZh7[8]=" bizhang"; uchar ENCHAR_PuZh8[8]=" yaokong"; #define HW
3、 P2 //紅外傳感器引腳配置P2k口 #define PWM P1 /* L298N管腳定義 */ /****************************** 超聲波引腳控制 ******************************/ sbit ECHO=P3^2; //超聲波接收引腳定義 兼紅外遙控按鍵 state_total =2 sbit TRIG=P3^3; //超聲波發(fā)送引腳定義 /////紅外控制引腳配置 sbit KEY2=P
4、3^7; //紅外接收器數(shù)據(jù)線(xiàn) 兼循跡按鍵state_total= 0 sbit KEY1=P3^4; //獨(dú)立按鍵p3.4控制 自動(dòng)避障 state_total=1 uchar state_total=3,state_2=0;//總狀態(tài)控制全局變量 0為自動(dòng)循跡模塊1為自動(dòng)避障模塊2為紅外遙控 uchar state_1,DAT; //紅外掃描標(biāo)志位 uchar time_1=0,time_2=0;//定時(shí)器1中斷全局變量time_ 2控制PWM脈沖計(jì)數(shù) time_1控制轉(zhuǎn)彎延時(shí)計(jì)數(shù)也做延時(shí)一次
5、0.005s uchar time,timeH,timeL,state=0;//超聲波測(cè)量緩沖變量 state為超聲波狀態(tài)檢測(cè)控制全局變量 uint count=0; //1602顯示計(jì)數(shù) /**************************/ unsigned char IRCOM[7]; //紅外接收頭接收數(shù)據(jù)緩存 IRCOM[2]存放的為數(shù)據(jù) unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; //紅外接收緩存變量 /***********/ void
6、 IRdelay(char x); //x*0.14MS 紅外頭專(zhuān)用delay void run(); void back(); void stop(); void left_90(); void left_180(); void right_90(); void delay(uint dat); // void init_test(); void delay_100ms(uint ms) ; void display(uchar temp); //超聲波顯示 驅(qū)動(dòng) void bizhang_t
7、est(); void xunji_test(); void hongwai_test(); void Delay10ms(void); void init_test()//定時(shí)器0 1 外部中斷0 1 延時(shí)初始化 { TMOD=0x11; //設(shè)置定時(shí)器0 1 工作方式1 16位初值定時(shí)器 TH1=0Xfe; //裝入初值定時(shí)一次為0.0005s 2000hz TL1=0x0c; TF0=0; //定時(shí)器0方式1計(jì)數(shù)溢出標(biāo)志 TF1=0; //定時(shí)器1方式1計(jì)
8、數(shù)溢出標(biāo)志 ET0=1; //允許定時(shí)器0中斷溢出 ET1=1; //允許定時(shí)器1中斷溢出 EA=1; //開(kāi)總中斷 if(state_total==1)//為超聲波模塊時(shí)初始化 { TRIG=0; //發(fā)射引腳低電平 ECHO=0; // 接收引腳低電平 EX0=0; //關(guān)閉外部中斷 IT0=1; //由高電平變低電平,觸發(fā)外部中斷0 } if(s
9、tate_total==2) //紅外遙控初始化 { IT1=1; //外部中斷1為負(fù)跳變觸發(fā) EX1=1; //允許外部中斷1 TRIG=1; // 3.3為高電平I/O口初始化 } delay(60); //等待硬件操作 } void main() { uint i; delay(50); init_test(); TR1=1; //開(kāi)啟定時(shí)器1 LCD1602_Init() ; delay(50); while(s
10、tate_2==0) { if(KEY1==0) //檢測(cè)按鍵s1是否按下 { Delay10ms(); //消除抖動(dòng) if(KEY1==0) { state_total=0; //總狀態(tài)定義 0為自動(dòng)循跡模塊 1為自動(dòng)避障模塊 2為紅外遙控 while((i<30)&&(KEY1==0)) //檢測(cè)按鍵是否松開(kāi) { Delay10ms(); i++; } i=0; } } if(TRIG==0) //檢
11、測(cè)按鍵s2是否按下 { Delay10ms(); //消除抖動(dòng) if(TRIG==0) { state_total=1; //總狀態(tài)定義 0為自動(dòng)循跡模塊 1為自動(dòng)避障模塊 2為紅外遙控 while((i<30)&&(TRIG==0)) //檢測(cè)按鍵是否松開(kāi) { Delay10ms(); i++; } i=0; } } if(KEY2==0) //檢測(cè)按鍵s3是否按下 { Delay10ms(); //消除抖動(dòng)
12、 if(KEY2==0) { state_total=2; //總狀態(tài)定義 0為自動(dòng)循跡模塊 1為自動(dòng)避障模塊 2為紅外遙控 while((i<30)&&(KEY2==0)) //檢測(cè)按鍵是否松開(kāi) { Delay10ms(); i++; } i=0; } } } init_test(); delay(50); //等待硬件操作 50us TR1=0; //關(guān)閉定時(shí)器1 if(s
13、tate_total==1) { //SPEED=90; //自動(dòng)循跡速度控制 高電平持續(xù)次數(shù) 占空比為10的低電平 bizhang_test(); } if(state_total==0) { // SPEED=98; //自動(dòng)循跡速度控制 高電平持續(xù)次數(shù) 占空比為40的低電平 xunji_test(); } if(state_total==2) { //SPEED=98; //自動(dòng)循跡速度控制
14、 高電平持續(xù)次數(shù) 占空比為40的低電平 hongwai_test(); } } void init0_suspend(void) interrupt 0 //3 為定時(shí)器1的中斷號(hào) 1 定時(shí)器0的中斷號(hào) 0 外部中斷1 2 外部中斷0 4 串口中斷 { timeH=TH0; //記錄高電平次數(shù) timeL=TL0; // state=1; //標(biāo)志狀態(tài)為1,表示已接收到返回信號(hào) EX0=0; //關(guān)閉外部中斷0 }
15、 void time0_suspend0(void) interrupt 1 //3 為定時(shí)器1的中斷號(hào) 1 定時(shí)器0的中斷號(hào) 0 外部中斷1 2 外部中斷0 4 串口中斷 { if(state_total==1) // 自動(dòng)避障初值裝入 { TH0=0X00; //裝入初值 TL0=0x00; } if(state_total==0) //自動(dòng)循跡初值裝入 { TH0=0Xec; //裝入初值 定
16、時(shí)一次0.005s 200hz TL0=0x78; time_1++; //控制轉(zhuǎn)彎延時(shí)計(jì)數(shù) } } void IR_IN(void) interrupt 2 { unsigned char j,k,N=0; EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return; } //確認(rèn)IR信號(hào)出現(xiàn) while (!TRIG)
17、 //等IR變?yōu)楦唠娖剑^(guò)9ms的前導(dǎo)低電平信號(hào)。 {IRdelay(1);} for (j=0;j<4;j++) //收集四組數(shù)據(jù) { for (k=0;k<8;k++) //每組數(shù)據(jù)有8位 { while (TRIG) //等 IR 變?yōu)榈碗娖?,跳過(guò)4.5ms的前導(dǎo)高電平信號(hào)。 {IRdelay(1);} while (!TRIG) //等 IR 變?yōu)楦唠娖? {IRdelay(1);} while (TRIG)
18、 //計(jì)算IR高電平時(shí)長(zhǎng) { IRdelay(1); N++; if(N>=30) {EX1=1; return;} //0.14ms計(jì)數(shù)過(guò)長(zhǎng)自動(dòng)離開(kāi)。 } //高電平計(jì)數(shù)完畢 IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0” if (N>=8) {IRCOM[j] = IRCOM[j]
19、 | 0x80;} //數(shù)據(jù)最高位補(bǔ)“1” N=0; }//end for k }//end for j if(IRCOM[2]!=~IRCOM[3]) //判斷數(shù)據(jù)碼與數(shù)據(jù)反碼是否正確 真確返回 { EX1=1; return; } EX1 = 1; } void time1_suspend1(void) interrupt 3 //3 為定時(shí)器1的中斷號(hào) 1 定時(shí)器0的中斷號(hào) 0 外部中斷1 2 外部中斷0 4 串口中斷 { T
20、H1=0Xec; //裝入初值定時(shí)一次為0.0005s 2000hz TL1=0x78; time_2++; //控制PWM 脈沖計(jì)數(shù) if(state_total!=3) //判斷進(jìn)入按鍵是否按下 進(jìn)入狀態(tài)1 避障 或者 0 循跡 { state_2=1; //退出按鍵判斷 } /* if(time_2>100) { time_2=0; } else if(time_2<=SPEED) {
21、 PWM_g; //頻率為2000hz的占空比為高電平的方波 } else { PWM_l; //為低電平 } */ } void IRdelay(unsigned char x) //x*0.14MS用于紅外遙控 { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } void Delay10ms(void) //用于按鍵檢測(cè)誤差 { unsigned char a,b,c;
22、 for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); } void delay(uint dat) //延時(shí)函數(shù)用于初始化 { uint i; for(i=dat;i>0;i--) { _nop_(); } } void delay_100ms(uint ms) //延時(shí)函數(shù)用于超聲波 { uint i,j; for(i=ms;i>0;i--) for(j=200;j>0;j--)
23、{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } //小車(chē)前進(jìn) void run(void) { PWM=0X56; } //小車(chē)后退 void back(void) { PWM=0XA9; TR1=1; time_2=0; while(time_2<=100); //延時(shí)0.2s TR1=0; } //小車(chē)停止 void stop(void) { PWM=0X00; }
24、 //小車(chē)左轉(zhuǎn)180 void left_180() { //PWM=0X59; //左兩輪反轉(zhuǎn),右兩輪正轉(zhuǎn) PWM=0X50; //右兩輪正轉(zhuǎn) TR1=1; time_2=0; while(time_2<=150); //延時(shí)0.2s time_2=0; while(time_2<=150); //延時(shí)0.2s } //小車(chē)左轉(zhuǎn) 90 void left_90(void) { PWM=0X59; //左兩輪反轉(zhuǎn),右兩輪正轉(zhuǎn) //PWM=0X5
25、0; //右兩輪正轉(zhuǎn) TR0=1; time_1=0; while(time_1<=20); //延時(shí)0.2s TR0=0; } //小車(chē)左轉(zhuǎn) 120 void left_120(void) { PWM=0X59; //左兩輪反轉(zhuǎn),右兩輪正轉(zhuǎn) // PWM=0X50; //右兩輪正轉(zhuǎn) TR0=1; time_1=0; while(time_1<=60); //延時(shí)0.4s TR0=0; } //小車(chē)右轉(zhuǎn) 90 void right_90(void) {
26、 PWM=0XA6; //左兩輪正轉(zhuǎn) 右兩輪反轉(zhuǎn) //PWM=0X06; //左兩輪正轉(zhuǎn) TR0=1; time_1=0; while(time_1<=20); //延時(shí)0.2s TR0=0; } //小車(chē)右轉(zhuǎn) 120 void right_120(void) { PWM=0XA6; //左兩輪正轉(zhuǎn) 右兩輪反轉(zhuǎn) // PWM=0X06; //左兩輪正轉(zhuǎn) TR0=1; time_1=0; while(time_1<=60);
27、//延時(shí)0.4s TR0=0; } /************************************ 自動(dòng)避障模塊 ************************************/ void display(uchar temp) //判斷障礙距離小車(chē)的距離,左轉(zhuǎn)180,前進(jìn),峰呤器報(bào)警1602顯示 { uint ge,shi,bai,i; if((temp<=20)&&(temp>2)) //小于15厘米 小車(chē)后退 再左轉(zhuǎn) { back
28、(); left_180(); } if(count>=20) {bai=temp/100; //1602顯示數(shù)據(jù) date_data[5]=bai; shi=(temp%100)/10; date_data [6]=shi; ge=temp%100%10; date_data[7]=ge; for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(date_data[i]+48); }
29、 count=0; } } void bizhang_test() { int i,j=0; uchar distance_dat; delay(50); for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh7[i]); } while(1) { run(); EA=0; //關(guān)總中斷 TRIG
30、=1; // 發(fā)射20us脈沖信號(hào) delay(30); TRIG=0; while(ECHO==0); //等待接收信號(hào) state=0; //標(biāo)志清零 EA=1; //開(kāi)總中斷 EX0=1; //打開(kāi)外部中斷0 P3.2外部中斷0引腳 此時(shí)為高電平 TH0=0x00; //定時(shí)器0 初值 TL0=0x00; TF0=0; // 定時(shí)器0方式1計(jì)數(shù)溢出標(biāo)志 TR0=1;
31、 // 定時(shí)器0方式1啟動(dòng)定時(shí)器1 while(state!=1); EX0=0; // 關(guān)閉外部中斷0 TR0=0; // 關(guān)閉定時(shí)器0中斷 TF0=0; // 定時(shí)器1方式1計(jì)數(shù)溢出標(biāo)志 if(state==1) //檢測(cè)到障礙物計(jì)算離障礙物的距離 { time=(timeH*4.352+timeL*0.017); //設(shè)定超聲波的速度為340m/s 定時(shí)計(jì)數(shù)一次1us distance_
32、dat=time; } else //未檢測(cè)到障礙物 無(wú)返回信號(hào) { distance_dat=0; } distance[j]=distance_dat; j++; if(j==3) { if(distance[0]>distance[1]) {} else { distance[0]=distance[1]; } if(distance[
33、0]>distance[2]) {} else { distance[0]=distance[2]; } if(distance[0]>distance[3]) {} else { distance[0]=distance[3]; } distance_dat=distance[0]; j=0; display(distance_dat); } count++; } } void
34、xunji_test() { int i; delay(50); for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh6[i]); } while(1) { // delay(10); state_1=HW; DAT=state_1&(0x0f); //判斷低4位的狀態(tài) 每隔5ms檢測(cè)一次 switch(DAT) { case 0x00: run();
35、 break; case 0x01: right_120(); break; case 0x02: right_90(); break; case 0x04: left_90(); break; case 0x06: run(); break; case 0x03: right_120(); break; case 0x08: left_120(); break; case 0x0c: left_120(); break; default:
36、 run(); break; } } } void hongwai_test() { int i; delay(60); for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh8[i]); } // TR1=1; while(1) { Number=IRCOM[2]; switch(Number) { case 0x18:
37、 PWM=0X56; //前進(jìn) for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh1[i]); } break; case 0x08: PWM=0X50; //右兩輪正轉(zhuǎn) 左轉(zhuǎn) for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh4[i]);
38、 } break; case 0x1c: PWM=0X00; for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh3[i]); } break; case 0x5a: PWM=0X06; //左兩輪正轉(zhuǎn) 右轉(zhuǎn) for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh5[i]); } break; case 0x52: PWM=0XA9; //后退 for(i=0;i<8;i++) { LCD1602_WriteCom(0x80+i); LCD1602_WriteData(ENCHAR_PuZh2[i]); } break; default:break; }//display(IRCOM[2]); } } 13 clb借鑒
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專(zhuān)升本計(jì)算機(jī)基礎(chǔ)真題-2
- 中學(xué)班長(zhǎng)競(jìng)選演講稿
- 某公司工作保證書(shū)
- 教育強(qiáng)國(guó)建設(shè)規(guī)劃綱要(2024—2035年)要點(diǎn)解讀(教育是強(qiáng)國(guó)建設(shè)民族復(fù)興之基)
- 小學(xué)英語(yǔ)量詞用法詳解
- 四篇:2024年度民主生活會(huì)召開(kāi)情況總結(jié)報(bào)告匯編
- 閥門(mén)主體材料
- 蝸桿傳動(dòng)的效率、潤(rùn)滑和熱平衡計(jì)算
- XX地區(qū)水利部門(mén)述職報(bào)告工作挑戰(zhàn)與應(yīng)對(duì)
- 初中語(yǔ)文散文閱讀基礎(chǔ)知識(shí)點(diǎn)+經(jīng)典例題解析
- 專(zhuān)升本英語(yǔ):??紕?dòng)詞搭配
- 21-01《中國(guó)近代文學(xué)史》自學(xué)考試題及答案
- 某公司元旦主題教育活動(dòng)方案模板
- 廉潔過(guò)春節(jié)清風(fēng)迎新村緊繃紀(jì)律弦廉潔過(guò)春節(jié)把好廉潔關(guān)過(guò)個(gè)廉潔年
- 小學(xué)英語(yǔ)實(shí)用口語(yǔ)100句