原理:根据S=V*t;
要想测出距离,我们得知道V=340m/s,也就是声速,转换单位就是34000cm/s,时间通过定时器来获取,超声波发出一个声波后,遇到障碍物返回所需要的时间我们除以2就是所要的时间。
我们采用定时器0,1T的工作模式:
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xAE; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
这个就是超声波的原理图,左边是发送,右边是接收。
我们需要一个发送超声波的函数:
void send_Wave()
{
TX=1;
somenop();
TX=0;
somenop();
TX=1;
somenop();
TX=0;
somenop();
}
在发送之前,定时器高低两位要置0,发送方波后,定时器开始计时,如果接收不到或者定时器一直加加满了就退出来。
计满了也没有收到回波那就规定S=999.然后把标志位清零。
如果接受到了就关闭定时器,将时间存入自己定义的变量t之中。
t=TH0;
t=t<<8;
t=t|TL0;
这样,我们就计算出来t的值,那么只需要求s的距离就可以了。
我们知道 ,单片机频率为11.0592,频率的倒数就是周期,我们✖次数,再乘以34000后➗ 2.
那么最后得出
S=t*0.00154。
下面是完整代码:
#include "reg52.h"
#include "intrins.h"
#define somenop() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
unsigned char code SMDD_duanma[18]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x80,
0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
sbit TX=P1^0;
sbit RX=P1^1;
sfr AUXR=0x8e;·
unsigned int s=0;
unsigned int t=0;
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
}
void delay(unsigned char t)
{
while(t--);
while(t--);
}
void displaySMG(unsigned char i,unsigned char j)
{
P0=0x01<<i;
P2=P2&0x1f|0xc0;
P2=P2&0x1f;
P0=SMDD_duanma[j];
P2=P2&0x1f|0xe0;
P2=P2&0x1f;
}
void send_Wave()
{
TX=1;
somenop();
TX=0;
somenop();
TX=1;
somenop();
TX=0;
somenop();
}
void init()
{
P0=0xff;
P2=P2&0x1f|0x80;
P2=P2&0x1f;
P0=0;
P2=P2&0x1f|0xa0;
P2=P2&0x1f;
}
void main()
{
init();
Timer0Init();
while(1)
{
TL0 = 0x0;
TH0 = 0x0;
TF0 = 0;
send_Wave();
TR0=1;
while((RX==1)&&(TF0==0));
TR0=0;
if(TF0==1)
{
s=999;
TF0=0;
}
else
{
t = TH0;
t=t<<8;
t|=TL0;
s=t*0.001543;
}
displaySMG(0,s/100);
delay(100);
displaySMG(1,s%100/10);
delay(100);
displaySMG(2,s%10);
delay(100);
}
}