基于51单片机的超声波水位液位监测仿真程序设计

链接:https://pan.baidu.com/s/1L6SL7Vk_-lt8htgJ2cKG9g

提取码:tgea

硬件设计

上一篇咱们说了基于液位传感器的优缺点,其中缺点就是测量距离有限,这里就引入了超声波的测距方式,该方式测量距离就大大增加。

超声波测距系统原理
在超声探测电路中,发射端得到输出脉冲为一系列方波,其宽度为发射超声的时间间隔,被测物距离越大,脉冲宽度越大,输出脉冲个数与被测距离成正比。超声测距大致有以下方法:① 取输出脉冲的平均值电压,该电压 (其幅值基本固定 )与距离成正比,测量电压即可测得距离;② 测量输出脉冲的宽度,即发射超声波与接收超声波的时间间隔 t,故被测距离为 S=1/2vt。本测量电路采用第二种方案。由于超声波的声速与温度有关,如果温度变化不大,则可认为声速基本不变 。如果测距精度要求很高,则应通过温度补偿的方法加以校正。超声波测距适用于高精度的中长距离测量。因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量精度理论上可以达到毫米级。
超声波测距的算法设计: 超声波在空气中传播速度为每秒钟340米(15℃时)。X2是声波返回的时刻,X1是声波发声的时刻,X2-X1得出的是一个时间差的绝对值,假定X2-X1=0.03S,则有340m×0.03S=10.2m。由于在这10.2m的时间里,超声波发出到遇到返射物返回的距离如下:
基于51单片机的超声波水位液位监测仿真程序设计_第1张图片
基于51单片机的超声波水位液位监测仿真程序设计_第2张图片

仿真图:
LCD1602作为显示器,三个按键作为设置和切换功能,继电器模拟水泵的控制。
基于51单片机的超声波水位液位监测仿真程序设计_第3张图片

程序设计


#include
#include	
#include"lcd.h"
#include"key.h"

sbit Trig = P2^1;
sbit Echo = P2^0;

sbit K0=P2^2;
sbit K1=P2^3;
sbit beep=P1^0;

unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
			  
       unsigned int  time=0;
	   unsigned long S=0;
	   bit      flag =0;
	   bit 		min = 0;
	   int      cont;
	   unsigned char disbuff[4]	   ={ 0,0,0,0,};
/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Conut(void)
	{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	 	
	 S=(time*1.7)/100+1;     //算出来是CM
	 if((S>=700)||flag==1) //超出测量范围显示“-”
	 {	 
	  flag=0;
	 
	  t[1][6]=ASCII[11];
	  t[1][8]=ASCII[11];
	  t[1][9]=ASCII[11];
	 }
	 else
	 {
	  disbuff[0]=S%1000/100;
	  disbuff[1]=S%1000%100/10;
	  disbuff[2]=S%1000%10 %10;
	  t[1][6]=ASCII[disbuff[0]];
	  t[1][8]=ASCII[disbuff[1]];
	  t[1][9]=ASCII[disbuff[2]];
	 }
	 display(t[0],t[1]);
	 if(min)
	 {
	    cont++;
		if(cont==5)
		{
		   cont=0;
		   min=0;
		   beep=0;
		}
	 }
	}

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

 void  StartModule() 		         //启动模块
  {
	  Trig=1;			                     //启动一次模块
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  Trig=0;
  }



void delayms(unsigned int ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}

void main(void)
{

	 TMOD=0x01;		   //设T0为方式1,GATE=1;
	 TH0=0;
	 TL0=0;          
	 ET0=1;             //允许T0中断
	 EA=1;			   //开启总中断	

	InitLcd1602();
	beep=0;
	K0=1;
	K1=1;
	min=0;
	while(1)
	{
	    while(KEY3)
	    {
		    StartModule();
	        while(!Echo);		//当RX为零时等待
	        TR0=1;			    //开启计数
	        while(Echo);		//当RX为1计数并等待
	        TR0=0;				//关闭计数
            Conut();			//计算						
		    delayms(20);
			if(S>MAX||SMAX)
			  {			   
			     break;
			  }
   	     }
	   }
	   if(S>MAX)
	   {
	      beep=1;
	      K0=1;
		  K1=1;
		  min=1;
		  while(KEY3)
	      {
		      StartModule();
	          while(!Echo);		    //当RX为零时等待
	          TR0=1;			    //开启计数
	          while(Echo);		    //当RX为1计数并等待
	          TR0=0;				//关闭计数
              Conut();			    //计算			
		      delayms(20);
			  if(S

你可能感兴趣的:(单片机,51单片机,嵌入式硬件)