一、前期准备
单片机: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