目录
前言:
2022.8.10持续学习单片机原理及其应用
HC-SR04硬件概述:
HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器,将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们,它将产生一个输出脉冲,其宽度可用于确定脉冲传播的距离。
HC-SR04引脚介绍:
- VCC 是HC-SR04超声波距离传感器的电源。
- Trig (Trigger) 引脚用于触发超声波脉冲。
- Echo 回声当接收到反射信号时,引脚产生一个脉冲。脉冲的长度与检测发射信号所需的时间成正比。
- GND:公共地
HC-SR04的超声波测距模块工作原理:
当单片机施加给Trig 引脚一个10us的TTL信号,超声波模块内部产生以40 KHz发射八个脉冲的声音脉冲。(这种8脉冲模式使设备的“超声特征”变得独一无二,从而使接收器能够将发射模式与环境超声噪声区分开)一经模块内部发送完8个脉冲信号,与此同时,Echo 回响信号产生一段持续的高电平时间(即超声波到达被测物体并返回的时间,软件操作中可由定时器读取时间)
综上可知,距离=Echo 持续产生高电平时间*340m/s/2
软件设计:
超声波初始化函数:(代码如下)
//函数名:定时器0初始化(未使用中断)
//形参变量:无
//返回值return:无
void time0_init(void)
{
TMOD &=0XF0;
TMOD |=0X01;
TH0=0X00;
TL0=0X00;
TR0=0;//关闭定时器
}
//函数名:超声波模块初始化
//形参变量:无
//返回值return:无
void ultrzsonicwave_init(void)
{
TRIG=0;
ECHO=0;
time0_init();//定时器0初始化
}
超声波测距模块:(代码如下)
unsigned int ultrzsonicwave_distance(void)
{
unsigned int distance;
unsigned char i,j;
float distance_time[10],time_sum=0,temp;
for(i=0;i<10;i++)//获取10组测距时间
{
TRIG=1;
delay_10us(2);//高电平持续时间大于10us
TRIG=0;//触发信号发送完毕
while(ECHO==0);//等待回响信号高电平(上升沿)
TH0=0X00;
TL0=0X00;//清零
TR0=1;//打开定时器0
while(ECHO==1);//等待回响信号低电平(下降沿)
TR0=0;//关闭定时器
distance_time[i]=((TH0<<8) |TL0)*1.085;//测距时间(时间单位:us)
delay_ms(80);//控制数据更新变化的快慢
}
for(i=9;i>0;i--)//冒泡排序(升序)
{
for(j=0;j<i;j++)//针对数组中的10个元素进行升序排列
{
if(distance_time[j]>distance_time[j+1])//如果数组中靠前元素大于靠后元素,较大元素靠后放置(即元素数据有小到大排序升序)
{
temp=distance_time[j];
distance_time[j]=distance_time[j+1];
distance_time[j+1]=temp;
}
}
}
for(i=2;i<8;i++)//丢弃前后各两个最小/最大值
{
time_sum+=distance_time[i];
}
distance=(time_sum/6)*0.00034/2*100;//得到测定距离cm(获取其整数部分)
return distance;
}