今天来看看超声波
超声波测距原理:单片机发出超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出距离。
这样很容易就推导出距离公式:距离L = 344M/S * T / 2 = 172M/S * T 。(假设声速为344m/s)
来看看原理图
我们看到有2个电路分别控制JS1和JS2,就是接收和发射模块
JS1由N B1控制
JS2由N A1控制
然后这2个口由JUMP6跳线组控制,所以要把跳线帽接到13,24
所以我们只要控制P1^0 P1^1
在蓝桥杯单片机的竞赛综合平台CT107D中,超声波模块的TX引脚接到单片机的P1.0端口,RX引脚接到单片机的P1.1端口。
下面进行代码呈现,实现功能为数码管显示测量距离
#include<STC15F2K60S2.H>
#include<intrins.H>
#define uchar unsigned char
#define uint unsigned int
code uchar tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xFF};
uchar yi,er,san,si,wu,liu,qi,ba;
void allinit(void);
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void SelectHc537(uchar m)
{
switch(m)
{
case(4):
P2=(P2&0x1f)|0x80;
break;
case(5):
P2=(P2&0x1f)|0xa0;
break;
case(6):
P2=(P2&0x1f)|0xc0;
break;
case(7):
P2=(P2&0x1f)|0xe0;
break;
case(0):
P2=P2&0x1f;
break;
}
}
void Delay12us() //@12.000MHz
{
uchar i;
_nop_();
_nop_();
i = 33;
while (--i);
}
void delayms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=835;j>0;j--);
}
//发送超声波,规定每次发送8个40kHz的方波
void send_ware(void)
{
uchar i;
for(i=0;i<8;i++)
{
P10=1;
Delay12us(); //高电平12us
P10=0;
Delay12us(); //低电平12us
//加上赋值等操作消耗的时间,1个周期可近似看作25us,即40khz的频率
}
}
//定时器1初始化
void Timer1Init(void) //@11.0592MHz
{
AUXR &= 0xBF; //定时器时钟12T模式,每1us计数器加一
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x00; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1关闭计时
}
//接收并计算距离
unsigned int receive_ware(void)
{
uint time;
uint distance;
send_ware();
TR1=1; //打开定时器1,开始计时
while((TF1==0)&&(P11==1)); //当接收到信号(RX=0)或定时器1溢出(TF=1)时,关闭定时器1
TR1=0; //关闭定时器1,停止计时
if(TF1==1) //如果定时器1溢出即超出最大距离
{
TF1=0; //溢出标志位清零
distance=999; //显示999,意思为超出测量范围
}
else
{
time=(TH1<<8)|TL1; //获得从发出信号到收到信号的间隔时间
distance=(unsigned int)(time*0.017); //dis=time*0.034cm/us(340m/s)/2,
//除以2是因为声波来回是两倍的距离
}
TH1=0x00; //清空定时器1的计数器
TL1=0x00;
return distance; //返回距离
}
void main(void)
{
unsigned int distance;
allinit();
Timer1Init();
while(1)
{
distance=receive_ware();
yi=distance/100;
er=distance/10%10;
san=distance%10;
si=wu=liu=qi=ba=11;
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
void allinit(void)
{
SelectHc537(5);
P0=0x00;
SelectHc537(4);
P0=0xff;
SelectHc537(6);
P0=0xff;
SelectHc537(7);
P0=0xff;
SelectHc537(0);
}
void display1(uchar yi,uchar er)
{
SelectHc537(6);
P0=0x01;
SelectHc537(7);
P0=tab[yi];
delayms(1);
SelectHc537(6);
P0=0x02;
SelectHc537(7);
P0=tab[er];
delayms(1);
}
void display2(uchar san,uchar si)
{
SelectHc537(6);
P0=0x04;
SelectHc537(7);
P0=tab[san];
delayms(1);
SelectHc537(6);
P0=0x08;
SelectHc537(7);
P0=tab[si];
delayms(1);
}
void display3(uchar wu,uchar liu)
{
SelectHc537(6);
P0=0x10;
SelectHc537(7);
P0=tab[wu];
delayms(1);
SelectHc537(6);
P0=0x20;
SelectHc537(7);
P0=tab[liu];
delayms(1);
}
void display4(uchar qi,uchar ba)
{
SelectHc537(6);
P0=0x40;
SelectHc537(7);
P0=tab[qi];
delayms(1);
SelectHc537(6);
P0=0x80;
SelectHc537(7);
P0=tab[ba];
delayms(1);
SelectHc537(6);
P0=0xff;
SelectHc537(7);
P0=0xff;
SelectHc537(0);
}