![c644e53878add3cb456f7e4df554f9e1.gif](https://img-blog.csdnimg.cn/img_convert/c644e53878add3cb456f7e4df554f9e1.gif)
1、HC-SR04超声波模块工作原理
(1)采用IO口触发测距,给至少10us高电平脉冲;
(2)模块自动发送八个40khz方波,并自主检测是否有电波返回;
(3)当有信号返回时,通过IO口输出一个高电平,高电平的持续时间就是超声波从发送到返回的时间;
(4)测距公式:距离=(高电平时间*声速)/2;
![548244eb85f72ccedf1afd6ef6214ef7.png](https://img-blog.csdnimg.cn/img_convert/548244eb85f72ccedf1afd6ef6214ef7.png)
超声波模块的时序图
(5)工作原理分析
![bf520089da85bdc64127bbf5956e3c40.png](https://img-blog.csdnimg.cn/img_convert/bf520089da85bdc64127bbf5956e3c40.png)
英语啥的我也看不懂呐
![0275844b8b20f45a29a1e69ec25189fd.png](https://img-blog.csdnimg.cn/img_convert/0275844b8b20f45a29a1e69ec25189fd.png)
差不多就是这个意思
![946505b230e81b2a8133313ff4a9a1bc.png](https://img-blog.csdnimg.cn/img_convert/946505b230e81b2a8133313ff4a9a1bc.png)
2、使用元器件如下
![7de0bca757baaef3d844200851556c84.png](https://img-blog.csdnimg.cn/img_convert/7de0bca757baaef3d844200851556c84.png)
超声波模块和蓝牙模块
![2ba5aa9a357c361fbe17d8bcba0f96d3.png](https://img-blog.csdnimg.cn/img_convert/2ba5aa9a357c361fbe17d8bcba0f96d3.png)
加上51单片机后的连接图
![4262885093073a2e16bf19760678b28f.png](https://img-blog.csdnimg.cn/img_convert/4262885093073a2e16bf19760678b28f.png)
3、开始运行时的工作状态
![82f7093ece967511ebbc5ed8dcc12c6e.png](https://img-blog.csdnimg.cn/img_convert/82f7093ece967511ebbc5ed8dcc12c6e.png)
哇哦还是蛮准的嘛,允许一丢丢误差
把障碍物放在距离超声波模块前方的14cm左右(当然放多远是无所谓的,这里就以14cm为例吧!),根据单片机计算出来的值,由蓝牙模块发送到手机上面。
嘿嘿不晓得这样说有没有说清楚,这差不多就是我的理解吧!
这时候要用个手机软件(当然用电脑也是ok的啦,也需要一个蓝牙串口的软件),俺用的是下面这个➡️
![022d549207451cf56da4b75e48723bb9.png](https://img-blog.csdnimg.cn/img_convert/022d549207451cf56da4b75e48723bb9.png)
偷偷告诉你豌豆荚可以下
![d7dc967e652c2c06c226b3e832f0fe16.png](https://img-blog.csdnimg.cn/img_convert/d7dc967e652c2c06c226b3e832f0fe16.png)
4、上主菜
#include
#include
#include //c语言库
#define uchar unsigned char
#define uint unsigned int
#define ECHO P1_1 //echo 接线:模块TRIG接 P1.2 ECH0 接P1.1
#define TRIG P1_0 //trig
unsigned int time=0;
float S=0;
bit flag =0;
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100; //算出来是CM
if(flag==1) //超出测量
{
flag=0;
printf("--------");
}
printf("S=%5.2fcm",S);
}
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void zd0() interrupt 1 //T0中断计数器溢出
{
flag=1; //中断溢出标志
}
void StartModule() //T1中断用来扫描
{
int i;
TRIG=1; //启动一次模块
for(i=0;i<21;i++)
{
_nop_();
}
TRIG=0;
}
void main(void) //主工作区
{
TMOD=0x21; //T0为方式1 GATE=1;
SCON=0x50; //SCON是单片机串行口控制寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态。
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1; //TI是串口送数据完成标志
EA=1; //开启总中断
while(1)
{
StartModule(); //启动模块
while(!ECHO); //当ECHO为零时
TR0=1; //开启计数
while(ECHO);//当ECHO为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
delayms(50); //500ms = 0.5s
}
}
![c9415bcd72428b506fe4805421006f75.png](https://img-blog.csdnimg.cn/img_convert/c9415bcd72428b506fe4805421006f75.png)
下次见
2020.05.16
![73d3c790bf5550e1cd899c221efbfa4c.png](https://img-blog.csdnimg.cn/img_convert/73d3c790bf5550e1cd899c221efbfa4c.png)
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧··END·‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧