【蓝桥杯单片机】超声波模块(测距原理,驱动方式)

实验开发板为CT107D蓝桥官方板,编译环境为MDK5

超声波探头测距原理:
发射头发射超声波,遇到障碍物后返回,接收探头接受到返回信号。
两个动作产生的时间差可以是我们根据声音在空气中传播的速度来(大约340m/s)推算距离(注意:一来一回是两次的距离)。

在编写程序前首先要了解超声波模块在CT107D上的驱动方式:

  1. 向超声波模块发送8次脉冲蓝桥板子上的探头需要的为40KHZ的脉冲具体操作见代码
  2. 检测是否接受到回应(且定时器未达最大值)
  3. 根据时间计算距离
    TIPS:
    由于采用16位定时器使时间有最大值,也使得距离有最大值
    注意超声波读取频率不能太高,最好间隔200ms读取一次
    【蓝桥杯单片机】超声波模块(测距原理,驱动方式)_第1张图片【蓝桥杯单片机】超声波模块(测距原理,驱动方式)_第2张图片【蓝桥杯单片机】超声波模块(测距原理,驱动方式)_第3张图片
#include "Dis.h"


void Delay13us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

void InitSonic()//初始化定时器1,暂时不启动
{
	TMOD = (TMOD & 0x0F) | 0x10;
	
	TF1 = 0;
	TR1 = 0;
}

void SendWave()//发送八段脉冲波(40Khz)
{
	u8 i = 8;
	
	while(i --)
	{
		Snoic_Txd = 1;
		Delay13us();
		Snoic_Txd = 0;
		Delay13us();
	}
}

void Dis_Get()
{
	u16 time, distance;
	
	EA = 0;
	SendWave();
	EA = 1;
	TH1 = 0;
	TL1 = 0;
	TR1 = 1;
	while((Snoic_Rxd) && (TF1 == 0));
	TR1 = 0;
	
	if(TF1 == 1)
	{
		TF1 = 0;
		SMG_Buff[4] = 0xBF;
		SMG_Buff[5] = 0xBF;
		SMG_Buff[6] = 0xBF;
		SMG_Buff[7] = 0xBF;
	}	
	else
	{
		time = (TH1 * 256) + TL1;
		distance = (u16)((time * 0.17 * 12) / 11.0592);//本身数值乘以0.17公式是官方给的对于12MHZ的晶振的由于实际使用的是11.05926MHZ所以这么算
		SMG_Buff[4] = SMG[(distance / 1000) % 10];
		SMG_Buff[5] = SMG[(distance / 100) % 10];
		SMG_Buff[6] = (SMG[(distance / 10) % 10]) & 0x7F;
		SMG_Buff[7] = SMG[(distance % 10)];
	}
}
/***********************************Dis.h**************************/
#ifndef _DIS_H
#define _DIS_H

#include "config.h"
#include "SMG.h"

sbit Snoic_Txd = P1^0;
sbit Snoic_Rxd = P1^1;

extern void Delay13us();	
extern void InitSonic();
extern void SendWave();
extern void Dis_Get();

#endif

你可能感兴趣的:(蓝桥杯单片机)