|
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ENA=P0^1;
sbit ENB=P0^2;
sbit out1 = P1^1 ; //P2.0到P2.3是電機(jī)驅(qū)動(dòng)輸出控制端
sbit out2 = P1^2 ;
sbit out3 = P1^4 ;
sbit out4 = P1^5 ;
sbit Trig = P0^4; //產(chǎn)生脈沖引腳
sbit Echo = P0^5; //回波引腳
sbit PWM=P0^3; //舵機(jī)pwm//
uint distance[4]; //測(cè)距接收緩沖區(qū)
uint distance1;
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,PDATA; //自定義寄存器
bit succeed_flag; //測(cè)量成功標(biāo)志
unsigned long xdata rec_code;
unsigned long xdata time_us;
unsigned char xdata rec_cnt;
unsigned char xdata kbuf;
//uchar sdata,flag; //sdata是紅外遙控接收鍵值變量 flag是啟動(dòng)小車 或停止小車變量
uint j,a;
uchar pro;
bit rec_b;
bit key_save;
bit keyp;
void chaoshengbo();
void conversion(uint temp_data);
void delay_20us();
void delay_ms(uint x);
void delay(uint t) //延時(shí)程序1
{
uchar j;
while(t--)
{
for(j=5;j>0;j--);
}
}
void Init() //初始化
{
// flag=0;
Trig=0;
TMOD = 0x11;//T/C1采用16位定時(shí)器/計(jì)數(shù)器
ET1 = 1;//定時(shí)器1開中斷
ET0 = 1;
TH0 = 0x00;
TL0 = 0x00;
TH1 = 0xff;
TL1 = 0xce;
TR1=0;
TR0= 0;//定時(shí)計(jì)數(shù)器啟動(dòng)計(jì)數(shù)
EX0 = 1;//外部中斷0關(guān)中斷
PT1 = 1;
EA = 1;//CPU開中斷
}
//--------------------------------------------------
//-------超聲波測(cè)距----------------------------
void chaoshengbo()
{
uint distance_data;
EA=0;
Trig=1;
delay_20us();
Trig=0; //產(chǎn)生一個(gè)20us的脈沖,在Trig引腳
while(Echo==0); //等待Echo回波引腳變高電平
succeed_flag=0; //清測(cè)量成功標(biāo)志
TH0=0; //定時(shí)器1清零
TL0=0; //定時(shí)器1清零
EX0=1; //打開外部中斷
TR0=1; //啟動(dòng)定時(shí)器1
EA=1;
delay_ms(1);
// if(succeed_flag==1)
// {
distance_data=outcomeH; //測(cè)量結(jié)果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//與低8位合并成為16位結(jié)果數(shù)據(jù)
distance_data=(distance_data/25)*43/100;
// }
a=distance_data;
distance1=a;
}
void delay_us(uint x)
{
do
{
x--;
}
while(x>1);
}
void delay_ms(uint x)
{
while(x!=0)
{
delay_us(500);
x--;
}
}
baidong()
{
TR1=1;
pro=24;
delay_ms(100);
pro=10;
delay_ms(100);
pro=36;
delay_ms(100);
pro=24;//90°
delay_ms(100);
TR1=0;
}
void timer0() interrupt 3//定時(shí)0.1ms
{
TH1=0xff;
TL1=0xce;
j++;
if(j<=pro)
{
PWM=1;
}
else
{
PWM=0;
}
if(j==400) //周期20ms
{
j=0;
PWM=~PWM;
}
}
//左轉(zhuǎn)
void comeleft()
{
out1=0;
out2=1;
out3=1;
out4=0;
delay_ms(40);
}
//右轉(zhuǎn)
void comeright ()
{
out1=1;
out2=0;
out3=0;
out4=1;
delay_ms(40);
}
//前進(jìn)加速;
void comeon()
{
out2=0;
out4=0;
out1=1;
out3=1;
}
//后退;
void back()
{
out2=1;
out4=1;
out1=0;
out3=0;
delay_ms(200);
}
void stop() //停止
{
out1=0;
out2=0;
out3=0;
out4=0;
}
//避障原路返回
void shunback()
{
uint DATA1,DATA2;
chaoshengbo();
if(distance1<8)
{
stop();
TR1=1;
pro=10;//0°
delay_ms(50);
TR1=0;
PWM=1;
chaoshengbo();
DATA1= distance1;
distance1=0;
TR1=1;
pro=36;//180°
delay_ms(50);
TR1=0;
PWM=1;
chaoshengbo();
DATA2= distance1;
distance1=0;
TR1=1;
pro=24;//180°
delay_ms(50);
TR1=0;
if(DATA1>=8 && DATA1>DATA2)
{
comeright ();comeon();
}
else if (DATA2>=8 && DATA2>=DATA1)
{
comeleft(); comeon();
}
else if (DATA2<8 && DATA1<8)
{
back(); comeleft();comeon(); }
}
else
{
comeon();
}
}
void main(void)
{
P1=0XFF;
P2=0XFF;
P3=0XFF;
P0=0XFF;
Init();
baidong();
while(1)
{
shunback();
}
}
//***************************************************************
//外部中斷0,用做判斷回波電平
INTO_() interrupt 0 // 外部中斷是0號(hào)
{
outcomeH =TH0; //取出定時(shí)器的值
outcomeL =TL0; //取出定時(shí)器的值
succeed_flag=1; //至成功測(cè)量的標(biāo)志
EX0=0; //關(guān)閉外部中斷
TR0=0;
}
//****************************************************************
//******************************************************************
void delay_20us()
{
uchar bt ;
for(bt=0;bt<100;bt++);
}
|
|