#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Trig=P3^0;
sbit Echo=P3^3;
sbit control=P3^5;
uint dis,flag=0,timeH,timeL,succeed_flag,time;
void tran_ret();
void delay_nus(uint n);
void delay_ms(long int m);
void delay_n100us(uint n);
void run();
//void backrun();
//void freestop();
void turnleft();
void turnright ();
void Sturnround();
void Nturnround();
void servo_turn(int gao);
//**********************************************************************
//主函数
void main()
{
TMOD=0x01;
EA=1;
ET0=1;
IT1=0;
Trig=0;
servo_turn(0);
delay_ms(5000);
while(1)
{
tran_ret();
if(dis>30)
{
run();
}
else
{
P1=0XFF;
servo_turn(-90);
delay_ms(5000);
tran_ret();
if (dis>30)
{
turnleft();
P1=0XFF;
servo_turn(0);
delay_ms(5000);
run();
}
else
{
P1=0XFF;
servo_turn(90);
delay_ms(5000);
tran_ret();
if (dis>30)
{
turnright();
servo_turn(0);
delay_ms(5000);
run();
}
else
{
Nturnround ();
servo_turn(0);
delay_ms(5000);
run();
}
}
}
}
}
//*************************************************************************************
//子函数
//**************************************************************************************
//全速前进
void run()
{
P1=0xaa;
//delay_ms(60);
//P1=0xff;
}
/*//全速后退
void backrun()
{ P1=0x55;
delay_ms(19);
P1=0x00;
delay_ms(1);
} */
//自由停止
/*void freestop ()
{
P1=0x00;
delay_ms(20);
} */
//左转
void turnleft()
{
P1=0x0a;
delay_ms(100);
//P1=0xff;
}
//右转
void turnright()
{
P1=0xa0;
delay_ms(100);
// P1=0xff;
}
/*//原地顺时针打转
void Sturnround()
{
P1=0xa0;
delay_ms(40);
P1=0x00;
delay_ms(1);
} */
//原地逆时针打转
void Nturnround ()
{
P1=0x0a;
delay_ms(100);
// P1=0x00;
}
//发射
void tran_ret()
{
EA=0; //关总中断
Trig=1; //超声波输入端
delay_nus(20);//延时20us
Trig=0; //产生一个20us的脉冲
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EA=1;
EX1=1; //打开外部中断0
TH0=0;//定时器1清零
TL0=0; //定时器1清零
TF0=0; //计数溢出标志
ET0=1;
TR0=1; //启动定时器1
delay_ms(20); //等待测量的结果
TR0=0; //关闭定时器1
EX1=0; //关闭外部中断0
if(succeed_flag==1)
{
time=timeH*256+timeL;
dis=time*0.0182; //cm /12MHZ疑问之处us/
/// display(distance);
}
if(succeed_flag==0)
{
dis=200; //
test = !test; //测试灯变化
}
}
//延时函数1
void delay_ms(long int n)
{
uint i,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
}
//延时函数2
void delay_nus(uint n)
{
uint i;
for(i=n;i>0;i--);
}
//延时函数3
void delay_n100us(uint n)
{
uint i;
while(n--)
{
for(i=7;i>0;i--);
}
}
//中断函数
void exter1() interrupt 2 // 外部中断1
{
timeH =TH0; //取出定时器的值
timeL =TL0; //取出定时器的值
succeed_flag=1;//至成功测量的标志
EX1=0; //关闭外部中断
TR0=0;
}
void servo_turn(int offset)
{
int servo,gao;
control=0;
servo=14;
offset/=9;
gao=servo-offset;
control=1;
delay_n100us(gao);
control=0;
delay_n100us(200-gao);
}