超声波测距模块:
(1):采用IO口TRIG触发测距,给至少10us的高电平信号;
(2):模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3):有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。
![](https://img-blog.csdnimg.cn/img_convert/a7dec57ac76e337232597b63e70279ef.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/efb2fb5267c24afff203ee5c049e9313.jpeg)
超声波测距串口输出程序源代码
/*******************超声波测距串口输出*********************
* 单片机:51单片机
* 开发环境:keil
* 名称:超声波测距串口输出
* 说明:波特率9600
注意:用杜邦线将超声波模块的VCC接开发板5V对外供电接口
用杜邦线将超声波模块的GND接开发板GND
用杜邦线将超声波模块的Trig接单片机的P1.5
用杜邦线将超声波模块的Echo接单片机的P1.6
/************************包含头文件************************/
#include <reg52.h>
/**************************宏定义**************************/
#define SPEED_30C 3495 //30摄氏度时的声速,声速V=331.5+0.6*温度;
#define SPEED_23C 3453 //23摄氏度时的声速,声速V=331.5+0.6*温度;
/**************************位定义**************************/
//FOSC = 11.0592MHz,12T模式,SMOD=0
#define reload_count_1200bps 0xe8
#define reload_count_2400bps 0xf4
#define reload_count_4800bps 0xfa
#define reload_count_9600bps 0xfd
sbit ECHO = P1^6; //回声接收端口
sbit TRIG = P1^5; //超声触发端口
sbit BEEP = P2^3; //蜂鸣器
/**********************定义变量和数组**********************/
long int distance = 0; //距离变量
unsigned char count;
void Delay5Ms(void);
void delay(int In,int Out);
unsigned char zifuchuan[]="SSLV WELCOME!"; //待显示字符。
unsigned char juli[]="距离为: . 厘米"; //待显示字符。
void Delay_xMs(unsigned int x)
{
unsigned inti,j;
for(i=0;i<x;i++)
{for(j=0;j<3;j++){;}}
}
void delayt(unsigned int x)
{
unsigned charj;
while(x-->0)
{for(j=0;j<125;j++){;}}
}
void delay(int In,int Out)
{
int i,j;
for(i=0;i<In;i++)
{for(j=0;j<Out;j++){;}}
}
void serial_port_initial(char TH,char TL)
{
SCON=SCON|0x50; //0101,0000 8位可变波特率,无奇偶校验位
TMOD=TMOD|0x20; //0011,0001 设置定时器1为8位自动重装记数器
PCON=PCON|0x00;
TH1=TH; //设置定时器1自动重装数
TL1=TL;
ES=1; //允许串口中断
EA=1; //开总中断
TR1=1; //开定时器1
}
void send_UART(unsigned char i) //发送一节函数
{
ES=0; //关串口中断
TI=0; //清零串口发送完成中断请求标志
SBUF=i;
while(TI==0); //等特数据传送
TI=0; //清除数据传送标志
ES=1;
}
void sendc(unsigned char * pd)
{
while((*pd)!='\0') //发送字符串,直到遇到0才结束
{
send_UART(*pd); //发送一个字符
pd++; //移动到下一个字符
}
}
void Alarm(unsigned char t)
{
unsigned chari;
for(i=0;i<t;i++)
{
BEEP=0;delay(10,1000);
BEEP=1;delay(10,1000);
}
}
void Init_timer(void)
{
TMOD=TMOD|0x01; //定时器0初始化,设置为16位自动重装模式
TL0=0x66;
TH0=0xfc; //1ms
ET0=1; //开定时器0
EA=1; //总中断使能
}
void Init_Parameter(void)
{TRIG=1;ECHO=1;count=0;distance=0;}
void display(int number)
{
unsigned charb,c,d,e;
b=(number/1000);
c=(number/100)%10;
d=(number/10)%10;
e=number%10;
juli[7]=0x30+b;
juli[8]=0x30+c;
juli[9]=0x30+d;
juli[11]=0x30+e;
sendc(juli);
}
void Trig_SuperSonic(void) //出发声波
{TRIG=1;delayt(1);TRIG=0;}
void Measure_Distance(void)
{
unsigned charl;
unsigned inth,y;
TR0=1;
while(ECHO){;}
TR0=0;l=TL0;h=TH0;
y=(h<<8)+l;
y=y-0xfc66; //us部分
distance=y+1000*count; //计算总时间
TL0=0x66;TH0=0xfc;delayt(30);
distance =SPEED_30C * distance / 20000;
}
void main(void)
{
serial_port_initial(reload_count_9600bps,reload_count_9600bps);
Alarm(2);
sendc(zifuchuan);
Init_timer();
Init_Parameter();
while(1)
{
Trig_SuperSonic(); //触发超声波发射
while(ECHO ==0) //等待回声
{;}
Measure_Distance(); //计算脉宽并转换为距离
display(distance); //显示距离
Init_Parameter(); // 参数重新初始化
delayt(100); //延时,两次发射之间要至少有10ms间隔
}
}
void timer0 (void) interrupt 1
{
TF0=0;TL0=0x66;TH0=0xfc;count++;
if(count==18) //超声波回声脉宽最多18ms
{TR0=0;TL0=0x66;TH0=0xfc;count=0;}
}