资源简介
我们知道超声波在空气中的传播速度为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
相关资源
- elantech触控板驱动程序 v13.6.11 官方最
- USB转串口驱动,FT232R驱动程序,最新
- WinCE下CP210x的驱动程序
- RA8806液晶驱动程序
- STM32F103 DS18B20 V3.5.0固件库驱动程序工
- windows ce 系统的GPIO驱动程序
- 2440 cs8900a 网卡驱动程序
- 探讨研华32位DLL驱动程序
- 多普达USB Modem驱动(适用于818、828、
- SX126x_LORA驱动程序(包含完整的工程文
- ch452串口键盘驱动程序
- Vxworks下网卡驱动程序的开发
- EESkill NRF24L01 无线模块用户手册
- USB转串口(RS232/RS485/RS422)驱动程序文
- 映泰Biostar TA870网
- ASUS华硕K45VD|A45VD主板驱动程序 v9.3.0
- 华硕ASUS K42JZ BIOS主板驱动程序 v9.1.1
- ASUS华硕B85主板BIOS驱动程序 官方版
- Samsung三星R439-DS系列网卡驱动程序 v
- 索尼SONY VPCM125JC网卡驱动程序 v6.0.14
- 清华同方手写板万能驱动程序
- ASUS华硕a550笔记本电脑网卡驱动程序
- oppo智能手机adb驱动程序
- ACS读卡器USB驱动程序 v4.0 官方版
- 基于STM32F103C8单片机的晶联讯电子JL
- 手机usb通用驱动程序(手机USB万能驱
- broadcom 802.11g 网络适配器驱动程序 v
- 英特尔USB3.0可扩展主机控制器驱动程
- TD-SCDMA网络测试仪中E1数据采集卡的驱
- Lenovo ThinkPad T42笔记本电脑声卡驱动程
评论
共有 条评论