【蓝桥杯单片机】超声波模块(测距原理,驱动方式)
实验开发板为CT107D蓝桥官方板,编译环境为MDK5
超声波探头测距原理:
发射头发射超声波,遇到障碍物后返回,接收探头接受到返回信号。
两个动作产生的时间差可以是我们根据声音在空气中传播的速度来(大约340m/s)推算距离(注意:一来一回是两次的距离)。
在编写程序前首先要了解超声波模块在CT107D上的驱动方式:
- 向超声波模块发送8次脉冲蓝桥板子上的探头需要的为40KHZ的脉冲具体操作见代码
- 检测是否接受到回应(且定时器未达最大值)
- 根据时间计算距离
TIPS:
由于采用16位定时器使时间有最大值,也使得距离有最大值
注意超声波读取频率不能太高,最好间隔200ms读取一次
#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