蓝桥杯之超声波

  • 超声波原理
    • 电路结构
      • 发射电路
      • 接收电路
    • 发射和接收的原理
      • 发射
      • 接收

超声波原理

电路结构

发射电路

接收电路

超声波硬件电路我们不用过多关心,需要我们关心的如何编写其驱动程序,这里为了言简意洁,给出驱动的原理和程序即可。
首先我们要知道超声波发送和接收的引脚在哪

在此处可以看见这个跳帽的位置,N_A1就是发射的引脚,而N_B1就是接收的引脚(这里刚学的的同学,可以仔细看一下电路),因此我们知道了
N_A1所连接的P10就是发射引脚,N_B1所连接的P11就是接收引脚
知道了引脚后,解释原理

发射和接收的原理

发射

由单片机产生8个38KHZ的脉冲信号,加到超声波探头的引脚上,使内部的压电晶片产生共振,向外发射超声波。	
因此程序方面,需要有超声波发生程序(38k是因为接收电路是红外电路,决定,这点可以记住就行)
//超声波发生程序,此处是一个周期为26us,也就是频率为1/26us,接近38k
void SendWaves()
{
	uchar i=8;
	while(i--)
	{
		Sonic_Txd=1;
		Delay13us();
		Sonic_Txd=0;
		Delay13us();		
	}
}

接收

接收原理:当接收到38k的发射信号后,接收引脚将由高电平变为低电平,因此程序的设计可以启用一个定时器,在
发射的时候清空定时器的初值,然后开始发送超声波并且开启计时,当引脚电平变为低电平的时候则结束计时,并通
过定时器来计算发射到接收的时间,用   测试距离=(高电平时间*声速(340M/S))/2;即可计算出距离!		

为了节省单片机的资源,这里采用PCA模块的定时器,专用于超声波

//首先是PCA的初始化,下面的程序只执行一次,放在man函数后面运行一次即可
CPMD |= 0x08 //将定时器时钟设置为SYSSclk(这里为11.0592MHZ),因为采用查询法,关闭溢出中断
CCON = 0x00  //将溢出位CF置零,将CR置零停止PCA计数
//这里就初始化完成了,我们要的只是这个定时器的定时和查询是否溢出效果就OK
//至于其它PWM和捕获匹配等,自行了解
//超声波测距
void SonicDrive()
{
	uint time,distance;
    SendWaves();
    CH = 0;  //清空定时器的初值
    CL = 0;
    CR = 1;  //开启计时
	 //当没有接收到信号,并且没有超时的时候,一直在这里循环
    while((Sonic_Rxd) && (CF==0)); ?/注意这里while后面的分号!
	 //当退出的时候,有两种情况,要么接收到了信号,要么超时了!
    CR= 0;    //首先要关闭计时!
    if(CF == 1) //如果是因为超时退出
    {
        CF = 0; //清除溢出标志
        /* 此处放超时的程序,看要求,不显示,或者返回一个什么东西 */
    }
    else   //否则,则应该是接收到信号而退出
    {
        time = (CH * 256) + CL; //将计时器的计时取出,合并数据
        distance = (uint)((time * 0.017) / 11.0592);  //计算距离
			  /* 此处可以放对距离的处理,进行显示,或者数据计算平均值之类的,怎么精确怎么来 */
  	}
}
//注:因为我手上没有转接板,此处程序没有经过验证,知识提供思路,具体需要具体分析。多思考

对PCA有任何疑问的可以参照STC15F2K60S2手册进行查找。

本文地址:https://blog.csdn.net/qq_37429313/article/details/107942703