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;
	}
	
} 

你可能感兴趣的:(STC51,单片机,嵌入式硬件,51单片机)