標(biāo)題: 單片機(jī)超聲波紅外接收控制小車程序 測(cè)量距離、紅外控制、自動(dòng)巡航 [打印本頁(yè)]
作者: 1111DADADA 時(shí)間: 2020-1-2 18:15
標(biāo)題: 單片機(jī)超聲波紅外接收控制小車程序 測(cè)量距離、紅外控制、自動(dòng)巡航
1577777817075.jpg (4.69 MB, 下載次數(shù): 58)
下載附件
2020-1-2 18:09 上傳
*
* 程序 名 : 超聲波HY-SRF05測(cè)距、紅外接收控制小車
* 程序功能 : 測(cè)量距離、紅外控制、自動(dòng)巡航
* 備注 : 130直流電機(jī)、L298N電機(jī)驅(qū)動(dòng)、HY-SRF05超聲波測(cè)距模塊、紅外收發(fā)模塊
* 作者 : 1111ADADAD
*******************************************************************************/
// --頭文件聲明 --//
#include<reg51.h>
#include <intrins.h>
//--聲明超聲波引腳對(duì)應(yīng)--//
sbit TRIG=P3^7; //TRIG是觸發(fā)信號(hào)
sbit ECHO=P3^6; //ECHO是測(cè)距的持續(xù)信號(hào)
//--聲明電機(jī)驅(qū)動(dòng)引腳對(duì)應(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ū)動(dòng)引腳對(duì)應(yīng)--//
sbit BEE =P2^1; //蜂鳴器控制引腳
//--定義全局變量--//
unsigned long S=0; //距離初始化
unsigned int time=0; //超聲波往返時(shí)間寄存變量
unsigned char receiveData; //用來(lái)保存紅外模塊串口接收的數(shù)據(jù)
unsigned int flag=0;//運(yùn)動(dòng)模式轉(zhuǎn)動(dòng)方向標(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)動(dòng)模式
void StartModule(); //采集信號(hào)初始化函數(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——停止信號(hào)輸入的掃描,下同
}
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,自動(dòng)巡航,遇見障礙物過近,自動(dòng)左轉(zhuǎn)
{
Bee();//蜂鳴器響一聲
while( receiveData != 28 )
{
StartModule(); //啟動(dòng)采集信號(hào)初始化模塊,即進(jìn)行一次數(shù)據(jù)采集,TRIG每隔一段時(shí)間輸出一次高電平觸發(fā)信號(hào)
while(!ECHO); //當(dāng)ECHO為0時(shí)等待信號(hào)到來(lái),TRIG發(fā)出一段大于10us的高電平后,超聲波模塊會(huì)進(jìn)行發(fā)送8段40khz周期電平
//然后檢測(cè)回波信號(hào),回波信號(hào)脈寬與ECHO信號(hào)高電平持續(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ù)來(lái)的時(shí)間在距離計(jì)算函數(shù)中計(jì)算距離S
movemode(); //選擇運(yùn)動(dòng)模式
}
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ù)功能 : 測(cè)量超聲波距離S
*******************************************************************************/
void Conut(void)
{
time=TH0*256+TL0; //時(shí)間等于高位信息+低位信息的和,讀取測(cè)量得到的時(shí)間,單位是微秒,是超聲波發(fā)送出去到反射回來(lái)的時(shí)間.
TH0=0;
TL0=0; //計(jì)算完成后,初始化定時(shí)器高低位信息
S=time*0.017; //計(jì)算超聲波距離
}
/*******************************************************************************
* 函 數(shù) 名 : movemode
* 函數(shù)功能 : 選擇運(yùn)動(dòng)模式
*******************************************************************************/
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ù)功能 :超聲波采集信號(hào)初始化函數(shù)
/**********************************************************/
void StartModule() //啟動(dòng)模塊
{
TRIG = 1; //啟動(dòng)一次模塊
_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; //蜂鳴器響一聲
}
作者: chenyucy72 時(shí)間: 2022-6-4 10:53
老師好,我下載學(xué)習(xí)先了,不過現(xiàn)在還看不懂,謝謝
作者: 傻到不知所措 時(shí)間: 2022-11-20 16:47
膜拜大佬,成功借鑒代碼學(xué)習(xí)了超聲波!
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |