STC15单片机使用HC-SR04超声波测距模块

2019-05-22来源: eefocus关键字:STC15  单片机  HC-SR04  超声波测距模块

【HC-SR04】

HC-HR04超声波测距可提供2cm-400cm的非接触式距离感测功能,测距精度可达3mm。


基本工作原理

1、采用IO口TRIG触发测距,给最少10us的高电平信呈。


2、模块自动发送8个40KHz的方波,自动检测是否有信号返回。


3、有信号返回,通过IO口ECHO输出一个高电平,高电平持续时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340m/s))/2.



时序图


以上时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将:发出8个40kHz周期电平并检测回波。一.旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式: uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S) /2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。



【程序】

我使用的是STC15F2K60S2单片机,内部晶振设置12M。以下程序省略管脚定义等无关语句,仅提供程序思路供参考。


uchar Flag_hypertelorism = 0; //超声波距离过远标志

float distance = 0;

uchar Flag_Fucker = 0; //超声波开启标志

 

void main()

{

    Time0_Init();

    Time1_Init();

    while(1)

    {

        if(Flag_Fucker == 1)

            Ultrasonic();

    }

}

 

/*初始化定时器0*/

void Time0_Init(void)

{

// AUXR |= 0x80;                   //定时器0为1T模式

AUXR &= 0x7f;                   //定时器0为12T模式

    TMOD = 0x00;                    //设置定时器为16位自动重装载

    TL0 = 0x60;                     //初始化计时值 4ms

    TH0 = 0xF0;

    TR0 = 1;                        //定时器0开始计时

    ET0 = 1;                        //使能定时器0中断

    EA = 1;

}

 

//定时器1初始化

void Time1_Init()

{

// AUXR |= 0x40;                   //定时器1为1T模式

AUXR &= 0xdf;                   //定时器1为12T模式

    TMOD = 0x00;                    //设置定时器1为16位自动重装载

    TL1 = 0x60;                     //初始化计时值 4ms

    TH1 = 0xF0;

//  TR1 = 1;                      //暂时不开启定时器1计时

ET1 = 1;                        //使能定时器1中断

    EA = 1;

}

 

/*定时器0中断*/

void Time0 () interrupt 1

{

static uchar time = 0;

// 自动装载模式下可省略

// TL0 = T0MS; 

//  TH0 = T0MS >> 8;

time++;

if(time == 25) //100ms测距一次

{

time = 0;

Flag_Fucker = 1;

}

}

 

//定时器1溢出中断

void Time1() interrupt 3

{

Flag_hypertelorism = 1; //超声波距离过远

}

 

//超声波测距

void Ultrasonic()

{

uchar i;

Trig = 1; //超声波触发信号开启

_nop_(); //延时10us以上

i = 30;

while(--i);

Trig = 0; //超声波触发信号关闭

while(!Echo); //Echo为0时等待

TR1 = 1; //开启定时器1计时

while(Echo == 1 && TF1 == 0); //Echo为1时等待

TR1 = 0; //关闭定时器1计时

Distance_Count(); //计算距离

Flag_Fucker = 0; //关闭超声波测距

}

 

//距离值计算

void Distance_Count()

{

float Text_time = 0;

if(Flag_hypertelorism == 0)

{

Text_time = ((TH1 - temp_TH) * 256 + (TL1 - temp_TL)) / 2.0;

TL1 = 0x60;                     //初始化计时值 4ms

TH1 = 0xF0;

distance = Text_time * 0.34; //单位mm

}

else

{

distance = 9999;

Flag_hypertelorism = 0;

}

}



关键字:STC15  单片机  HC-SR04  超声波测距模块 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462581.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机使用槽型光耦测速模块
下一篇:STC15F2K60S2设置内部时钟工作频率

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC15w4k58s4单片机4串口同时收发例程
STC15w4k58s4 芯片的4串口同时收发例程单片机源程序如下:#include "intrins.H"#include "uart.H"#define uchar unsigned  char#define uint  unsigned   intuchar uart1buf[6]={0xa5,0x5a,0x4a,0xf8,0xff,0xff};uchar uart2buf[6]={0xa5,0x5a,0x4a,0xf8,0xff,0xff};uchar uart3buf[6]={0xa5,0x5a,0x4a,0xf8,0xff,0xff};uchar
发表于 2019-11-11
STC15单片机ADC温敏电阻测温源程序
品诺电子STC15W4K-实验29-ADC温敏电阻测量温度单片机源程序如下:/************************************************************************************** 实验平台:品诺电子STC15W4K核心板 + 品诺电子"开拓者"扩展板* 时钟选择:内部IRC时钟22.1184M* 功能说明:该实验通过ADC功能,使用扩展板上的温敏电阻测量当前温度,温度值显示在数码管上。温敏电阻相对于DS18B20温度传感器,价格低
发表于 2019-11-11
STC15F2K60S2单片机调试超声波HC-SR04测距经验
经过一天的调试,终于把STC15F2K60S2单片机测量超声波HC-SR04的程序搞定,主要存在问题是:  1、单片机时钟设置为22.1184MHz,而且采取1T模式运行时,触发信号维持10us以上时间要采用延时函数 Delay_us(250)并一定达到10us以上。  2、等待回声接收的引脚echo要开启接收,即echo=1;  3、触发信号发出后不能马上开启计数器计数,一定要等到有回声信号时(echo被置为高)才开启,为了防止回声信号一直不出现,增加超时退出。  4、测量时间(echo维持高电平时间)也增加超时退出,否则程序出现死机。 
发表于 2019-11-09
stc12c5a60s2 0-30电压测量 有注释
#include <STC12C5A60S2.H>#include "intrins.h"#define uchar unsigned char#define uint  unsigned int#define ulong unsigned long/*Define ADC operation const for ADC_CONTR*/#define ADC_POWER   0x80            //ADC 电源控制位  10000000  0X80  /#define
发表于 2019-11-08
STC15W4K单片机内部ADC温敏电阻测量温度
单片机源程序如下:/************************************************************************************** 实验平台:品诺电子STC15W4K核心板 + 品诺电子"开拓者"扩展板* 时钟选择:内部IRC时钟22.1184M* 功能说明:该实验通过ADC功能,使用扩展板上的温敏电阻测量当前温度,温度值显示在数                               
发表于 2019-11-06
基于STC89C52RC单片机制作的频率及占空比均可调程序
注意  单片机必须是52rc不能用60s2*/#include"main.h"#include"peizhi.h"#include"smg.h"#include"eeprom.h"sfr WDT_CONTR=0XE1;unsigned char HighRH = 0;  //高电平重载值的高字节unsigned char HighRL = 0;  //高电平重载值的低字节unsigned char LowRH  = 0;  //低电平重载值的高字节unsigned char LowRL  = 0
发表于 2019-11-06
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved