同学们大家好,本节我们一起来分析一下蓝桥板上的超声波这个模块。从前几届的省赛试题中,我们发现超声波模块并没有涉及,可超声波却是国赛中经常考的一个知识点。因此,虽然以往省赛没有考到,但是不排除往后省赛会考到的可能性,因此这个模块每一年都应该引起重视。本节会对超声波模块的原理、电路、以及实现的方法进行讲解;并在文中贴出部分核心代码仅供参考,到这里,大家应该能够有较强的自学能力了,所以这些核心的代码已经足够大家参考了。
首先,我们先来分析一下超声波模块的电路:
说明一下,图中JS1和JS2是超声波的接收元件和发射元件
跳线帽连接着 N_A1—P10 N_B1—P11
也就是说P10是发射端,P11是接收端。
其次,超声波测距的原理呢,其实就是发送端发送40KHZ的超声波,通过计算声音的发出和返回的时间差,通过声音的传播速度,计算来得出距离。CX2016A这里作为一个解调芯片将返回的信号进行解调之后在N_B1端输出一个与发送信号到接收信号的时间成正比的低电平信号。
以下是时序图:
通过时序图可以看出,测距的关键点就是怎么处理这个回响电平,我们知道回响电平持续的时间所用的路程是来回的,也就是说2倍;已知声速一般是340m/s(空气中)。于是就不难推出下面的公式:(设回响信号所持续时间是t,距离为D)
D=340*t/2
关键就是t 这个值怎么测,其实一般情况下,我们采用的方法是采用定时器:
记住,这个方法是要初始化定时器然后控制TR0或TR1,但是不要开定时器中断,一般为了增加测量距离使用的是16位定时器模式。
根据时序图,不难写出发送信号的代码如下:
void trigSig() { unsigned char i; for(i=0;i<8;i++) { delayus(); //这个延时要保证P10保持在40Khz的情况下震荡 P10=~P10; } }
接收并处理函数如下:(这里采用的是定时器1)
unsigned int recevieSig() { unsigned int distance; TH1=0; TL1=0; //初始化计数 trigSig(); //发送信号 TR1=1; //开启定时器计数 while(P11==1&&TF1==0); //当P11=0或者计数计满时跳出 TR1=0; //停止计数 if(TF1) //表示计数计满 达到软件限定最远距离 { distance =150; TF1=0; } else { distance = (unsigned int)(TH1<<8)+TL1; distance = distance *0.017*1.085; //单位cm } return distance; }
当然,以上仅仅是一种常用的方法;这个方法的好处是测出的距离比较准确,而缺点则是占用了51中珍贵的定时器资源。仅是一个超声波模块的使用,对于51单片机来说当然不是问题,但是综合到一块,一旦发现51单片机的资源不够用的时候,就要想尽办法的分配资源和优化程序,而难度也会陡然上升。同学们要多多练习,熟能生巧,才能合理分配单片机的内部资源,特别是有志于参加国赛的各位同学们。希望大家能够勤加练习,在比赛中取得优异的成绩哦!