基于51单片机的超声波倒车雷达防撞系统 proteus仿真 LCD1602显示

硬件设计

(末尾附文件)
功能需求
1) 基本任务
(1) 当车距(HC-SR04 超声波测距的位置)离障碍物小于 1 米,报警器响起, 发出一定
频率的“滴滴” 声音, 报警指示灯闪烁。
(2) LCD1602 液晶屏显示超声波模块安装位置与障碍物之间的距离。
2) 扩展任务:
(1) 随着车距与障碍物的距离的缩小,报警器声音越来越尖锐急促(声音频率越来越高)。
(2) 随着车距与障碍物的距离的缩小, 报警指示灯闪烁频率增加。
(3) 按键调整报警门限距离, 当车距离障碍物小于该值(默认值为 1 米),声音报警。
(4) LCD1602 第一行显示超声波模块安装位置与障碍物之间的距离;第二行实时显示按
键所调整的报警门限距离。

仿真图1:

仿真图2:
基于51单片机的超声波倒车雷达防撞系统 proteus仿真 LCD1602显示_第1张图片

程序设计

#include 
#include 
#include "LCD.H"
#include "delay.h"
#define  uint unsigned int
#define  uchar unsigned char	
	
//定义引脚
sbit k1=P3^5;
sbit k2=P3^6;
sbit Trig=P2^5;   //trig 发射脉冲
sbit Echo=P3^2;  //echo 接受脉冲
sbit bg=P2^6;
sbit beep=P3^3;  //beep
sbit led=P1^2;
//定义固定显示
uchar juli[5]={'A','.','A','A','m'};
uchar set_juli[]={'A','.','A','A','m'};
uchar zifu[]={'D','i','s',':'};	   //Distance
//定义全局变量
uchar time0_flag=0;  //定时器溢出中断
uint time=0;        //定时器定时时间
uchar one_final=0;   //一次测量完成
uint distance=0.0,set_dis=100;   //距离和设定报警距离

void display();
void Trig_SR04();
void button_choose();
void judge_baojing();
void main()
{
	
	EA=1;       //外部中断0下降沿触发  定时器0加门控位 高电平开启
	TMOD=0x09;  //16位 TR0=1; INT0=1; 开启
	TR0=1;
	EX0=1; 
	IT0=1;      //下降沿触发
	
	TH0=0;
	TL0=0;
	init();     //1602初始化	
	Trig_SR04();
	while(1)
	{
		if(one_final)   //一次完成后再次触发
		{
			Trig_SR04();
			one_final=0;
		}
		judge_baojing();
		display();    //液晶显示
		button_choose();  //按键调整
	}
}

void INT0_hander() interrupt 0
{
	time = TH0*256+TH0;    //  time us 
	distance=time*0.0170;  //cm    34000cm*10e-6*time/2
	one_final=1;
	TH0=0;
	TL0=0;
}

void Trig_SR04()  //仿真里是地脉冲触发
{
	Trig=0;
	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 judge_baojing()
{
	uint time_baojing,i;
	if(distance<set_dis)
	{
			time_baojing=distance*10;
  			for (i=0;i<time_baojing;i++)
  			{
    			DelayUs2x(100);
    			beep=!beep;       //BEEP取反
  			} 
				for (i=0;i<time_baojing;i++)
  			{
					led=~led;
					DelayUs2x(time_baojing);
  			}
	}
}
void display()
{
	if(distance<5) //测量值小于下限
		{
			juli[0]='-';
			juli[2]='-';
			juli[3]='-';
		}
	else if(distance>500)	//测量值大于上限
		{
			juli[0]='C';
			juli[2]='C';
			juli[3]='C';
		}
	else
	{
		juli[0]=distance/100+'0';
		juli[2]=distance/10%10+'0';
		juli[3]=distance%10+'0';
	}
	set_juli[0]=set_dis/100+'0';
	set_juli[2]=set_dis/10%10+'0';
	set_juli[3]=set_dis%10+'0';
	
	LCD_Write_String(11,0,juli);  //显示测距
	LCD_Write_String(5,0,zifu);   //显示distance
	LCD_Write_String(11,1,set_juli); //显示报警距离
}


void button_choose()
{
	uint k,e,xs;   //e 控制个性化显示 xs显示周期
	uchar a1,a2,a3,n=0,m=0,z=0;   //按键调整 a1,a2,a3调整设定距离的三位从高到低  nmz控制循环
		if(!k1)      //按键处理程序
		{
			EA=0;
			TR0=0;
		  set_juli[0]='A';
			set_juli[1]='.';
			set_juli[2]='A';
			set_juli[3]='A';
			set_juli[4]='m';
			LCD_Write_String(11,1,set_juli);
			k=500;
		  while(k)
			{
			 	k--;
				DelayMs(2);
			}
		  set_juli[0]=set_dis/100+'0';
			set_juli[2]=set_dis/10%10+'0';
			set_juli[3]=set_dis%10+'0';
			LCD_Write_String(11,1,set_juli);
			a1=set_dis/100;
			a2=set_dis/10%10;
			a3=set_dis%10;
			
			
			//按键调整最小距离
			n=1;
		  while(n)
			{
				if(!k2)
				{
					while(!k2);
					e=1;
					xs=3;
					a1+=1;
					if(a1>5)
					a1=0;
		  			juli[0]=a1+'0';
				}

				if (e==1)
				{
					xs++;
 		  			juli[0]=a1+'0';
		  			if(xs>6)
		  			{
            			xs=0;
									e=0;
		  			}
				}
				else
				{
					juli[0]=' ';
					xs++;
					if(xs>3)
					{
						xs=0;
						e=1;
					}
				}
				LCD_Write_String(11,1,juli);
				if(!k1)
				{
					while(!k1);
 		  			juli[0]=a1+'0';
					m=1;
					while(m)
					{
						if(!k2)
						{
							while(!k2);
							e=1;
							xs=3;
							a2+=1;
							if(a2>9)
							a2=0;
		  					juli[2]=a2+'0';
							LCD_Write_String(11,1,juli);
						}

						if (e==1)
						{
							xs++;
 		  					juli[2]=a2+'0';
		  					if(xs>6)
		  					{
            					xs=0;
											e=0;
		  					}
						}
						else
						{
							juli[2]=' ';
							xs++;
							if(xs>3)
							{
								xs=0;
								e=1;
							}
						}
						LCD_Write_String(11,1,juli);
						
						if(!k1)
						{
							while(!k1);
							juli[2]=a2+'0';
							z=1;
							while(z)
							{
								if(!k2)
								{
									while(!k2);
									e=1;
									xs=3;
									a3+=1;
									if(a3>9)
					          a3=0;
		  						juli[3]=a3+'0';
									LCD_Write_String(11,1,juli);
								}

								if (e==1)
								{
									xs++;
 		  							juli[3]=a3+'0';
		  							if(xs>6)
		  							{
            					xs=0;
											e=0;
		  							}
								}
								else
								{
									juli[3]=' ';
									xs++;
									if(xs>3)
									{
										xs=0;

.

文件仅供参考:
链接:https://pan.baidu.com/s/1aLpBes_6oo0J3nl2QSvQBg
提取码:z8ya

.

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