基于单片机多路超声波定位系统

设计思路:

       模式一:思路超声波距离检测,按键按下进入距离探测模式,屏幕显示四路声波的距离

       如图下:

       模式二:定位探测模式,对4路超声波进行标号,例如上下左右,先对四个方位进行检测,然后根据上下左右超声波的检测来进一步判断对上左,上右,下左,下右的小方位进行判断。

        如图下:

        模式三:对安全距离的范围进行设置,按键左和右分别代表加和减,此外我还设置了最大探测距离,为设置距离值的两倍,例如当前设置值为20,那么检测距离一旦超过40则检测显示的范围就会为0,这一步是为了使定位探测模式更加准确

        如图下:

模式一图:

 模式二图:

 模式三图:

系统主要使用的模块

1、超声波模块x4

2、stc89c52rc

3、按键模块x3

4、oled12864

5、发光二极管x3

6、eeprom存储模块

7、蜂鸣器

8、三极管

部分代码

4路超声波初始化

#include <reg52.h>
#include <intrins.h>	

#include "oled.h"
#include "ult.h"

sbit Trig1 = P1^6;  
sbit Echo1 = P1^7;

sbit Trig2 = P1^4;  
sbit Echo2 = P1^5;

sbit Trig3 = P1^2;  
sbit Echo3 = P1^3;

sbit Trig4 = P1^0;  
sbit Echo4 = P1^1;

unsigned int  time=0;
unsigned char distance1=0,distance2=0,distance3=0,distance4=0;

void show_ultra(void);
u16 miao;
u8 before,t;
u8 speed;
u8 oflag=0;

static unsigned char DisNum = 0; //ÏÔʾÓÃÖ¸Õë				  

unsigned char flag =0;
/*******************************************************************************/
extern unsigned char set_juli;
extern unsigned char ult_flag;		 

/*******************************************************************************/

void  StartModule(unsigned char num) 		         
{
	if(num==1)Trig1=1;			                     //Æô¶¯Ò»´ÎÄ£¿é
	else if(num==2)Trig2=1;
	else if(num==3)Trig3=1;
	else if(num==4)Trig4=1;
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_();
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_();
	if(num==1)Trig1=0;			                     //Æô¶¯Ò»´ÎÄ£¿é
	else if(num==2)Trig2=0;
	else if(num==3)Trig3=0;
	else if(num==4)Trig4=0;
}
void Conut(unsigned char num)
{
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	 if(num==1)distance1=(time*1.7)/100;     //Ëã³öÀ´ÊÇCM
	 else if(num==2)distance2=(time*1.7)/100;     //Ëã³öÀ´ÊÇCM
	 else if(num==3)distance3=(time*1.7)/100;
   else if(num==4)distance4=(time*1.7)/100;	//Ëã³öÀ´ÊÇCM
}

oled显示

void IIC_delay(void)
{
	u8 t=1;
	while(t--);
}

//ÆðʼÐźÅ
void I2C_Start(void)
{
	OLED_SDA_Set();
	OLED_SCL_Set();
	IIC_delay();
	OLED_SDA_Clr();
	IIC_delay();
	OLED_SCL_Clr();
	 
}

//½áÊøÐźÅ
void I2C_Stop(void)
{
	OLED_SDA_Clr();
	OLED_SCL_Set();
	IIC_delay();
	OLED_SDA_Set();
}

//µÈ´ýÐźÅÏìÓ¦
void I2C_WaitAck(void) //²âÊý¾ÝÐźŵĵçƽ
{
	OLED_SDA_Set();
	IIC_delay();
	OLED_SCL_Set();
	IIC_delay();
	OLED_SCL_Clr();
	IIC_delay();
}

//дÈëÒ»¸ö×Ö½Ú
void Send_Byte(u8 dat)
{
	u8 i;
	for(i=0;i<8;i++)
	{
		OLED_SCL_Clr();//½«Ê±ÖÓÐźÅÉèÖÃΪµÍµçƽ  
		if(dat&0x80)//½«datµÄ8λ´Ó×î¸ßλÒÀ´ÎдÈë  
		{
			OLED_SDA_Set();
    }
		else
		{
			OLED_SDA_Clr();
    }
		IIC_delay();
		OLED_SCL_Set();
		IIC_delay();
		OLED_SCL_Clr();
		dat<<=1;
  }
}

//·¢ËÍÒ»¸ö×Ö½Ú
//ÏòSSD1306дÈëÒ»¸ö×Ö½Ú¡£
//mode:Êý¾Ý/ÃüÁî±êÖ¾ 0,±íʾÃüÁî;1,±íʾÊý¾Ý;
void OLED_WR_Byte(u8 dat,u8 mode)
{
	I2C_Start();
	Send_Byte(0x78);
	I2C_WaitAck();
	if(mode){Send_Byte(0x40);}
  else{Send_Byte(0x00);}
	I2C_WaitAck();
	Send_Byte(dat);
	I2C_WaitAck();
	I2C_Stop();
}

//×ø±êÉèÖÃ

void OLED_Set_Pos(u8 x, u8 y) 
{ 
	OLED_WR_Byte(0xb0+y,OLED_CMD);
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte((x&0x0f),OLED_CMD);
}   	  

#if 0

void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDCÃüÁî
	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//¹Ø±ÕOLEDÏÔʾ     
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDCÃüÁî
	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}		 

#endif

//ÇåÆÁº¯Êý,ÇåÍêÆÁ,Õû¸öÆÁÄ»ÊǺÚÉ«µÄ!ºÍûµãÁÁÒ»Ñù!!!	  
void OLED_Clear(void)  
{  
	u8 i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //ÉèÖÃÒ³µØÖ·£¨0~7£©
		OLED_WR_Byte (0x00,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁе͵ØÖ·
		OLED_WR_Byte (0x10,OLED_CMD);      //ÉèÖÃÏÔʾλÖáªÁиߵØÖ·   
		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 
	} //¸üÐÂÏÔʾ
}

//ÔÚÖ¸¶¨Î»ÖÃÏÔʾһ¸ö×Ö·û,°üÀ¨²¿·Ö×Ö·û
//x:0~127
//y:0~63				 
//sizey:Ñ¡Ôñ×ÖÌå 6x8  8x16
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 sizey)
{      	
	u8 c=0,sizex=sizey/2;
	u16 i=0,size1;
	if(sizey==8)size1=6;
	else size1=(sizey/8+((sizey%8)?1:0))*(sizey/2);
	c=chr-' ';//µÃµ½Æ«ÒƺóµÄÖµ
	OLED_Set_Pos(x,y);
	for(i=0;i<size1;i++)
	{
		if(i%sizex==0&&sizey!=8) OLED_Set_Pos(x,y++);
		if(sizey==8) OLED_WR_Byte(asc2_0806[c][i],OLED_DATA);//6X8×ÖºÅ
		else if(sizey==16) OLED_WR_Byte(asc2_1608[c][i],OLED_DATA);//8x16×ÖºÅ
//		else if(sizey==xx) OLED_WR_Byte(asc2_xxxx[c][i],OLED_DATA);//Óû§Ìí¼Ó×ÖºÅ
		else return;
	}
}
//m^nº¯Êý
u32 oled_pow(u8 m,u8 n)
{
	u32 result=1;	 
	while(n--)result*=m;    
	return result;
}				  
//ÏÔʾÊý×Ö
//x,y :Æðµã×ø±ê
//num:ÒªÏÔʾµÄÊý×Ö
//len :Êý×ÖµÄλÊý
//sizey:×ÖÌå´óС		  
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 sizey)
{         	
	u8 t,temp,m=0;
	u8 enshow=0;
	if(sizey==8)m=2;
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(sizey/2+m)*t,y,' ',sizey);
				continue;
			}else enshow=1;
		}
	 	OLED_ShowChar(x+(sizey/2+m)*t,y,temp+'0',sizey);
	}
}
//ÏÔʾһ¸ö×Ö·ûºÅ´®
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 sizey)
{
	u8 j=0;
	while (chr[j]!='\0')
	{		
		OLED_ShowChar(x,y,chr[j++],sizey);
		if(sizey==8)x+=6;
		else x+=sizey/2;
	}
}
//ÏÔʾºº×Ö
void OLED_ShowChinese(u8 x,u8 y,u8 no,u8 sizey)
{
	u16 i,size1=(sizey/8+((sizey%8)?1:0))*sizey;
	for(i=0;i<size1;i++)
	{
		if(i%sizey==0) OLED_Set_Pos(x,y++);
		if(sizey==16) OLED_WR_Byte(Hzk[no][i],OLED_DATA);//16x16×ÖºÅ
//		else if(sizey==xx) OLED_WR_Byte(xxx[c][i],OLED_DATA);//Óû§Ìí¼Ó×ÖºÅ
		else return;
	}				
}



//³õʼ»¯				    
void OLED_Init(void)
{
	OLED_RES_Clr();
  delay_ms(200);
	OLED_RES_Set();
	
	OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
	OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
	OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0×óÓÒ·´ÖÃ 0xa1Õý³£
	OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0ÉÏÏ·´Öà 0xc8Õý³£
	OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WR_Byte(0x00,OLED_CMD);//-not offset
	OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
	OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
	OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
	OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
	OLED_WR_Byte(0x12,OLED_CMD);
	OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
	OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
	OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WR_Byte(0x02,OLED_CMD);//
	OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
	OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
	OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
	OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
	OLED_Clear();
	OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ 
}

按键与检测

u8 KEY_Scan(u8 mode)
{
	static u8 key=1;
	if(key&&(k1==0||k2==0||k3==0))
	{
		delayms(10);;   //Ïû¶¶
		key=0;

		if(k3==0)
		{
			return K1_MODE;
		}
		else if(k1==0)
		{
			return K2_ADD;
		}
		else if(k2==0)
		{
			return K3_DEC;	
		}
				
	}
	else if(k1==1&&k2==1&&k3==1)
	{
		key=1;	
	}
	if(mode)
	{
		key=1;
	}
	return 0;	
}

void KEY_Pros()
{
	u8 key;
	u8 juli_buf[3];  //°²È«¾àÀë
	
	key=KEY_Scan(0);
	
	if(key==K1_MODE)   //ģʽѡÔñ
	{
			mode++;
		if(mode==3)
			mode=0;
			OLED_Clear();
		  		
		if(mode==1)
		{
	
		OLED_ShowChinese(48,2,6,16);//mo
		OLED_ShowChinese(64,2,7,16);//ni
		OLED_ShowChinese(48,4,8,16);//xiao
		OLED_ShowChinese(64,4,9,16);//che
#if 0			
			
/****************************************************************/				
		OLED_ShowChinese(8,0,10,16);//×óÉÏ
		OLED_ShowChinese(24,0,11,16);//µã	
			
		OLED_ShowChinese(8,3,10,16);//×ó
		OLED_ShowChinese(24,3,11,16);//

    OLED_ShowChinese(8,6,10,16);//×óÏÂ
		OLED_ShowChinese(24,6,11,16);//
/****************************************************************/				
		OLED_ShowChinese(48,0,10,16);//ÉÏ
		OLED_ShowChinese(64,0,11,16);//
			

    OLED_ShowChinese(48,6,10,16);//ÏÂ
		OLED_ShowChinese(64,6,11,16);//			
/****************************************************************/				
		OLED_ShowChinese(88,0,10,16);//ÓÒÉÏ
		OLED_ShowChinese(104,0,11,16);//µã	
			
		OLED_ShowChinese(88,3,10,16);//ÓÒ
		OLED_ShowChinese(104,3,11,16);//

    OLED_ShowChinese(88,6,10,16);//ÓÒÏÂ
		OLED_ShowChinese(104,6,11,16);//		
/****************************************************************/
#endif

		}
 
			else if(mode==2)
		{
  			OLED_ShowString(17,0,"Setting",16);
      OLED_ShowString(0,2,"-------------",16);
			
			OLED_ShowString(0,4,"SET-JL:",16);
			OLED_ShowString(80,4,"cm",16);		
			
		}
		
		else 
		{
			 mode=0;	
       //mode_srf04();			
		}
		
	}
	
		if(mode==1)	 //ζÈÉÏÏÞÉèÖÃ
	  {
       srf04_probe();		
	/****************************************************************/		
			if(distance1!=0)//ÉÏ ¼ì²â
			{
					OLED_ShowChinese(48,0,10,16);//ÉÏ
		      OLED_ShowChinese(64,0,11,16);//
			}
			else if(distance1==0)
			{
			  OLED_ShowString(48,0,"  ",16);	
				OLED_ShowString(64,0,"  ",16);	
			}
/****************************************************************/			
				if((distance1!=0)&&(distance2!=0))//ÉÏ×ó ¼ì²â
			{
				OLED_ShowChinese(8,0,10,16);//×óÉÏ
				OLED_ShowChinese(24,0,11,16);//µã	
			}
			else if((distance1==0)&&(distance2==0))
			{
			  OLED_ShowString(8,0,"  ",16);	
				OLED_ShowString(24,0,"  ",16);	
			}
			
/****************************************************************/			
				if(distance2!=0)//×ó
			{
					OLED_ShowChinese(8,3,10,16);//×ó
		      OLED_ShowChinese(24,3,11,16);//
				
			}
			else if(distance2==0)
			{
			
			  OLED_ShowString(8,3,"  ",16);	
				OLED_ShowString(24,3,"  ",16);					
			}
/****************************************************************/	
				if((distance2!=0)&&(distance3!=0))//×óÏ ¼ì²â
			{
				OLED_ShowChinese(8,6,10,16);//×óÏÂ
				OLED_ShowChinese(24,6,11,16);//
			}
			else if((distance2==0)&&(distance3==0))
			{
			  OLED_ShowString(8,6,"  ",16);	
				OLED_ShowString(24,6,"  ",16);	
			}

/****************************************************************/				
				if(distance3!=0)//ÏÂ
			{
				 OLED_ShowChinese(48,6,10,16);//ÏÂ
				 OLED_ShowChinese(64,6,11,16);//		
			}
			else if(distance3==0)
			{
			  OLED_ShowString(48,6,"  ",16);	
				OLED_ShowString(64,6,"  ",16);		
			}
/****************************************************************/				
					if(distance4!=0)//ÓÒ
			{
				OLED_ShowChinese(88,3,10,16);//ÓÒ
				OLED_ShowChinese(104,3,11,16);//
			}
			else if(distance4==0)
			{
			  OLED_ShowString(88,3,"  ",16);	
				OLED_ShowString(104,3,"  ",16);
			}
/****************************************************************/				
				if((distance1!=0)&&(distance4!=0))//ÓÒÉÏ ¼ì²â
			{
				OLED_ShowChinese(88,0,10,16);//ÓÒÉÏ
				OLED_ShowChinese(104,0,11,16);//µã	
			}
			else if((distance1==0)&&(distance4==0))
			{
			  OLED_ShowString(88,0,"  ",16);	
				OLED_ShowString(104,0,"  ",16);	
			}			
			
/****************************************************************/				
				if((distance3!=0)&&(distance4!=0))//ÓÒÏ ¼ì²â
			{
				OLED_ShowChinese(88,6,10,16);//ÓÒÏÂ
				OLED_ShowChinese(104,6,11,16);//	
			}
			else if((distance3==0)&&(distance4==0))
			{
			  OLED_ShowString(88,6,"  ",16);	
				OLED_ShowString(104,6,"  ",16);	
			}					

/****************************************************************/
			
		}		
	

	if(mode==2)	 //ζÈÉÏÏÞÉèÖÃ
	{
	
			switch(key)	
		{
			case K2_ADD: 	   //¼Ó
						set_juli=set_juli+10;
						if(set_juli>=400)
							set_juli=400;//ÉÏÏÞ80¶È
						break;
			case K3_DEC: 	 //¼õ
						set_juli=set_juli-10;
						if(set_juli<=0)
							set_juli=0;//ÏÂÏÞ0£¬²»ÄÜΪ¸ºÊý
						break;
		}		
		
		juli_buf[0]=set_juli/100+0x30;
		juli_buf[1]=set_juli/10%10+0x30;
		juli_buf[2]=set_juli%10+0x30;
	
		OLED_ShowChar(56,4,juli_buf[0],16);
		OLED_ShowChar(64,4,juli_buf[1],16);
	  OLED_ShowChar(72,4,juli_buf[2],16);
		
		//At24c02Write(1,set_juli);
	}	
}

pcb与ad原理图

 

详情视频链接请点下方

基于单片机四路雷达显示探测系统_哔哩哔哩_bilibili

感兴趣的同学需要具体源码或者实物论文的可以加我qq:603908021

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫鸽咕咕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值