HC-SR04超声波测距 -c52单片机

一、前期准备
单片机:STC89C52RC
开发环境:keil4
HC-SR04模块:淘宝有售
**
在这里插入图片描述

基本工作原理

**:
(1)采用 IO 口 TRIG 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

2.实现思路:

  • 直接给trig持续10us的高电平,然后读取ECHO引脚是否为高电平,若为高电平,则开启定时器,然后继续检测等待其为低电平的时候,获取时间值,然后带入公式进行计算距离。

main.c

#include"reg52.h"
#include"UART_INIT.h"
#include<stdio.h>
int main()
{ 
	char buf[24];
	initDate9600();	
	send("a");
	while(1)
	{	 
		CSB_Init();
		sprintf(buf,"buf=%fcm\r\n",CSB_GetOnce());
		send(buf);
		delay(20);
	}

	return 0;
}

UART_INIT.c(超声波.c)

#include"reg52.h"
#include"UART_INIT.h"
#include<stdio.h>
sbit Echo=P1^0;//接受端
sbit Trig=P1^1;//控制端
void initDate9600()
{
	SCON=0x50;
	TMOD=0x20;
	TH1=0xFD;
	TL1=0xFD;
	TR1=1;
	ES=1;
	EA=1; 
}
void initDate115200()
{
	SCON=0x50;
	T2CON=0x1<<4|0x1<<5;
	TH2=0xFF;
	TL2=0xFD;
	RCAP2H=0xFF;
	RCAP2L=0xFD;
	TR2=1;
	ES=1;
	EA=1; 
}
void send(char *pstr)
{
	while(*pstr!='\0')
	{
		SBUF=*pstr;
		pstr++;
		while(TI=!1);
		TI=0;
		delay(5);	
	}
		
}
void Delay10us()
{
	TMOD|=0x1;
	TH0=0xff;
	TL0=0xf6;
	TR0=1;
	//while(!TF0);
	//TR0=0;		
}
void CSB_Rstart()//启动模块
{
	Trig=0;
	Trig=1;
	Delay10us();
	Trig=0;
}
void CSB_Init()
{
	TMOD|=0x01;
	TH0=0;
	TL0=0;
}

float CSB_GetDistance()
{
	unsigned int time=TH0*256+TL0;//得到总时间,单位us
	float distance=(float)(time*0.017);
	TH0=0;
	TL0=0;//清空定时器
	return distance;
}
void starttime()
{
	//TH0=0;
	//TL0=0;
	TR0=1;
}
float CSB_GetOnce()//得到一次超声波测距模块的距离
{
	CSB_Rstart();
	while(!Echo);//当Echo为零时等待
	starttime();//开启计数
	while(Echo);//当Echo为1计数并等待
	TR0=0;//关闭计数
	return CSB_GetDistance();//计算
}
 

UART_INIT.h(超声波.c)

#ifndef _UART_INIT_
#define _UART_INIT_

void initDate9600();
void send(char *pstr);
void initDate115200();
void Delay10us();
void CSB_Rstart();
void CSB_Init();
float CSB_GetDistance();
float CSB_GetOnce();
void starttime();
#endif 	
  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值