|
#include <reg52.h>//51頭文件
#include <intrins.h> //包含nop等系統(tǒng)函數(shù)
sbit RX = P2^0;//ECHO超聲波模塊回響端
sbit TX = P2^1;//TRIG超聲波模塊觸發(fā)端
unsigned char pwm_left_val = 150;//左電機(jī)占空比值 取值范圍0-170,0最快
unsigned char pwm_right_val = 150;//右電機(jī)占空比值取值范圍0-170 ,0最快
unsigned char pwm_t;//周期
unsigned int time = 0;//傳輸時(shí)間
unsigned long S = 0;//距離
bit flag = 0;//超出測(cè)量范圍標(biāo)志位
void delay(unsigned int z)//毫秒級(jí)延時(shí)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void Delay10us(unsigned char i) //10us延時(shí)函數(shù) 啟動(dòng)超聲波模塊時(shí)使用
{
unsigned char j;
do{
j = 10;
do{
_nop_();
}while(--j);
}while(--i);
}
/*小車(chē)前進(jìn)*/
void forward()
{
left_motor_go; //左電機(jī)前進(jìn)
right_motor_go; //右電機(jī)前進(jìn)
}
/*小車(chē)后退*/
void backward()
{
left_motor_back; //左電機(jī)后退
right_motor_back; //右電機(jī)后退
}
/*定時(shí)器1中斷輸出PWM信號(hào)*/
void timer1() interrupt 3
{
pwm_t++;//周期計(jì)時(shí)加
if(pwm_t == 255)
pwm_t = EN1 = EN2 = 0;
if(pwm_left_val == pwm_t)//左電機(jī)占空比
EN1 = 1;
if(pwm_right_val == pwm_t)//右電機(jī)占空比
EN2 = 1;
}
/*判斷S2是否被按下*/
void keyscan()
{
for(;;) //死循環(huán)
{
if(key_s2 == 0)// 實(shí)時(shí)檢測(cè)S2按鍵是否被按下
{
delay(5); //軟件消抖
if(key_s2 == 0)//再檢測(cè)S2是否被按下
{
while(!key_s2);//松手檢測(cè)
beep = 0; //使能有源蜂鳴器
delay(200);//200毫秒延時(shí)
beep = 1; //關(guān)閉有源蜂鳴器
break; //退出FOR死循環(huán)
}
}
}
}
/*定時(shí)器0中斷*/
void timer0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
flag=1; //中斷溢出標(biāo)志
}
void StartModule() //啟動(dòng)超聲波模塊
{
TX=1; //啟動(dòng)一次模塊
Delay10us(2);
TX=0;
}
/*計(jì)算超聲波所測(cè)距離并顯示*/
void Conut()
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(float)(time*1.085)*0.17; //算出來(lái)是MM
if((S>=7000)||flag==1) //超出測(cè)量范圍
{
flag=0;
}
}
/*超聲波避障*/
void Avoid()
{
if(S > 150)//設(shè)置避障距離(單位毫米)
{
forward();
}
else
{
backward();
}
}
void main()
{
keyscan();//等待按鍵按下啟動(dòng)
delay(1000);//延時(shí)1秒
TMOD |= 0x20;//定時(shí)器1工作模式2,8位自動(dòng)重裝。用于產(chǎn)生PWM
TMOD |= 0x01;//定時(shí)器0工作模塊1,16位定時(shí)模式。T0用測(cè)ECH0脈沖長(zhǎng)度
TH1 = 220; //
TL1 = 220; //100HZ T1
TH0 = 0;
TL0 = 0;//T0,16位定時(shí)計(jì)數(shù)用于記錄ECHO高電平時(shí)間
ET1 = 1;//允許T1中斷
ET0 = 1;//允許T0中斷
TR1 = 1;//啟動(dòng)定時(shí)器1
EA = 1;//啟動(dòng)總中斷
while(1)
{
StartModule(); //啟動(dòng)模塊測(cè)距
while(!RX); //當(dāng)RX(ECHO信號(hào)回響)為零時(shí)等待
TR0=1; //開(kāi)啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算距離
Avoid(); //避障
delay(65);
}
}
|
評(píng)分
-
查看全部評(píng)分
|