1577777817075.jpg (4.69 MB, 下載次數(shù): 58)
下載附件
2020-1-2 18:09 上傳
* * 程序 名 : 超聲波HY-SRF05測距、紅外接收控制小車 * 程序功能 : 測量距離、紅外控制、自動巡航 * 備注 : 130直流電機(jī)、L298N電機(jī)驅(qū)動、HY-SRF05超聲波測距模塊、紅外收發(fā)模塊 * 作者 : 1111ADADAD *******************************************************************************/ // --頭文件聲明 --// #include<reg51.h> #include <intrins.h>
//--聲明超聲波引腳對應(yīng)--// sbit TRIG=P3^7; //TRIG是觸發(fā)信號 sbit ECHO=P3^6; //ECHO是測距的持續(xù)信號
//--聲明電機(jī)驅(qū)動引腳對應(yīng)--// sbit ZUO1 =P2^6; //左轉(zhuǎn)控制口1 sbit ZUO2 =P2^7; //左轉(zhuǎn)控制口2 sbit YOU1 =P1^3; //右轉(zhuǎn)控制口1 sbit YOU2 =P1^4; //右轉(zhuǎn)控制口2
//--聲明蜂鳴器驅(qū)動引腳對應(yīng)--// sbit BEE =P2^1; //蜂鳴器控制引腳 //--定義全局變量--// unsigned long S=0; //距離初始化 unsigned int time=0; //超聲波往返時(shí)間寄存變量 unsigned char receiveData; //用來保存紅外模塊串口接收的數(shù)據(jù) unsigned int flag=0;//運(yùn)動模式轉(zhuǎn)動方向標(biāo)志
//--聲明全局函數(shù)--// void Delay10ms(unsigned int c); //延時(shí)10ms函數(shù) void system_Ini();//定時(shí)器系統(tǒng)、中斷初始化函數(shù) void Conut(void);//距離計(jì)算函數(shù) void movemode();//選擇運(yùn)動模式 void StartModule(); //采集信號初始化函數(shù) void UsartConfiguration(); //紅外串口函數(shù) void redreceive(); //紅外遙控信息接收函數(shù) void qianjin();//控制電機(jī)前進(jìn) void houtui();//控制電機(jī)后退 void houtui3s(); //控制電機(jī)后退3s void lefturn1s(); //控制電機(jī)左轉(zhuǎn)1s void zuozhuan();//控制電機(jī)左轉(zhuǎn) void righturn1s(); //控制電機(jī)右轉(zhuǎn)1s void youzhuan();//控制電機(jī)右轉(zhuǎn) void pause(); //控制電機(jī)停止 void Bee();//蜂鳴器響一聲
/******************************************************************************* * 函 數(shù) 名 : main * 函數(shù)功能 : 主函數(shù) *******************************************************************************/ void main(void) { UsartConfiguration(); //串口函數(shù)初始化 system_Ini(); //定時(shí)器系統(tǒng)、中斷初始化 pause(); //小車停止 BEE=0; while(1) //進(jìn)入紅外控制死循環(huán) { redreceive(); //接收紅外信息 if ( receiveData == 24) //按鍵2按下 { Bee();//蜂鳴器響一聲 while( receiveData != 28 ) //當(dāng)按鍵5沒有按下時(shí),一直前進(jìn),下同 { qianjin(); //小車前進(jìn) redreceive(); //前進(jìn)的同時(shí),持續(xù)進(jìn)行是否有紅外按鍵5——停止信號輸入的掃描,下同 } pause(); //停止 Bee();//蜂鳴器響一聲 } else if( receiveData == 82) //按鍵8按下 { Bee();//蜂鳴器響一聲 while( receiveData != 28 ) { houtui(); //后退 redreceive(); } pause(); //停止 Bee();//蜂鳴器響一聲 } else if( receiveData == 8) //按鍵4按下 { Bee();//蜂鳴器響一聲 lefturn1s(); //左轉(zhuǎn)1s receiveData=0; //紅外接收變量清零 } else if( receiveData == 90) //按鍵6 { Bee();//蜂鳴器響一聲 righturn1s(); //右轉(zhuǎn)1s receiveData=0; //紅外接收變量清零 } else if (receiveData == 9) //按鍵EQ,自動巡航,遇見障礙物過近,自動左轉(zhuǎn) { Bee();//蜂鳴器響一聲 while( receiveData != 28 ) { StartModule(); //啟動采集信號初始化模塊,即進(jìn)行一次數(shù)據(jù)采集,TRIG每隔一段時(shí)間輸出一次高電平觸發(fā)信號 while(!ECHO); //當(dāng)ECHO為0時(shí)等待信號到來,TRIG發(fā)出一段大于10us的高電平后,超聲波模塊會進(jìn)行發(fā)送8段40khz周期電平 //然后檢測回波信號,回波信號脈寬與ECHO信號高電平持續(xù)時(shí)間成正比,ECHO持續(xù)時(shí)間*聲速再除以2, //結(jié)果即為距離。此時(shí)為等待RX產(chǎn)生高電平,一旦產(chǎn)生后,后面定時(shí)器即開始計(jì)數(shù), TR0=1; //打開定時(shí)器0,開啟計(jì)數(shù) while(ECHO); //當(dāng)ECHO為1時(shí)計(jì)數(shù)進(jìn)入循環(huán)等待,ECHO高電平不結(jié)束,計(jì)時(shí)不停止,一旦結(jié)束 TR0=0; //關(guān)閉定時(shí)器0,停止計(jì)數(shù) Conut(); //通過計(jì)數(shù)來的時(shí)間在距離計(jì)算函數(shù)中計(jì)算距離S movemode(); //選擇運(yùn)動模式 } pause(); //停止 } else continue; //未接收到紅外信息時(shí),繼續(xù)從頭循環(huán)等待 } } /******************************************************************************* * 函 數(shù) 名 : Delay10ms * 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)10ms *******************************************************************************/ void Delay10ms(unsigned int c) //誤差 0us { unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--); } } } /******************************************************************************* * 函 數(shù) 名 :system_Ini * 函數(shù)功能 :定時(shí)器T0系統(tǒng)/中斷初始化 /******************************************************************************/ void system_Ini(void) { TH0=0; TL0=0; TMOD=0x21; //設(shè)T0為方式1 ET0=1; //允許T0中斷 EA=1; //開啟總中斷 } /******************************************************************************* * 函 數(shù) 名 : Conut * 函數(shù)功能 : 測量超聲波距離S *******************************************************************************/ void Conut(void) { time=TH0*256+TL0; //時(shí)間等于高位信息+低位信息的和,讀取測量得到的時(shí)間,單位是微秒,是超聲波發(fā)送出去到反射回來的時(shí)間. TH0=0; TL0=0; //計(jì)算完成后,初始化定時(shí)器高低位信息 S=time*0.017; //計(jì)算超聲波距離 } /******************************************************************************* * 函 數(shù) 名 : movemode * 函數(shù)功能 : 選擇運(yùn)動模式 *******************************************************************************/ void movemode() { if(S<8) //如果距離小于8CM,則 { if(flag>=0&&flag<=2) { lefturn1s();//左轉(zhuǎn)1s flag=flag+1; } else if(flag==3||flag==7) { houtui3s();//后退3s flag=flag+1; } else if(flag>=4&&flag<=6) { righturn1s(); //右轉(zhuǎn)1s flag=flag+1; } else //標(biāo)志位清零 flag=0;
} else //如果距離大于8CM,則 { redreceive(); //接收紅外信息 qianjin(); //小車持續(xù)前進(jìn) } }
/*********************************************************** * 函 數(shù) 名 :StartModule() * 函數(shù)功能 :超聲波采集信號初始化函數(shù) /**********************************************************/ void StartModule() //啟動模塊 { TRIG = 1; //啟動一次模塊 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TRIG = 0; } /******************************************************************************* * 函 數(shù) 名 :UsartConfiguration() * 函數(shù)功能 :設(shè)置紅外接收串口 *******************************************************************************/ void UsartConfiguration() { SCON=0X50;//設(shè)置為工作方式1 TMOD=0X20;//設(shè)置計(jì)數(shù)器工作方式2 PCON=0X80;//波特率加倍 TH1=0XF3; //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800 TL1=0XF3; TR1=1;//打開計(jì)數(shù)器 } /******************************************************************************* * 函 數(shù) 名 : redreceive() * 函數(shù)功能 : 紅外接收 *******************************************************************************/ void redreceive() { if(RI == 1) //查看紅外是否接收到數(shù)據(jù),如果接受到 { receiveData = SBUF;//讀取數(shù)據(jù),存至變量receiveData RI = 0;//清除串口接收標(biāo)志位 } } /******************************************************************************* * 函 數(shù) 名 : qianjin * 函數(shù)功能 : 控制電機(jī)前進(jìn) *******************************************************************************/ void qianjin() { ZUO1=1;ZUO2=0; YOU1=1;YOU2=0; //前進(jìn) } /******************************************************************************* * 函 數(shù) 名 : houtui * 函數(shù)功能 : 控制電機(jī)后退 *******************************************************************************/ void houtui() { ZUO1=0;ZUO2=1; YOU1=0;YOU2=1; //后退 } /******************************************************************************* * 函 數(shù) 名 : houtui3s * 函數(shù)功能 : 控制電機(jī)后退3s *******************************************************************************/ void houtui3s() { unsigned char a,b,c=20; //后退3秒鐘= ZUO1=0;ZUO2=1; YOU1=0;YOU2=1; //左轉(zhuǎn) for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--) { redreceive(); } } } pause();
} /******************************************************************************* * 函 數(shù) 名 : void lefturn1s() * 函數(shù)功能 : 控制電機(jī)左轉(zhuǎn)1s *******************************************************************************/ void lefturn1s() { unsigned char a, b,c=5; ZUO1=0;ZUO2=0; YOU1=1;YOU2=0; //左轉(zhuǎn) for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--) { redreceive(); } } } pause(); } /******************************************************************************* * 函 數(shù) 名 : zuozhuan * 函數(shù)功能 : 控制電機(jī)左轉(zhuǎn) *******************************************************************************/ void zuozhuan() { ZUO1=0;ZUO2=0; YOU1=1;YOU2=0; //左轉(zhuǎn) redreceive(); }
/******************************************************************************* * 函 數(shù) 名 : void righturn1s() * 函數(shù)功能 : 控制電機(jī)右轉(zhuǎn)1s *******************************************************************************/ void righturn1s() { unsigned int a, b,c=5; //右轉(zhuǎn)1秒鐘 ZUO1=1;ZUO2=0; YOU1=0;YOU2=0; //右轉(zhuǎn) for (;c>0;c--) { for (b=38;b>0;b--) { for (a=130;a>0;a--) { redreceive(); } } } pause(); //電機(jī)停止 } /******************************************************************************* * 函 數(shù) 名 : youzhuan * 函數(shù)功能 : 控制電機(jī)右轉(zhuǎn) *******************************************************************************/ void youzhuan() { ZUO1=1;ZUO2=0; YOU1=0;YOU2=0; //右轉(zhuǎn) redreceive(); } /******************************************************************************* * 函 數(shù) 名 : pause * 函數(shù)功能 : 控制電機(jī)停止 *******************************************************************************/ void pause() { ZUO1=0;ZUO2=0; YOU1=0;YOU2=0; //電機(jī)停止 } /******************************************************************************* * 函 數(shù) 名 : Bee * 函數(shù)功能 : 蜂鳴器響一聲 *******************************************************************************/ void Bee() { BEE=1; Delay10ms(200); BEE=0; //蜂鳴器響一聲 }
|