datasheet

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://www.eeworld.com.cn/mcu/ic462581.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

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

推荐阅读

STC单片机知识点

1.单片机内部三大资源:FLASH(程序存储空间也叫ROM),RAM(内存),SFR(特殊功能寄存器)。我们对单片机的操作基本都是对SFR的操作。2.stc89c52 特点:8K FLASH,512B RAM,1个UART,2个定时器,8个中断源,P0口无上拉功能。3.对FLASH的写操作,一般都是按页擦除,只有先把一页数据擦除后 才能写入,相当于先把数据清理后才能写。4.对于一款新的单片机,要用sizeof,测试char,short,int等类型所占的空间大小。
发表于 2019-06-03

STC单片机常用型号

一:STC15W204S系列有8脚、16脚,具体应用参考STC15系列单片机手册。二:STC15W401AS系列有SOP16、SOP20、SOP28,具体应用参考芯片手册。
发表于 2019-06-03
STC单片机常用型号

STC89C52RC单片机实现串口打印功能

stc的89c52rc型号开发板,晶振是12m。是因为买的最小系统就是这个频率。使用波特率位9600,将TL、TH都设置成0xfd后不管是英文还是中文的都是乱码。12M的晶振波特率只能是2400,9600的情况下会有7.8%的误差,所以会产生乱码,而2400波特率的情况下误差是0.16%,这样就不会产生乱码了,TH1和TL1都设为F3为什么51单片机的晶振一般使用11.0592?用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率
发表于 2019-06-03

STC12C5A60S2_PWM

#include <reg52.h>#include <intrin.h>#define uint unsigned int #define uchar unsigned charsfr CCON = 0XD8;sbit CCFO = CCON^0;sbit CCF1 = CCON^1;sbit CR = CCON^6;sbit CF = CCON^7;sfr CMOD = 0XD9;sfr CL = 0XE9;sfr CH = 0XF9;sfr CCAPM0 = 0XDA;sfr CCAP0L = 0XEA;sfr CCAP0H = 0XFA;sfr CCAMP1 = 0XDB;sfr CCAP1
发表于 2019-06-01

STC15F2K60S2设置内部时钟工作频率

STC15F2K60S2系列单片机有两个时钟源,一个是内部高精度R/C时钟,另一个是外部时钟(外部输入的时钟或者外部晶体振荡产生的时钟)。STC15F2K60S2的内部集成高精度R/C时钟,+/-1%温漂,常温下温漂5%,5MHz~35MHz宽范围可设置,可彻底省去昂贵晶振电路和外部复位电路。设置单片机内部高精度R/C时钟,在程序中包含下面代码。#define FOSC                11059200L                   
发表于 2019-05-22
STC15F2K60S2设置内部时钟工作频率

STM32L0xx_HAL_Driver库的使用——UART

单片机型号:STM32L051C8T6开发环境MDK5.12库版本:STM32L0xx_HAL_Driver V1.1.0主机环境:Windows XP之前一直使用的STM32F030C8T6单片机来做开发,因需求更改更换了一个新型号STM32L051C8T6,主要是用到了其低功耗特性,本以为直接把代码拷贝一下就可以使用了,结果是太天真了,STM32F030C8T6使用的库是STM32F0_StdPeriph_Lib而STM32L051C8T6使用的库是STM32L0xx_HAL_Driver两者的差别还是很大的,而且官方也推荐使用后者,没办法,重新学习一下吧。。。参考其例程磕磕绊绊的勉强可以写一个工程了,这里写一下有关UART
发表于 2019-06-15

小广播

何立民专栏

单片机及嵌入式宝典

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

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