基于51单片机的四路超声波测距温度显示proteus仿真

硬件设计

链接:https://pan.baidu.com/s/1Qu3etYZdqIDlV9qB2kuzkw
提取码:b9ia
在这里插入图片描述

代码设计

#include <REGX52.H>
#include <stdio.h>
#include "LCD.H"
#include "18B20.H"
#include "delay.h"

sbit csb=P1^4;			// 第一路 Trig
sbit csbint=P1^5;		// 第一路 Echo
sbit csb1=P1^6;		   //  第二路 Trig
sbit csbint1=P1^7;	   //  第二路 Echo
sbit csb2=P3^6;		   //  第三路 Trig
sbit csbint2=P3^5;	   //  第三路 Echo
sbit csb3=P3^4;		   //  第四路 Trig
sbit csbint3=P3^3;	   //  第四路 Echo
sbit k1=P1^0;	   //  K1
sbit k2=P1^1;	   //  K2
sbit led=P2^7;	   //  指示灯


sbit fmq=P3^2;		   //蜂鸣器

unsigned char aa[16]={' ','.',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','.',' ',' ','m'};
unsigned char bb[16]={' ','.',' ',' ','m',' ','.',' ',' ',' ',' ',' ','.',' ',' ','m'};	

unsigned char zf;
                                         
unsigned int dz,k,s,j,bgz,k,s1,s2,s3,s4;
int temp;
float csbc,wdz;


main()
{
	TH0=0;
	TL0=0;
	TMOD=0X11;	//T1,T0为16位定时器
	EA=0;

 	init();
    Init_DS18B20();
    dz=100;		  //报警定值
	LCD_Write_String(0,0,aa);
	aa[9]=0xdf;
	while(1)
	{
 		temp=ReadTemperature();

		DelayMs(100);
		if(temp<0)
		{
	   		temp=-(temp-1);
	   		zf=1;
			aa[12]='-';
		}
		else
		{
			zf=0;
			aa[12]=' ';
		}
		wdz=0.00000607*temp;   //温度补偿计算
		if(zf==0)
		{																							
  			csbc=0.03315+wdz;
		} 
		else csbc=0.03315-wdz;

		aa[6]=temp/1000+0x30;
		aa[7]=temp/100%10+0x30;//显示十位
		aa[8]=temp%100/10+0x30;//显示个位
        if(zf==0)
	    {
			if(temp<1000)
			{
		   		aa[6]=' ';
		   		if(temp<100)
		   		{
		      		aa[7]=' ';
				}
			}
		}
		else
		{
			if(temp<1000)
			{
		   		aa[6]='-';
//		   		aa[12]=' ';
		   		if(temp<100)
		   		{
					aa[6]=' ';
		   			aa[7]='-';
				}
			}
		}

///
//	    	第一路	测距模块			 //
///
	  	csb=0;			                     //启动一次模块
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	csb=1;
		ET0=1;	//启动计数器T0,用以计时
		TR0=1;
		EA=1;
		j=50;	//延时  		
	    while(j--) 
		{
		}
		csbint=1;
        j=0;
	   	while(csbint)			//判断接收回路是否收到超声波的回波
		{
			j++;
			if(j>=2500)			//如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
			csbint=0;
		}
		TR0=0;
		s1=TH0*256+TL0;			//读取时间数据
		TH0=0;
		TL0=0;
		csbc=csbc/2;
		s1=s1*csbc-4;

///
//	    	第二路	测距模块			 //
///
	  	csb1=0;			                     //启动一次模块
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	csb1=1;
		ET0=1;	//启动计数器T0,用以计时
		TR0=1;
		EA=1;
		j=50;	//延时  		
	    while(j--) 
		{
		}
		csbint1=1;
        j=0;
	   	while(csbint1)			//判断接收回路是否收到超声波的回波
		{
			j++;
			if(j>=2500)			//如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
			csbint1=0;
		}
		TR0=0;
		s2=TH0*256+TL0;			//读取时间数据
		TH0=0;
		TL0=0;
		s2=s2*csbc-4;

///
//	    	第三路	测距模块			 //
///

	  	csb2=0;			                     //启动一次模块
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	csb2=1;
		ET0=1;	//启动计数器T0,用以计时
		TR0=1;
		EA=1;
		j=50;	//延时  		
	    while(j--) 
		{
		}
		csbint2=1;
        j=0;
	   	while(csbint2)			//判断接收回路是否收到超声波的回波
		{
			j++;
			if(j>=2500)			//如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
			csbint2=0;
		}
		TR0=0;
		s3=TH0*256+TL0;			//读取时间数据
		TH0=0;
		TL0=0;
		s3=s3*csbc-4;
///
//	    	第四路	测距模块			 //
///

	  	csb3=0;			                     //启动一次模块
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_(); 
	  	_nop_();
	  	csb3=1;
		ET0=1;	//启动计数器T0,用以计时
		TR0=1;
		EA=1;
		j=50;	//延时  		
	    while(j--) 
		{
		}
		csbint3=1;
        j=0;
	   	while(csbint3)			//判断接收回路是否收到超声波的回波
		{
			j++;
			if(j>=2500)			//如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
			csbint2=0;
		}
		TR0=0;
		s4=TH0*256+TL0;			//读取时间数据
		TH0=0;
		TL0=0;
		s4=s4*csbc-2;

		if(s1<5) //测量值小于下限
		{
			aa[0]='-';
			aa[2]='-';
			aa[3]='-';
		}
		else if(s1>200)	//测量值大于上限
		{
			aa[0]='C';
			aa[2]='C';
			aa[3]='C';
		}
		else
		{
			aa[0]=s1/100+'0';
			aa[2]=s1/10%10+'0';
			aa[3]=s1%10+'0';
		}

		if(s2<5) //测量值小于下限
		{
			bb[0]='-';
			bb[2]='-';
			bb[3]='-';
		}
		else if(s2>200)	//测量值大于上限
		{
			bb[0]='C';
			bb[2]='C';
			bb[3]='C';
		}
		else
		{
			bb[0]=s2/100+'0';
			bb[2]=s2/10%10+'0';
			bb[3]=s2%10+'0';
		}

		if(s3<5) //测量值小于下限
		{
			bb[11]='-';
			bb[13]='-';
			bb[14]='-';
		}
		else if(s3>200)	//测量值大于上限
		{
			bb[11]='C';
			bb[13]='C';
			bb[14]='C';
		}
		else
		{
			bb[11]=s3/100+'0';
			bb[13]=s3/10%10+'0';
			bb[14]=s3%10+'0';
		}
///
 		if(s4<5) //测量值小于下限
		{
			aa[11]='-';
				aa[12]='.';
			aa[13]='-';
			aa[14]='-';
		}
		else if(s4>200)	//测量值大于上限
		{
			aa[11]='C';
			aa[12]='.';
			aa[13]='C';
			aa[14]='C';
		}
		else
		{
			aa[11]=s4/100+'0';
			aa[12]='.';
			aa[13]=s4/10%10+'0';
			aa[14]=s4%10+'0';
		}
    	if(k1==0)
	   	{
//	   		while(k1==0);
	   		dz++;
			if(dz>200)
	   		{
		   		dz=200;
	   		}
	   	}
        if(k2==0)
		{
//			while(k2==0);
			dz--;
			if(dz<30)
			{
		   		dz=30;
			}
		}
		bb[6]=dz/100+'0';
		bb[7]='.';
		bb[8]=dz/10%10+'0';
		bb[9]=dz%10+'0';



///


	    if(s1<s2)
		{
		   s=s1;
		}
		else s=s2;

	    if(s<s3)
		{
		   s=s;
		}
		else s=s3;

 	    if(s<s4)
		{
		   s=s;
		}
		else s=s4;

		if(s<dz) 
		{
			bgz=s*5;
  			for (k=0;k<bgz;k++)
  			{
    			DelayUs2x(150);
    			fmq=0;       //BEEP
				led=0;
  			} 
		}
		fmq=1;
		led=1;
		LCD_Write_String(0,0,aa);
		LCD_Write_String(0,1,bb);
	}
}
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机是一种非常常见的微控制器,广泛应用在各种控制系统和嵌入式系统中。而HCSR04超声波测距模块则是一种测距传感器,能够通过发送和接收超声波信号来测量距离。在Proteus仿真平台上,我们可以通过搭建电路模拟出HCSR04超声波测距模块与51单片机的连接,从而进行测距实验。 首先,在Proteus里选择51单片机芯片和HCSR04超声波测距模块,并将它们连接起来。具体可以参考相关的接口图和器件手册,将它们的引脚连接好。然后在51单片机的程序中,先初始化引脚,将HCSR04超声波测距模块的Trig引脚设置为输出模式,将Echo引脚设置为输入模式。接着,通过51单片机向Trig引脚发送一定持续时间的高电平信号,从而使HCSR04超声波测距模块开始发射超声波信号。在发射完超声波信号后,HCSR04超声波测距模块会将Echo引脚输出的电平信号变为高电平,并持续一定时间,此时51单片机便开始计时,记录下Echo信号持续的时间来计算出距离。 需要注意的是,HCSR04超声波测距模块的距离计算公式为距离=声速*时间/2,其中声速的值可以通过相关的手册或网络查找,一般为343m/s左右。而时间则是根据Echo引脚输出的高电平信号持续时间来计算得出。最后,通过将测得的距离结果在液晶显示屏上输出,就完成了基于51单片机的HCSR04超声波测距实验。 总而言之,在Proteus中实现基于51单片机的HCSR04超声波测距实验,需要熟悉51单片机及其编程、HCSR04超声波测距模块的工作原理及距离计算公式,并将它们通过电路连接起来,最终得到测距结果并进行显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值