C51单片机 超声波模块测距

 

 

 

 

超声波工作原理:

 

 

HC-SR04 介绍

HC-SR04 模块可以测量 3cm - 4m 的距离,精确度可以达到 3mm。这个模块包括 超声波发射器、超声波接收器和控制电路三部分。有 4 个引脚。

1. 单片机向 Trig 脚发送一个持续 10us 的脉冲信号。
2. HC-SR04 接收到单片机发送的脉冲信号,开始发送超声波,并把 Echo置为高电平。然后准备接收返回的超声波。
3. 当 HC-SR04 接收到返回的超声波时,把 Echo 置为低电平。从上述过程可以看出, Echo 高电平持续的时间就是超声波从发射到返回所经过的时间间隔。

程序:

#include<reg52.h>
#include<stdio.h>

sbit Echo=P1^0;
sbit Trig=P1^1;
sbit in=P0^0;

void initUart_115200()
{
   SCON=0x50; //0101 0000
   TH2=0xFF;
   TL2=0xFD;
   RCAP2H=0xFF;
   RCAP2L=0xFD;
   T2CON=0x34;	//波特率115200
}
 void init_timer()
{
 TMOD=0x01;
 TH0=0xff;	   //设置初始值为10us
 TL0=0xf6;
}  

void delay(int n){
int i,j;
for(i=0;i<100;i++){
 for(j=0;j<n;j++);
 }
}



void sendbyte(char date){
   SBUF=date;
   while(TI!=1);
   TI=0;
}
void sendString(char* pstr){
  while(*pstr!='\0'){
  sendbyte(*pstr);
  pstr++;
 }
 delay(200); 	
} 


 void delay10us()
{
 TMOD|=0x1;
 TH0=0xFF;
 TL0=0xF6;
 TR0=1;
 while(!TF0){}
 TF0=0;
}



 void init_CSB()
{
 Trig=0;
 Trig=1;
 delay10us();
 Trig=0;
}


 void starttime()
{
 TH0=0;
 TL0=0;
 TR0=1;
}


 void endtime()
{
 TR0=0;
}



 float getbotime()
{
 unsigned int time=0;
 time=TH0<<8|TL0;
 return time;
}


 float getdis( unsigned int time)
{
 float dis;
 dis=(float)0.017*time;
 return dis;
}


 int main()
{
 unsigned int time=0;
 float dis;
 char buf[24]={'\0'};
 initUart_115200();
 sendbyte('a');
 init_timer();
 
     while(1)
    {
 	 init_CSB();
     while(Echo!=1);
     starttime();
 	 while(Echo!=0);
     endtime();
     time=getbotime();
     dis=getdis(time);

     sprintf(buf,"dis=%f cm\r\n",dis);
     sendString(buf);
   delay(200);

     }  
 
return 0;
}

运行结果:

 

 

 

 

 

C51单片机超声波测距程序设计过程如下: 1. 确定超声波模块的IO口连接,一般为一个触发引脚和一个接收引脚。 2. 设置IO口为输出模式,将触发引脚输出高电平,保持10us以上,然后拉低,触发超声波模块发送一次超声波信号。 3. 设置IO口为输入模式,等待接收引脚的电平变化,当接收引脚有信号返回时,开始计时。 4. 当接收引脚回到低电平时,计时停止,计算出超声波信号的往返时间,即为物体距离的两倍。 5. 将距离值转换为需要的单位(如厘米、英寸等),并进行显示或者其他操作。 下面是一个简单的C51单片机超声波测距程序: ```c #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit Trig = P1^0; // 触发引脚 sbit Echo = P1^1; // 接收引脚 void delayms(uint xms) // 延时函数,单位毫秒 { uint i, j; for (i = xms; i > 0; i--) for (j = 114; j > 0; j--); // 1ms延时 } void main() { uchar buf[16]; uint distance; while (1) { Trig = 1; // 触发信号 delayms(20); // 延时20毫秒,等待模块准备好 Trig = 0; while (!Echo); // 等待接收引脚高电平 TH0 = 0; TL0 = 0; while (Echo); // 等待接收引脚回到低电平 distance = TH0 << 8 | TL0; // 计算超声波往返时间 distance /= 58; // 转换为厘米 sprintf(buf, "Distance: %d cm\r\n", distance); // 进行显示或者其他操作 } } ``` 注意,该程序中使用了定时器0来进行计时。在程序中需要初始化定时器0,并在计时结束后读取TH0和TL0的值进行计算。同时,由于超声波信号的传播速度在空气中为340m/s左右,需要将计算出的时间值除以58来转换为距离值(单位为厘米)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值