HC-SR04超声波测距探讨
admin 于 2013年05月18日 发表在 嵌入式开发笔记
1. 测量原理:
利用两个端口分别作为发射及接收口,通过对电平高低变化的捕捉,计算出高电平持续时间。
2. 距离公式:
距离=(高电平持续时间*声速(340M/S)/2)
void StartModule_1()
{
TRIG_1=1; //启动一次模块
delay(5);
TRIG_1=0;
}
void Conut(void)
{
time=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=0;
S=(time*1.7)/100; //算出来是CM
}
void chaoshengbo_ceju1(void)
{
StartModule_1();
while(!ECHO_1); //当RX为零时等待
TR0=1; //开启计数
while(ECHO_1); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
S1=S;
}TRIG(控制端):电平由0 -> 1 TTL电平持续至少10Us,启动超声波模块;若启动,则模块自动发送8个40Khz的方波,并自动检测是否有信号返回。
ECHO(接收端):利用程序中: while(!ECHO_1); 等待回响信号发生跳变(遇到障碍物后反射)
ECHO_1从 0 -> 1 TTL电平时,打开计时器,直到电平由1 -> 0 ,记录高电平持续的时间,即:超声波从发射到返回的时间。
3. 模块电路图:

4. 时序图:

5. 源码:点击下载附件
/************************超声波传感器驱动函数*************************/
/***************使用液晶LCD1602显示测量距离,显示单位:厘米cm***********/
/*模块的四位引脚:TRIG/ECH0分别连普通IO口,VCC和GND接JPW电源扩展接口**/
#include<reg52.h>
unsigned long S1,S2;
unsigned long S;
unsigned int time;
bit flag=0;
// 定义转弯指示灯
sbit rled = P0^4;
sbit lled = P1^4;
// 定义左边超声波传感器的变化
sbit lcsb1 = P0^0;
sbit lcsb2 = P0^1;
// 记录右边超声波传感器的变化
sbit rcsb1 = P0^2;
sbit rcsb2 = P0^3;
// 定义超声波模块1引脚
sbit ECHO_1 = P1^0;
sbit TRIG_1 = P1^1;
// 定义超声波模块2引脚
sbit ECHO_2 = P1^2;
sbit TRIG_2 = P1^3;
// 定义延迟函数
void delay(unsigned char t)
{
unsigned char i;
unsigned int j;
for (i = 0; i < 110; i++)
for (j = 0; j < t; j++);
}
// 超声波传感器计数函数
void Conut(void)
{
time=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=0;
S=(time*1.7)/100; //算出来是CM
}
// 定时器0中断服务函数
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
// 启动超声波传感器模块函数
void StartModule_1()
{
TRIG_1=1; //启动一次模块
delay(5);
TRIG_1=0;
}
void StartModule_2()
{
TRIG_2=1; //启动一次模块
delay(5);
TRIG_2=0;
}
// 超声波传感器模块及中断初始化
void chaoshengbo_init(void)
{
TMOD=0x11; //设T0、T1为方式1
TH0=0;
TL0=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET0=1; //允许T0、T1中断
ET1=1;
TR1=1;
EA=1; //开启总中断
}
// 超声波传感器对外接口函数
void chaoshengbo_ceju1(void)
{
StartModule_1();
while(!ECHO_1); //当RX为零时等待
TR0=1; //开启计数
while(ECHO_1); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
S1=S;
}
void chaoshengbo_ceju2(void)
{
StartModule_2();
while(!ECHO_2); //当RX为零时等待
TR0=1; //开启计数
while(ECHO_2); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
S2=S;
}
void main(void)
{
chaoshengbo_init();
S1=S2=0;
lled = 1;
rled = 1;
lcsb1 = lcsb2 = 1;
rcsb1 = rcsb2 = 1;
while(1)
{
if((S1>=1)&&(S1<=20))
{
delay(10);
if((S1>=1)&&(S1<=20))
{
lcsb1 = 0;
lcsb2 = 0;
lled = 0;
}
}
else
{
lcsb1 = 1;
lcsb2 = 1;
lled = 1;
}
if((S2>=1)&&(S2<=20))
{
delay(10);
if((S2>=1)&&(S2<=20))
{
rcsb1 = 0;
rcsb2 = 0;
rled = 0;
}
}
else
{
rcsb1 = 1;;
rcsb2 = 1;
rled = 1;
}
}
}
void T1_time() interrupt 3 //定时器1中断服务程序,没50ms调用一次超声波测距
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
chaoshengbo_ceju1();
chaoshengbo_ceju2();
}
注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。
标签:HC-SR04超声波模块,keil4,电路开发,MCU使用
