资源简介
我们知道超声波在空气中的传播速度为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
相关资源
- STC15/STC15F2K60S2/STC15W4K32S4系列读取超声
- AD7708驱动程序
- LCD12864 驱动程序1
- STC15F2K60S2 iic 驱动程序
- SHT75温湿度气压传感器驱动程序
- 51单片机超声波测距HC-SR04程序
- ILI9486TFT驱动程序C51
- silicon 单片机 PWM 马达控制
- altera DE0开发板驱动程序完美解决无法
- TLC5615 STM32驱动程序
- ads1246驱动程序
- linux下cp2101/2102驱动
- FX PLC USB-SC09 驱动 CH340/CH341USB转串口
- MSP430F5529LP下的0.96寸7针OLED显示驱动程
- CC2530与HC-SR04超声波模块通信
- STM32的12864驱动程序(免积分)
- M-150针打驱动程序
- 两相步进电机驱动程序及原理图
- 51单片机的OV7670摄像头驱动程序
- iMX6 EIM总线驱动程序
- lvds_ctr_top 用verilog编写的LVDS接口驱动
- 多磨川绝对值编码器FPGA接口
- 带温度测量的CCD驱动程序
- ZTE中兴U985手机USB驱动程序 官方版
- 中兴N606手机USB驱动程序 官方版
- ZTE中兴U956手机USB驱动程序 官方版
- 中兴手机v970 usb驱动程序 免费版
- 中兴U830手机USB驱动程序 简体中文版
- 中兴ZTE Q505T手机USB驱动程序 官方版
- 51单片机DHT11程序
评论
共有 条评论