C51--超声波测距
超声波测距
1、简介
超声波模块是用来测距的一种产品,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。
型号:HC-SR04
可测距离:2cm——400cm非接触距离感测
测距精度:3mm
接线参考:模块除了两个电源引脚外,还有TRIG,ECHO引脚,这两个分别接开发板的P1.5和P1.6端口
VCC - 5v
GND - 接地
TRIG - P1.5口(发送波)
ECHO -P1.6口(接收波)
2、发送波返回波
给TRIG一个10us的高电平就可以触发发波
ECHO由低电平跳转到高电平表示开始发送波,
ECHO由高电平跳转到低电平表示波返回
3、计算时间
(ECHO高电平持续的时间)
波发出去,开始计算时间,启动定时器;
波返回时,停止计时器,计算出中间经过的时间。
4、计算距离
距离=(时间)*波的速度(340m/s)/ 2
5、代码实现
十进制左移一位相当于乘以10。例:2左移一位为20
二进制左移一位相当于乘以2. 例:1左移一位为10(十进制的2)
左移8位,相当于乘以2的8次方 = 256
/*
1、给TRIG一个10us的高电平就可以触发发波
2、ECHO由**低电平跳转到高电平**表示开始发送波,开始启动定时器
3、ECHO由**高电平跳转到低电平**表示波返回,停止定时器。
4、计算中间经过的时间
5、计算距离:距离=(时间)*波的速度(340m/s)/ 2
*/
#include "reg52.h"
//距离小于10cm,D5亮,D6灭,反之相反
sbit D5 = P3^7;
sbit D6 = P3^6;
sbit Trig = P1^5;
sbit Echo = P1^6;
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void startHC()
{
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
}
void Time0Init()
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01;
TH0 = 0;
TL0 = 0;
//设置定时器0工作模式1,初值设定为0开始数数,不着急启动定时器
}
/*
十进制左移一位相当于乘以10。例:2左移一位为20
二进制左移一位相当于乘以2. 例:1左移一位为10(十进制的2)
左移8位,相当于乘以2的8次方 = 256
*/
void main()
{
double time;//时间
double dis;//距离
Time0Init();//定时器
while(1){
startHC(); //给TRIG一个10us的高电平
while(Echo == 0); //ECHO由**低电平跳转到高电平**表示开始发送波
TR0 = 1; //波发送时启动定时器
while(Echo == 1); //ECHO由**高电平跳转到低电平**表示波返回
TR0 = 0; //波回来时关闭定时器
time = (TH0 * 256 + TL0)*1.085; //计算中间经过的时间,以 um 为单位
dis = time * 0.017;
//距离=(时间)*波的速度(340m/s)/ 2 ; 340m/s = 34cm/ms = 0.034cm/us
if(dis < 10){
D5 = 0;
D6 = 1;
}else{
D5 = 1;
D6 = 0;
}
//定时器数据清零,方便下一次测距
TH0 = 0;
TL0 = 0;
}
}