#include <REGX51.H>
#define uint unsigned int
#define uchar unsigned char
uint PWM = 5; //最大20,pwm调速
uchar time = 0;
uint Shi_Jian;
uint a,b,c,FJL,LJL,RJL;
void Delay (uint t) //@11.0592MHz 100us
{
unsigned char i;
while (t)
{
i = 43;
while (--i);
t--;
}
}
void Timer_Init() //定时器 @11.0592MHZ 0.1ms
{
TMOD = 0x11;
TH0 = 0xFB;
TL0 = 0xAF;
TF0 = 0;
ET0 = 1; //允许中断
EA = 1; //开启总中断
TR0 = 1; /开启定时器
TF1 = 0;
TH1 = 0;
TL1 = 0;
}
void Timer0_Rountine() interrupt 1 //T0 中断
{
time++;
TH0 = 0xFB;
TL0 = 0xAF;
if(time >= 20)
time = 0;
}
int Front_Ju_Li () //测前方距离
{
P2_0 = 1; //发送超声波
Delay(1); //延时100us
P2_0 = 0; //关闭超声波
while (!P2_1); //未接收到超声波并等待
TR1 = 1; //开启定时器
while (P2_1); //接收到超声波并等待
TR1 = 0; //关闭定时器1
Shi_Jian = TH1*256 + TL1;
TH1 = 0;
TL1 = 0;
FJL = (Shi_Jian*1.7)/100; //单位 cm
return FJL;
}
int Zuo_Ju_Li () //测左边距离
{
P2_2 = 1; //发送超声波
Delay(1); //延时100us
P2_2 = 0; //关闭超声波
while (!P2_3); //未接收到超声波并等待
TR1 = 1; //开启定时器
while (P2_3); //接收到超声波并等待
TR1 = 0; //关闭定时器1
Shi_Jian = TH1*256 + TL1;
TH1 = 0;
TL1 = 0;
LJL = (Shi_Jian*1.7)/100; /单位 cm
return LJL;
}
int You_Ju_Li () //测右边距离
{
P2_4 = 1; //发送超声波
Delay(1); //延时100us
P2_4 = 0; //关闭超声波
while (!P2_5); //未接收到超声波并等待
TR1 = 1; //开启定时器
while (P2_5); //接收到超声波并等待
TR1 = 0; //关闭定时器1
Shi_Jian = TH1*256 + TL1;
TH1 = 0;
TL1 = 0;
RJL = (Shi_Jian*1.7)/100; //单位 cm
}
void Car_Stop () //停止
{
P1_0=0,P1_1=0,P1_2=0,P1_3=0,P1_4=0,P1_5=0,P1_6=0,P1_7=0;
}
void Car_Run () //前进
{
if (time <= PWM)
P1_0=1,P1_1=0,P1_2=0,P1_3=1,P1_4=0,P1_5=1,P1_6=0,P1_7=1;
else
Car_Stop ();
}
void Car_Zuozhuan () //左转
{
if (time <= PWM)
P1_0=0,P1_1=1,P1_2=0,P1_3=1,P1_4=1,P1_5=0,P1_6=0,P1_7=1;
else
Car_Stop ();
}
void Car_Youzhuan () //右转
{
if (time <= PWM)
P1_0=1,P1_1=0,P1_2=1,P1_3=0,P1_4=0,P1_5=1,P1_6=1,P1_7=0;
else
Car_Stop ();
}
void Car_Houtui () /后退
{
if (time <= PWM)
P1_0=0,P1_1=1,P1_2=1,P1_3=0,P1_4=1,P1_5=0,P1_6=1,P1_7=0;
else
Car_Stop ();
}
void main()
{
Timer_Init();
while (1)
{
do
{
Car_Run ();
a = Front_Ju_Li ();
}while(a >= 20);
Car_Stop ();
b = Zuo_Ju_Li ();
Delay(100);
c = You_Ju_Li ();
Delay(100);
if (b <= 15 && c <= 15) //进入狭小空间,后退
Car_Houtui ();
if (b <= c) //左边距离小于右边距离,右转
Car_Youzhuan ();
if (c <= b) /右边距离小于左边距离,左转
Car_Zuozhuan ();
else
Car_Stop ();
}
}
帮忙看一下程序有什么问题
|