1)引脚和原理:
该模块有VCC、GND、Trig和Echo针脚。
TRIG是输出和ECHO是输入。
该模块的工作原理为,先向TRIG脚输入至少10us的触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则ECHO输出高电平回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式: 距离=高电平时间*声速(340M/S)/2。
2)实现功能:
通过超声波模块测距离,并将测试距离显示到串口助手上。
3)工具:
超声波模块、51单片机、定时器模块、串口
3)代码:
#include<reg52.h>
#include<stdio.h>
unsigned int time;
char buf[32]={0};
float distance;
sbit TRIG=P1^0; //超声波上引脚TRIG,接单片机引脚
sbit ECHO=P1^1;//ECHO 接单片机引脚
void delay() //延时函数
{
int i;
for(i=0;i<5000;i++);
}
void inputstr(char character ) //串口输入输出存放数据,输出一个字符
SBUF=character;
}
void inputstring(char *p) //串口输入输出存放数据,输出一串字符
{
while(*p!=’\0’){
inputstr(*p);
p++;
delay();
}
}
void initUART_115200() //初始化串口,使用波特率115200
{
SCON = 0x50; //0101 0000 方式一
TH2=0xFF;
TL2=0xFD;
RCAP2H=0xFF;
RCAP2L=0xFD;
T2CON=0x34; //波特率115200 算法巩固
}
void init_timer() //定时器初始化
{
TMOD=0x01; //定时器0的工作方式
TH0=0xff; //高八位,设置初始值 10us
TL0=0xf6; //底八位
}
void open_counttime() //定时器开始计时,初值为0
{
TH0=0;
TL0=0;
TR0=1;
}
void end_counttime() //定时器 结束计时
{
TR0=0;
}
int get_time() //计算定时器 计时的时间。
{
unsigned int a;
a=TH0*256 + TL0; // ***
return a;
}
void CSB_Init() //超声波模块初始化
{
TMOD=0x01;
TH0=0;
TL0=0;
EA=1;
ET0=1;
TRIG = 0;
}
void main()
{
initUART_115200();
init_timer();
while(1){
CSB_Init();
TRIG=1; //输出拉高
TR0=1; //定时器开始工作
while(TF0==1); //等待10us
TR0=0; //关闭计时器
TRIG=0; //输出拉低
while(ECHO!=1);
open_counttime();
while(ECHO!=0); // 输入时间,接收脉冲时间,用于计算距离
end_counttime();
time=get_time();
distance = (float)time * 0.017 ;
sprintf(buf,"distance=%f\r\n",distance);
inputstring(buf);
delay();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)