单片机——蝙蝠超声思想避物小车
生活随笔
收集整理的這篇文章主要介紹了
单片机——蝙蝠超声思想避物小车
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
1、圖片
2、代碼?
1、圖片
? ? ? ? ? ????
2、代碼?
#include <reg52.h> //52芯片配置文件 #include <intrins.h> //包含nop等系統(tǒng)函數(shù) #include "bst_car.h" unsigned char disbuff[4]={0,0,0,0};//用于分別存放距離的值0.1mm、mm、cm和m的值unsigned int time=0;//用于存放定時器時間值 unsigned long S=0;//用于存放距離的值 bit flag =0; //量程溢出標志位 char a=0;//延時函數(shù) void delay(unsigned int xms) {unsigned int i,j;for(i=xms;i>0;i--) //i=xms即延時約xms毫秒for(j=112;j>0;j--); }void Delay10us(unsigned char i) //10us延時函數(shù) 啟動超聲波模塊時使用 { unsigned char j; do{ j = 10; do{ _nop_(); }while(--j); }while(--i); } void StartModule() //啟動超聲波模塊 {TX=1; //啟動一次模塊Delay10us(2);TX=0; }void Forward(void)//前進 {IN2=1;IN3=1;IN1=0;IN4=0; }void Stop(void) //停車 {IN1=0; IN2=0;IN3=0;IN4=0; }void back(void) //后退 {IN1=1; IN2=0;IN3=0;IN4=1; } void Turn_Right(void) //向右旋轉 {IN1=0; IN2=1;IN3=0;IN4=1;}/********距離計算程序***************/ void conut1(void) {time=TH1*256+TL1;TH1=0;TL1=0;//此時time的時間單位決定于晶振的頻率,外接晶振為11.0592MHZ//那么1us聲波能走多遠的距離呢?1s=1000ms=1000000us // 340/1000000=0.00034米//0.00034米/1000=0.34毫米 也就是1us能走0.34毫米//但是,我們現(xiàn)在計算的是從超聲波發(fā)射到反射接收的雙路程,//所以我們將計算的結果除以2才是實際的路程S=time*0.17+10; //此時計算到的結果為毫米,并且是精確到毫米的后兩位了,有兩個小數(shù)點 }void Conut(void) {conut1();if((S>=5000)||flag==1) //超出測量范圍{a=0; flag=0;}else{disbuff[0]=S%10;disbuff[1]=S/10%10;disbuff[2]=S/100%10;disbuff[3]=S/1000;}//========避障部分===========================================if(S<=240) 剎車障礙物距離 跟車速有關 可更改{ a++;if(a>=2){a=0;Stop();back(); //后退緩沖delay(230);// 后退緩沖時間 跟車速有關 可更改B:Turn_Right();delay(50); /// 旋轉角度 跟環(huán)境復雜程度有關 可更改Stop();delay(100); 旋轉頓挫時間 視覺效果 可更改StartModule(); while(RX==0);TR1=1; //開啟計數(shù)while(RX); //當RX為1計數(shù)并等待TR1=0; //關閉計數(shù)conut1();if(S>340) 可直行方向無障礙物距離 跟環(huán)境有關 可更改{Turn_Right();delay(90); Stop(); //微調前進方向 避免車寬對前進影響delay(200); Forward();} else{goto B; //若沒轉到空曠方向 回到B點 繼續(xù)旋轉一次}}else{Forward(); //無障礙物 直行}}else{a=0;Forward(); //無障礙物 直行}//=======================================}/********************************************************/ void zd0() interrupt 3 //T0中斷用來計數(shù)器溢出,超過測距范圍 {flag=1; //中斷溢出標志RX=0; }/********超聲波高電平脈沖寬度計算程序***************/ void Timer_Count(void) {TR1=1; //開啟計數(shù)while(RX); //當RX為1計數(shù)并等待TR1=0; //關閉計數(shù)Conut(); //計算} /********************************************************/ void keyscan(void) //按鍵掃描函數(shù) {A: if(K4==0) //判斷是否有按下信號{delay(10); //延時10msif(K4==0) //再次判斷是否按下{FM=0; //蜂鳴器響 while(K4==0); //判斷是否松開按鍵FM=1; //蜂鳴器停止 }else{goto A; //跳轉到A重新檢測}}else{goto A; //跳轉到A重新檢測} } /********************************************************/ /*************主程序********************/ void main(void) {unsigned int a;delay(400); //啟動等待,等LCM講入工作狀態(tài)delay(5);//延時片刻TMOD=TMOD|0x10;//設T0為方式1,GATE=1;EA=1; //開啟總中斷TH1=0;TL1=0; ET1=1; //允許T0中斷keyscan() ; //按鍵掃描while(1){RX=1;StartModule(); //啟動模塊for(a=951;a>0;a--){if(RX==1){Timer_Count(); //超聲波高電平脈沖寬度計算函數(shù)}}} } bst_car.h 文件#ifndef __BSTCAR_H__ #define __BSTCAR_H__//小車驅動模塊的IO設置 sbit IN1=P2^2; sbit IN2=P2^3; sbit IN3=P2^5; sbit IN4=P2^6; sbit EN1=P2^4; sbit EN2=P2^7;//按鍵IO sbit K4=P3^4; sbit K3=P3^6;//蜂鳴器IO sbit FM=P1^3;//紅外循跡IO設置 sbit Left_1_led=P3^3; //循跡-左紅外IO sbit Right_1_led=P3^2; //循跡-右紅外IO //紅外避障 sbit Left_2_led=P3^4; //避障-左紅外IO sbit Right_2_led=P3^5; //避障-右紅外IO //超聲波IO定義 sbit TX=P3^0; //Trig 控制端 sbit RX=P3^1; //Echo 接收端#define Left_moto_go {IN1=0,IN2=1;} //左電機向前走 #define Left_moto_back {IN1=1,IN2=0;} //右電機向后走 #define Left_moto_Stop {EN1=0;} //左電機停止 #define Right_moto_go {IN3=1,IN4=0;} //右電機向前走 #define Right_moto_back {IN3=0,IN4=1;} //右電機向后走 #define Right_moto_Stop {EN2=0;} //右電機停止#endif總結
以上是生活随笔為你收集整理的单片机——蝙蝠超声思想避物小车的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9.10 中国电信it研发中心 笔试编程
- 下一篇: php幻灯片禁止重复,飞飞php影视系统