资源简介

我们知道超声波在空气中的传播速度为0.34mm/us,这样只要能够精确计算高电平的持续时间,测量精度就能够达到0.34mm。 具体的高精度算法我已经写到程序里面了,需要的同学可以点击下载HC-SR04超声波模块驱动程序

资源截图

代码片段和文件信息

#include “SR04.h“
/**********************************************************************
/*----------------    1.开发环境:Keil v5      ----------------*/
/*----------------    2.使用单片机型号:STC89C52R      ----------------*/
/*----------------    3.单片机使用晶振:11.0592M      ----------------*/
/*接线方式                                                            */
/*连接线图:                                                          */
/*       ----------------------------------                          */
/*       | TRIG ----- P1.2 |ECH0 -----P1.1|                          */
/*       ----------------------------------                          */
/*                                                                   */
/*                                                                   */
//测量数据
//Count/2       us       us/2     us/2 / Count/2
//306           668      334          1.0915
//292           636      318          1.0890
//270           588      294          1.0888
//254           552      276          1.0866
//247           540      270          1.0931
//216           472      236          1.0925
//366           796      398          1.0874
//404           880      440          1.089
//340000 mm/1000000us =0.34mm/us


/*[注:AT89x51使用12M或11.0592M晶振实测使用11.0592M]
/* 文件历史:
/* 版本号     日期       作者    说明
/* v0.1    2018-03-24   Pang  创建该文件
/*===================================================================*/
unsigned int  time = 0;
unsigned int  timer = 0;
float         S = 0;
bit           SRflag = 0;
/********************************************************/
void Conut(void)
{
time = TH0 * 256 + TL0;
TH0 = 0;
TL0 = 0;

/*S=(float)time/2;//算出来是mm
S=S*1.089;
S=S*0.34;//mm
S=time*0.5*1.089*0.34;
*/
S = (float)time * 0.18513; //一次性算完,提高效率;

if(SRflag == 1)   //超出测量
{
SRflag = 0;
//  printf(“-----\n“);
}

}
/********************************************************/

/********************************************************/
void zd0() interrupt 1   //T0中断用来计数器溢出超过测距范围
{
SRflag = 1;  //中断溢出标志
}
/********************************************************/
void  StartModule()           //T1中断用来扫描数码管和计800MS启动模块
{
TX = 1;                //800MS  启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX = 0;
}

void SR04Init(void)
{
TMOD |= 0x01; //定时器1方式1,计数与否不受P3.3的影响
TH0 = 0;
TL0 = 0; //定时器1的计数起点为0
TR0 = 0; //启动定时器1
//ET0=1;  //TF0 如果这个标志为1,进入中断子函数

EA = 1; //开启总中断
}
/********************************************************/
float getDistance(void)
{
StartModule();
while(!RX); //当RX为零时等待
TR0 = 1;   //开启计数
while(RX); //当RX为1计数并等待
TR0 = 0; //关闭计数
Conut(); //计算
return S;

}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        3124  2018-05-01 14:00  SR04.c
     文件         250  2018-05-01 14:00  SR04.h

评论

共有 条评论