基于51单片机HC-SR04超声波测距带温度补偿

1 开发环境

仿真图:proteus8.9以上

程序代码:KEIL4/KEIL5

原理图/PCB:AD

(仿真+代码+原理图PCB+详细讲解)

2 功能说明介绍

基于51单片机的超声波测距(倒车雷达)及温度补偿

具体功能

1、51单片机驱动超声波模块获取超声波测试距离,带有超声波精度温度补偿。

2、LCD1602液晶显示测量的距离和温度;

3、可以通过按键设置距离报警上下限值;

按键功能有:距离加键,距离减键,距离设置键。

4、超过设定的报警上下限值则开始声光报警。

开始仿真

LCD1602第一行显示温度,第二行显示距离209CM,超出了默认的最大报警值200CM,报警模块开始工作,亮红灯,蜂鸣器响。

img

通过按键调整LCD1602的距离为195CM,低于默认的最大报警值200CM,报警模块停止工作,红灯灭,蜂鸣器不响。

img

可以通过按键设置最大最小报警值。

img

3 程序

3.1 工程文件

img

3.2 代码

img

main函数

//宏定义
#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=200;
uint Min=30; //按键标志
uchar k=0;	  //数值有误
uchar FW=0;	 //头函数
#include <reg51.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;							 //中断溢出标志
}

按键调整部分函数


//管脚声明
sbit Feng=P1^0;
sbit K1=P1^1;
sbit K2=P1^2;
sbit K3=P1^3; 

//蜂鸣打开
void Feng_Start()
{
    
    
	Feng=0;
}

//蜂鸣关闭
void Feng_Stop()
{
    
    
	Feng=1;
}

//等待
void delay_key()
{
    
    
	uchar i,j;
	for(i=0;i<200;i++)
	for(j=0;j<200;j++);
}
//按键检测
void Key()
{
    
    
	//功能键按下
	if(K1==0)
	{
    
    
		Feng_Start();//蜂鸣器开
		delay_key(); //消抖
		while(K1==0);//等待松手
		Feng_Stop(); //蜂鸣器关闭
		mode++;      //模式++
		if(mode==3)	 //达到最大限度归为
			mode=0;	
		k=1;			 //按键标志位
	}
	//+键
	else if(K2==0)
	{
    
    
		Feng_Start();//蜂鸣器开
		delay_key(); //消抖
		while(K2==0);//等待松手
		Feng_Stop(); //蜂鸣器关闭
		//最大值调整
		if(mode==1)  //在最大值调整下
		{
    
    
			Max++;	 //调整最大值
			if(Max==201)//到达201归为200
			{
    
    
				Max=200;
			}	
		}
		//最小值
		else if(mode==2)//最小模式下调整
		{
    
    
			Min++;		//调整最小值
			if(Min>Max) //最小值不能大于最大值
			{
    
    
				Min=Max;
			}				
		}
		k=1;
	}
	//-键
	else if(K3==0)
	{
    
    
		Feng_Start();
		delay_key();
		while(K3==0);
		Feng_Stop();
		//最大值调整
		if(mode==1)
		{
    
    
			Max--;
			if(Max<Min)
			{
    
    
				Max=Min;
			}	
		}
		//最小值
		else if(mode==2)
		{
    
    
			Min--;
			if(Min==0xff)
			{
    
    
				Min=0;
			}				
		}
		k=1;
	}
}

4 原理图

原理图由AD绘制

img

5 元器件清单

1)79万用板
2)1602液晶
3)HC-SR04超声波模块
4)DS18b20
5)Stc89c51单片机
6)40脚IC座
7)16p单排母座
8)4p单排母座
9)16p排针
10)103排阻
11)104独石
12)1.5k电阻
13)2.2k电阻
14)10k电阻
3
15)12M晶振
16)30pf电容2
17)10uf电容
18)100uf电容
19)按键
4
20)9012三极管
21)蜂鸣器
22)自锁开关
23)DC电源接口
24)导线若干
25)焊锡若干
26)USB电源线或电池盒+DC电源插头

6 PCB

img

7全部资料百度云链接

最重要的程序讲解,仿真讲解和仿真视频

在这里插入图片描述

程序PCB原理图proteus仿真等重要的资料

--------------------本设计A0001下载链接--------------------

img

猜你喜欢

转载自blog.csdn.net/Jack_0220/article/details/128060064