#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;
//关闭计数
}
*/