设计思路:
模式一:思路超声波距离检测,按键按下进入距离探测模式,屏幕显示四路声波的距离
如图下:
模式二:定位探测模式,对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原理图
详情视频链接请点下方
感兴趣的同学需要具体源码或者实物论文的可以加我qq:603908021