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

您所在的位置:网站首页 bar对应液位高度 基于51单片机的超声波水位液位监测仿真程序设计

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

2023-10-23 22:15| 来源: 网络整理| 查看: 265

硬件设计

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

超声波测距系统原理 在超声探测电路中,发射端得到输出脉冲为一系列方波,其宽度为发射超声的时间间隔,被测物距离越大,脉冲宽度越大,输出脉冲个数与被测距离成正比。超声测距大致有以下方法:① 取输出脉冲的平均值电压,该电压 (其幅值基本固定 )与距离成正比,测量电压即可测得距离;② 测量输出脉冲的宽度,即发射超声波与接收超声波的时间间隔 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的时间里,超声波发出到遇到返射物返回的距离如下: 在这里插入图片描述 在这里插入图片描述

仿真图: LCD1602作为显示器,三个按键作为设置和切换功能,继电器模拟水泵的控制。 在这里插入图片描述

程序设计 #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) { 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3