久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3173|回復: 2
打印 上一主題 下一主題
收起左側

單片機超聲波紅外接收控制小車程序 測量距離、紅外控制、自動巡航

[復制鏈接]
跳轉到指定樓層
樓主

*
* 程序  名         : 超聲波HY-SRF05測距、紅外接收控制小車
* 程序功能         : 測量距離、紅外控制、自動巡航
* 備注             : 130直流電機、L298N電機驅動、HY-SRF05超聲波測距模塊、紅外收發模塊
* 作者             : 1111ADADAD
*******************************************************************************/
// --頭文件聲明 --//
#include<reg51.h>
#include <intrins.h>

//--聲明超聲波引腳對應--//
sbit TRIG=P3^7;    //TRIG是觸發信號
sbit ECHO=P3^6;   //ECHO是測距的持續信號

//--聲明電機驅動引腳對應--//
sbit ZUO1 =P2^6;      //左轉控制口1
sbit ZUO2 =P2^7; //左轉控制口2
sbit YOU1 =P1^3;   //右轉控制口1
sbit YOU2 =P1^4; //右轉控制口2

//--聲明蜂鳴器驅動引腳對應--//
sbit BEE =P2^1; //蜂鳴器控制引腳
//--定義全局變量--//
unsigned long S=0;      //距離初始化
unsigned int time=0; //超聲波往返時間寄存變量
unsigned char receiveData;      //用來保存紅外模塊串口接收的數據
unsigned int flag=0;//運動模式轉動方向標志

//--聲明全局函數--//
void Delay10ms(unsigned int c); //延時10ms函數
void system_Ini();//定時器系統、中斷初始化函數
void Conut(void);//距離計算函數
void movemode();//選擇運動模式
void StartModule();    //采集信號初始化函數   
void UsartConfiguration();      //紅外串口函數
void redreceive();    //紅外遙控信息接收函數
void qianjin();//控制電機前進
void houtui();//控制電機后退
void houtui3s();    //控制電機后退3s
void lefturn1s();   //控制電機左轉1s
void zuozhuan();//控制電機左轉
void righturn1s();   //控制電機右轉1s
void youzhuan();//控制電機右轉
void pause();     //控制電機停止
void Bee();//蜂鳴器響一聲

/*******************************************************************************
* 函 數 名        : main
* 函數功能        : 主函數
*******************************************************************************/
void main(void)
{
UsartConfiguration();       //串口函數初始化
system_Ini();     //定時器系統、中斷初始化
pause();  //小車停止
BEE=0;
while(1)   //進入紅外控制死循環
{
redreceive();                   //接收紅外信息
if ( receiveData == 24)    //按鍵2按下
{
Bee();//蜂鳴器響一聲
while( receiveData != 28 ) //當按鍵5沒有按下時,一直前進,下同
{
qianjin(); //小車前進
   redreceive(); //前進的同時,持續進行是否有紅外按鍵5——停止信號輸入的掃描,下同
}
pause();             //停止
Bee();//蜂鳴器響一聲
}
else if( receiveData == 82)      //按鍵8按下
{
Bee();//蜂鳴器響一聲
while( receiveData != 28 )
{
houtui();        //后退
redreceive();
}
pause();          //停止
       Bee();//蜂鳴器響一聲
}
else if( receiveData == 8)       //按鍵4按下
{
    Bee();//蜂鳴器響一聲
lefturn1s();         //左轉1s
receiveData=0;   //紅外接收變量清零
}
else if( receiveData == 90)      //按鍵6
{
Bee();//蜂鳴器響一聲
righturn1s();    //右轉1s
receiveData=0;   //紅外接收變量清零
}
else if (receiveData == 9)       //按鍵EQ,自動巡航,遇見障礙物過近,自動左轉
{
Bee();//蜂鳴器響一聲
while( receiveData != 28 )
{
StartModule();      //啟動采集信號初始化模塊,即進行一次數據采集,TRIG每隔一段時間輸出一次高電平觸發信號
while(!ECHO);       //ECHO0時等待信號到來,TRIG發出一段大于10us的高電平后,超聲波模塊會進行發送840khz周期電平
//然后檢測回波信號,回波信號脈寬與ECHO信號高電平持續時間成正比,ECHO持續時間*聲速再除以2
//結果即為距離。此時為等待RX產生高電平,一旦產生后,后面定時器即開始計數,
TR0=1;              //打開定時器0,開啟計數  
while(ECHO);        //ECHO1時計數進入循環等待,ECHO高電平不結束,計時不停止,一旦結束
TR0=0;              //關閉定時器0,停止計數
Conut(); //通過計數來的時間在距離計算函數中計算距離S
movemode();     //選擇運動模式
}
pause();      //停止
}
else continue;     //未接收到紅外信息時,繼續從頭循環等待
}
}
/*******************************************************************************
* 函 數 名         : Delay10ms
* 函數功能        : 延時函數,延時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--);
}      
}      
}
/*******************************************************************************
* 函 數 名        :system_Ini
* 函數功能        :定時器T0系統/中斷初始化
/******************************************************************************/
void system_Ini(void)
{  
TH0=0;
TL0=0;
    TMOD=0x21;         //T0為方式1            
    ET0=1;             //允許T0中斷  
    EA=1;              //開啟總中斷   
}
/*******************************************************************************
* 函 數 名         : Conut
* 函數功能   : 測量超聲波距離S
*******************************************************************************/
void Conut(void)  
{  
     time=TH0*256+TL0; //時間等于高位信息+低位信息的和,讀取測量得到的時間,單位是微秒,是超聲波發送出去到反射回來的時間.
     TH0=0;     
     TL0=0;         //計算完成后,初始化定時器高低位信息
S=time*0.017; //計算超聲波距離
}
/*******************************************************************************
* 函 數 名         : movemode
* 函數功能   : 選擇運動模式
*******************************************************************************/
void movemode()
{
if(S<8)     //如果距離小于8CM,則
{
if(flag>=0&&flag<=2)
{
lefturn1s();//左轉1s
flag=flag+1;
}
else if(flag==3||flag==7)
{
houtui3s();//后退3s
flag=flag+1;
}
else if(flag>=4&&flag<=6)
{
righturn1s();   //右轉1s
flag=flag+1;
}
else //標志位清零
flag=0;

}
else        //如果距離大于8CM,則
{
redreceive();       //接收紅外信息
qianjin();    //小車持續前進
}
}


/***********************************************************
* 函 數 名         :StartModule()
* 函數功能   :超聲波采集信號初始化函數
/**********************************************************/
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;  
}  
/*******************************************************************************
* 函 數 名         :UsartConfiguration()
* 函數功能   :設置紅外接收串口
*******************************************************************************/
void UsartConfiguration()
{
SCON=0X50;//設置為工作方式1
TMOD=0X20;//設置計數器工作方式2
PCON=0X80;//波特率加倍
TH1=0XF3;    //計數器初始值設置,注意波特率是4800
TL1=0XF3;
TR1=1;//打開計數器
}
/*******************************************************************************
* 函 數 名         : redreceive()
* 函數功能         : 紅外接收
*******************************************************************************/
void redreceive()
{
if(RI == 1)    //查看紅外是否接收到數據,如果接受到
{
receiveData = SBUF;//讀取數據,存至變量receiveData
RI = 0;//清除串口接收標志位
}
}
/*******************************************************************************
* 函 數 名         : qianjin
* 函數功能         : 控制電機前進
*******************************************************************************/
void qianjin()
{
ZUO1=1;ZUO2=0;
YOU1=1;YOU2=0; //前進
}
/*******************************************************************************
* 函 數 名         : houtui
* 函數功能         : 控制電機后退
*******************************************************************************/
void houtui()
{
ZUO1=0;ZUO2=1;
YOU1=0;YOU2=1; //后退
}
/*******************************************************************************
* 函 數 名         : houtui3s
* 函數功能         : 控制電機后退3s
*******************************************************************************/
void houtui3s()
{
unsigned char a,b,c=20;  //后退3秒鐘=
ZUO1=0;ZUO2=1;
YOU1=0;YOU2=1;     //左轉
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--)
{
redreceive();
}
}      
}
pause();

}
/*******************************************************************************
* 函 數 名         : void lefturn1s()
* 函數功能         : 控制電機左轉1s
*******************************************************************************/
void lefturn1s()
{
unsigned char a, b,c=5;
ZUO1=0;ZUO2=0;
YOU1=1;YOU2=0; //左轉
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--)
{
redreceive();
}
}      
}
pause();
}
/*******************************************************************************
* 函 數 名         : zuozhuan
* 函數功能         : 控制電機左轉
*******************************************************************************/
void zuozhuan()
{
ZUO1=0;ZUO2=0;
YOU1=1;YOU2=0;      //左轉
redreceive();
}

/*******************************************************************************
* 函 數 名         : void righturn1s()
* 函數功能         : 控制電機右轉1s
*******************************************************************************/
void righturn1s()
{
unsigned int  a, b,c=5;  //右轉1秒鐘
ZUO1=1;ZUO2=0;
YOU1=0;YOU2=0; //右轉
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--)
{
redreceive();
}
}      
}
pause();    //電機停止
}  
/*******************************************************************************
* 函 數 名         : youzhuan
* 函數功能         : 控制電機右轉
*******************************************************************************/
void youzhuan()
{
ZUO1=1;ZUO2=0;
YOU1=0;YOU2=0; //右轉
redreceive();
}
/*******************************************************************************
* 函 數 名         : pause
* 函數功能         : 控制電機停止
*******************************************************************************/
void pause()
{
     ZUO1=0;ZUO2=0;
YOU1=0;YOU2=0; //電機停止
}
/*******************************************************************************
* 函 數 名         : Bee
* 函數功能         : 蜂鳴器響一聲
*******************************************************************************/
void Bee()
{
BEE=1;
Delay10ms(200);
BEE=0;             //蜂鳴器響一聲
}




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:704640 發表于 2022-6-4 10:53 | 只看該作者
老師好,我下載學習先了,不過現在還看不懂,謝謝
回復

使用道具 舉報

板凳
ID:1002032 發表于 2022-11-20 16:47 | 只看該作者
膜拜大佬,成功借鑒代碼學習了超聲波!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av永久免费 | 国产精品毛片一区二区在线看 | 日韩国产一区二区三区 | 天天拍天天草 | 九九在线视频 | 久久久久av| 99久久久久久99国产精品免 | 麻豆精品国产免费 | 日本福利视频免费观看 | 欧美激情久久久 | 久久久久久久国产精品视频 | 亚州精品天堂中文字幕 | 久久久成人精品 | 欧美在线视频网 | 男女羞羞视频在线免费观看 | 国产一区二区三区久久久久久久久 | 亚洲欧美中文字幕 | 欧美一区二区在线 | 九九九视频在线观看 | 国产精品片aa在线观看 | 亚洲精品免费视频 | 一区二区三区四区免费视频 | 国产精品地址 | 国产精品久久久久久久久久 | 精品在线一区二区 | 羞羞的视频免费看 | 激情在线视频 | 99视频| 黄色网址大全在线观看 | 精品久久久一区 | 97精品超碰一区二区三区 | 久久国产精品免费一区二区三区 | 黄色三级免费网站 | 欧美成人精品激情在线观看 | 在线欧美日韩 | 成人久草 | 亚洲精品视频在线观看免费 | 国产传媒在线观看 | 国产精品久久久久久久久免费桃花 | 91xxx在线观看| 成人精品一区亚洲午夜久久久 |