#include <reg52.h> //器件配置文件
#include <intrins.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
sbit RX = P3^1; //ECHO
sbit TX = P3^2; //
sbit in1 = P1^0;
sbit in2 = P1^1;
sbit in3 = P1^2;
sbit in4 = P1^3;
unsigned long S=0;
uint time =0;
uint timer=0;
uchar posit=0;
uint flag =0;
uchar code discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
uchar code positon[3]={ 0xfe,0xfd,0xfb};
uchar disbuff[4]={ 0,0,0,0,};
/***********************函数声明**************************/
void DelayMs(uchar t);
void DelayUs2x(uchar t);
void go(); //前进
void turnleft(); //左转
void turnright(); //右转
void stop(); //停车
void back(); //后退
void delay(uint z); //延时函数,调节电机转速
void chaoshengbo();
void Display();
void Conut();
/********************************************************/
void Display() //扫描数码管
{
while(posit<2)
{
P0=discode[disbuff[posit]];
P2=positon[posit];
++posit;
DelayMs(3);
}
posit=0;
}
void delay(uint z) //延时函数,调节电机转速
{
uint i,j;
for(i=2;i>0;i--)
for(j=z;j>0;j--);
}
/********************************************************/
void Conut()
{
time=TH1*256+TL1;
TH1=0;
TL1=0; //清除定时器1寄存器中的值
S=time/58; //算出来是CM
if(S>=100) //超出测量范围显示“-”
{
//flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
}
else
{
disbuff[0]=S%100/10;
disbuff[1]=S%100%10;
}
if(S>=30)
{
flag=0; //前进
}
else if(S<30 && S>20)
{
flag=3; //左转
}
else if(S<=20)
{
flag=1; //后退
}
}
/*********************************************************/
void main() /////////////////////////////////////////////////////
{
TMOD=0x11; //设T0为方式1,GATE=1//门控位;
TH0=0;
TL0=0;
TH1=0xf8; //2MS定时
TL1=0x30;
EX0=1; //允许INT0外部中断 ///////外部中断0///
IT0=0; //外部中断INT0 电平触发方式
ET1=1; //允许T1中断
TR1=1; //T1控制位TR1置1时,T1定时器工作;TR1置0时,T1停止工作
ET0=1; //允许T0中断
TR0=1; //T0控制位TR0置1时,T0定时器工作;TR0置0时,T0停止工作
EA=1; //启动总中断
while(1)
{
switch(flag)
{
case 0:
//stop();
while(1)
{
go();
if(flag!=0) //前进
break;
}
break;
case 1:
stop();
while(1)
{
back();
if(flag!=1) //后退
break;
}
break;
case 2:
//stop();
while(1)
{
turnleft();
if(flag!=2) //左转
break;
}
break;
case 3:
//stop();
while(1)
{
turnright();
if(flag!=3) //右转
break;
}
break;
case 4:
stop();
while(1)
{
if(flag!=4) //停车
break;
}
break;
default:
break;
}
}
}
void DelayUs2x(uchar t)
{
while(--t);
}
void DelayMs(uchar t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
void go() //前进 0
{
in1=1;
in2=0;
in3=1;
in4=0;
delay(10-3); //PWM软件延时
in1=0;
in2=0;
in3=0;
in4=0;
delay(3); //PWM软件延时
}
void back() //后退 1
{
in1=0;
in2=1;
in3=0;
in4=1;
delay(10-3);
in1=0;
in2=0;
in3=0;
in4=0;
delay(3);
}
void turnleft() //左转 2
{
in1=0;
in2=1;
in3=1;
in4=0;
delay(10-3);
in1=0;
in2=0;
in3=0;
in4=0;
delay(3);
}
void turnright() //右转 3
{
in1=1;
in2=0;
in3=0;
in4=1;
delay(10-3);
in1=0;
in2=0;
in3=0;
in4=0;
delay(3);
}
void stop() //停车 4
{
in1=0;
in2=0;
in3=0;
in4=0;
}
//T0中断 计数器0 溢出,超过测距范围
void time1() interrupt 3 //T1中断 用来扫描数码管和计800MS启动超声波模块
{
TH1=0xf8; //1111 1000 //2MS定时
TL1=0x30; // 0011 0000
timer++;
if(timer>=400)
{
timer=0;
TX = 1; //P1_2 //800MS 启动超声波模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX = 0; //P1_2
while(!RX); //当echoRX=P1_1 接收 为零时等待
TR1=1; //开启计数
while(RX); //当RX=P1_1 接收 为1计数并等待
TR1=0; //关闭计数
}
}
/********************************************************/
void int0() interrupt 0 //INT0外部中断
{
Conut(); //计算
Display(); //调用函数 数码管显示
}
/* void chaoshengbo()
{
TX=1; //TRIG 控制 触发信号是高电平脉冲,宽度大于10us
DelayUs2x(10);
TX=0;
while(!RX); //当echoRX=P1_1 接收 为零时等待
TR0=1; //开启计数
while(RX); //当RX=P1_1 接收 为1计数并等待
TR0=0; //关闭计数
} */