基于51单片机的超声波测距

1、设计需求及目标

设计由51单片机最小系统、超声波测距模块、驱动显示电路、5伏直流稳压电路、温度传感器等组成的超声波测距仪。利用超声波测距模块HC-SR04测量距离,并对数据进行分析处理,传给51单片机,再通过1602 LCD显示出来,同时电源部分采用5V稳压直流电源。

2、设计思路及方案

超声波测距仪主要以单片机AT89C51为核心,其发射器是利用压电晶体的谐振带动周围空气振动来工作的。超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器接收到反射波就立即停止计时。一般情况下,超声波在空气中的传播速度为340m/ s,根据计时器记录的时间t ,就可以计算出发射点距障碍物的距离S,即S=340×t/2,这就是常用的时差法测距。

在测距计数电路设计中,采用了相关计数法,其主要原理是:测量时单片机系统先给发射电路提供脉冲信号,单片机计数器处于等待状态,不计数;当信号发射一段时间后,由单片机发出信号使系统关闭发射信号,计数器开始计数,实现起始时的同步;当接收信号的最后一个脉冲到来后,计数器停止计数。

双向超声波测距仪的系统主要有几下部分组成: LED显示模块,AT89C51芯片,超声波发射模块,超声波接收模块,电源模块等五大模块组成。系统设计总体框图:

硬件原理图如下图所示:

3、程序主函数

#define uchar unsigned char 
#define uint unsigned int
#define ULint unsigned long int 
//温度零上与零下的标志位
char flag=0;
//超声波
char flags=0;
//超声波距离
char flag1s=0;
//计算定时间
uint time=0;
//计算距离
ULint L_=0;
//温度
uint t_=0;
//显示模式  0正常  1最大值调整  2最小值调整
uchar mode=0;

uint Max=490;
uint Min=30;
//按键标志
uchar k=0;
//数值有误
uchar FW=0;
//头函数
#include <reg52.h>
#include <intrins.h>
#include "BJ_Key.h"	   	 //报警按键
#include "display.h"			 //显示头函数
#include "ultrasonic_wave.h"//超声波头函数
#include "DS18B20.h"	   	 //温度传感器头函数


//函数声明
void delayms(uint ms);
//主函数
void main()
{
	Init_ultrasonic_wave();
	//屏幕初始化
	Init1602();
	//温度初始化
	tmpchange(); 
	t_=tmp();
	tmpchange();
	t_=tmp();
	tmpchange();
	t_=tmp();

	//循环显示
	while(1)
	{
		Key();
		//正常显示
		if(mode==0)
		{
			StartModule();//启动超声波
			while(!RX);	  //当RX为零时等待
			TR0=1;		  //开启计数
			while(RX);	  //当RX为1计数并等待
			TR0=0;		  //关闭计数
	
			delayms(20);  //20MS
			tmpchange();  //温度转换
			t_=tmp();     //度温度
			Conut(t_/10); //计算距离
			if(L_>Max||L_<Min)
			{
				Feng_Start();
			}
			else
			{
				if(FW!=1)
				Feng_Stop();
			}
			Display_1602(t_/10,L_);
		}
		//调整显示
		else if(mode!=0)
		{
			//最大最小值
			Init_MaxMin();
			while(mode!=0)
			{
				
				Key();
				if(k==1&&mode==1)
				{
					Init_MaxMin();	
   				write_com(0x8d);//设置位置					
				}
				else if(k==1&&mode==2)
				{
					Init_MaxMin();	
   				write_com(0x8d+0x40);//设置位置	
				}
				k=0;
			}
			//界面初始化
			Init1602();
		}
	}
}

void delayms(uint ms)
{
	uchar i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}


//T0中断用来计数器溢出,超过测距范围
void CJ_T0() interrupt 1
{
    flags=1;							 //中断溢出标志
} 

完整资料:

https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=614515862970&ut_sk=1.WUpxx7gpwUoDAMmnnrBIzAno_12431167_1585212293567.Copy.detail.614515862970.1828622527&forceFlush=1

发布了23 篇原创文章 · 获赞 7 · 访问量 331

猜你喜欢

转载自blog.csdn.net/weixin_41017942/article/details/105122114