GP2Y0E03夏普红外测距传感器简单使用

夏普红外测距传感器规格书引脚如下

 一共七个引脚,如果要改地址的话还需要用到第八个引脚(当时改地址试了半天,仔细一看数据手册还有第八个引脚),第八个引脚Vpp如下图所示

 和GP2Y0E03通讯是用IIC协议,数据手册上具体协议格式如下

 笔者使用STM32F103系列单片机IIC通讯代码如下

void GP2_SDA_Mode(GPIOMode_TypeDef  sdagpio_mode)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; 
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 	GPIO_InitStructure.GPIO_Mode = sdagpio_mode;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
} 
void delay_us_us(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=10;  
      while(i--) ;    
   }
}
void GP2_IIC_Start(void)
{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SDA=1;	  	  
	GP2_IIC_SCL=1;
	delay_us_us(4);
 	GP2_IIC_SDA=0;
	delay_us_us(4);
	GP2_IIC_SCL=0;
}

void GP2_IIC_Stop(void)
{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SCL=0;
	GP2_IIC_SDA=0;
 	GP2_IIC_SCL=1; 
	delay_us_us(4);
	GP2_IIC_SDA=1;
	delay_us_us(4);	
	GP2_IIC_SCL=0;	
}
uint8_t GP2_IIC_Wait_Ack(void)
{
	uint8_t ucErrTime=0;
	GP2_SDA_Mode(GPIO_Mode_IN_FLOATING);	   
	delay_us_us(4);	   
	GP2_IIC_SCL=1;
	delay_us_us(4);	
	while(GP2_READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			GP2_IIC_Stop();
			return 1;
		}
	}
	GP2_IIC_SCL=0;//ʱÖÓÊä³ö0 	   
	return 0;  
}
void GP2_IIC_Ack(void)
{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SDA=0;
	delay_us_us(4);
	GP2_IIC_SCL=1;
	delay_us_us(4);
	GP2_IIC_SCL=0;
}
void GP2_IIC_NAck(void)

{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SDA=1;
	delay_us_us(4);
	GP2_IIC_SCL=1;
	delay_us_us(4);
	GP2_IIC_SCL=0;
}
void GP2_IIC_Send_Byte(uint8_t txd)

{                        
    uint8_t t;   
		GP2_SDA_Mode(GPIO_Mode_Out_OD);	 	    
    GP2_IIC_SCL=0;
    for(t=0;t<8;t++)
    {              
			if(txd&0x80)GP2_IIC_SDA=1;			
			else GP2_IIC_SDA=0;				
			txd<<=1; 	  
			delay_us_us(4);  
			GP2_IIC_SCL=1;
			delay_us_us(4); 
			GP2_IIC_SCL=0;	
			delay_us_us(4);
    }	 
} 
uint8_t GP2_IIC_Read_Byte(void)

{
	unsigned char i,receive=0;
	GP2_SDA_Mode(GPIO_Mode_IN_FLOATING);	        
	delay_us_us(4);
	for(i=0;i<8;i++ )
	{
		receive<<=1;		
	  GP2_IIC_SCL=1;
		delay_us_us(4);
		if(GP2_READ_SDA)receive |= 0x01; 
		delay_us_us(4); //1
		GP2_IIC_SCL=0; 
		delay_us_us(4); //1
	}	
	return receive;
}
uint8_t GP2_IIC_Write_1Byte(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t REG_data)
{
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack())
	{
		GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
		return 1;//ûӦ´ðÔòÍ˳ö
	}

	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();	
	delay_us_us(5);
	GP2_IIC_Send_Byte(REG_data);
	GP2_IIC_Wait_Ack();	
	GP2_IIC_Stop();
	return 0;
}
uint8_t GP2_IIC_Read_1Byte(uint8_t SlaveAddress, uint8_t REG_Address)
{
	uint8_t REG_data; 
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack())
	{
		 GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
		 return 1;//ûӦ´ðÔòÍ˳ö
	}		

	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();
	GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
	delay_us_us(5);
	GP2_IIC_Start(); 
	GP2_IIC_Send_Byte(SlaveAddress|0x01);
	GP2_IIC_Wait_Ack();
	REG_data = GP2_IIC_Read_Byte();
	GP2_IIC_Stop();
	return REG_data;
}
 
uint8_t GP2_I2C_Read_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
{
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack()) 
	{
		GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
		return 1;//ûӦ´ðÔòÍ˳ö
	}
	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();
	GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
	delay_us_us(5);
	GP2_IIC_Start(); 
	GP2_IIC_Send_Byte(SlaveAddress|0x01);
	GP2_IIC_Wait_Ack();
	while(len)
	{
		*buf = GP2_IIC_Read_Byte();
		if(1 == len)
		{
			GP2_IIC_NAck();
		}
		else
		{
			GP2_IIC_Ack();
		}
		buf++;
		len--;
	}
	GP2_IIC_Stop();

	return STATUS_OK;
}
uint8_t GP2_I2C_Write_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
{
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack()) 
	{
		GP2_IIC_Stop();
		return 1;
	}
	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();
	while(len--)
	{
		GP2_IIC_Send_Byte(*buf++);
		GP2_IIC_Wait_Ack();
	}
	GP2_IIC_Stop();
	return STATUS_OK;
}

PS:使用时请注意镜面反射的影响,如果不改地址使用多个传感器模块,需控制使能脚依次读取数据

版权声明:本文为CSDN博主「宋君千里」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42388209/article/details/119150572

夏普红外测距传感器规格书引脚如下

 一共七个引脚,如果要改地址的话还需要用到第八个引脚(当时改地址试了半天,仔细一看数据手册还有第八个引脚),第八个引脚Vpp如下图所示

 和GP2Y0E03通讯是用IIC协议,数据手册上具体协议格式如下

 笔者使用STM32F103系列单片机IIC通讯代码如下

void GP2_SDA_Mode(GPIOMode_TypeDef  sdagpio_mode)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; 
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 	GPIO_InitStructure.GPIO_Mode = sdagpio_mode;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
} 
void delay_us_us(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=10;  
      while(i--) ;    
   }
}
void GP2_IIC_Start(void)
{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SDA=1;	  	  
	GP2_IIC_SCL=1;
	delay_us_us(4);
 	GP2_IIC_SDA=0;
	delay_us_us(4);
	GP2_IIC_SCL=0;
}

void GP2_IIC_Stop(void)
{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SCL=0;
	GP2_IIC_SDA=0;
 	GP2_IIC_SCL=1; 
	delay_us_us(4);
	GP2_IIC_SDA=1;
	delay_us_us(4);	
	GP2_IIC_SCL=0;	
}
uint8_t GP2_IIC_Wait_Ack(void)
{
	uint8_t ucErrTime=0;
	GP2_SDA_Mode(GPIO_Mode_IN_FLOATING);	   
	delay_us_us(4);	   
	GP2_IIC_SCL=1;
	delay_us_us(4);	
	while(GP2_READ_SDA)
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			GP2_IIC_Stop();
			return 1;
		}
	}
	GP2_IIC_SCL=0;//ʱÖÓÊä³ö0 	   
	return 0;  
}
void GP2_IIC_Ack(void)
{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SDA=0;
	delay_us_us(4);
	GP2_IIC_SCL=1;
	delay_us_us(4);
	GP2_IIC_SCL=0;
}
void GP2_IIC_NAck(void)

{
	GP2_IIC_SCL=0;
	GP2_SDA_Mode(GPIO_Mode_Out_OD);	
	GP2_IIC_SDA=1;
	delay_us_us(4);
	GP2_IIC_SCL=1;
	delay_us_us(4);
	GP2_IIC_SCL=0;
}
void GP2_IIC_Send_Byte(uint8_t txd)

{                        
    uint8_t t;   
		GP2_SDA_Mode(GPIO_Mode_Out_OD);	 	    
    GP2_IIC_SCL=0;
    for(t=0;t<8;t++)
    {              
			if(txd&0x80)GP2_IIC_SDA=1;			
			else GP2_IIC_SDA=0;				
			txd<<=1; 	  
			delay_us_us(4);  
			GP2_IIC_SCL=1;
			delay_us_us(4); 
			GP2_IIC_SCL=0;	
			delay_us_us(4);
    }	 
} 
uint8_t GP2_IIC_Read_Byte(void)

{
	unsigned char i,receive=0;
	GP2_SDA_Mode(GPIO_Mode_IN_FLOATING);	        
	delay_us_us(4);
	for(i=0;i<8;i++ )
	{
		receive<<=1;		
	  GP2_IIC_SCL=1;
		delay_us_us(4);
		if(GP2_READ_SDA)receive |= 0x01; 
		delay_us_us(4); //1
		GP2_IIC_SCL=0; 
		delay_us_us(4); //1
	}	
	return receive;
}
uint8_t GP2_IIC_Write_1Byte(uint8_t SlaveAddress,uint8_t REG_Address,uint8_t REG_data)
{
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack())
	{
		GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
		return 1;//ûӦ´ðÔòÍ˳ö
	}

	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();	
	delay_us_us(5);
	GP2_IIC_Send_Byte(REG_data);
	GP2_IIC_Wait_Ack();	
	GP2_IIC_Stop();
	return 0;
}
uint8_t GP2_IIC_Read_1Byte(uint8_t SlaveAddress, uint8_t REG_Address)
{
	uint8_t REG_data; 
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack())
	{
		 GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
		 return 1;//ûӦ´ðÔòÍ˳ö
	}		

	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();
	GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
	delay_us_us(5);
	GP2_IIC_Start(); 
	GP2_IIC_Send_Byte(SlaveAddress|0x01);
	GP2_IIC_Wait_Ack();
	REG_data = GP2_IIC_Read_Byte();
	GP2_IIC_Stop();
	return REG_data;
}
 
uint8_t GP2_I2C_Read_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
{
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack()) 
	{
		GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
		return 1;//ûӦ´ðÔòÍ˳ö
	}
	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();
	GP2_IIC_Stop();//ÊÍ·Å×ÜÏß
	delay_us_us(5);
	GP2_IIC_Start(); 
	GP2_IIC_Send_Byte(SlaveAddress|0x01);
	GP2_IIC_Wait_Ack();
	while(len)
	{
		*buf = GP2_IIC_Read_Byte();
		if(1 == len)
		{
			GP2_IIC_NAck();
		}
		else
		{
			GP2_IIC_Ack();
		}
		buf++;
		len--;
	}
	GP2_IIC_Stop();

	return STATUS_OK;
}
uint8_t GP2_I2C_Write_nByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t *buf, uint16_t len)
{
	GP2_IIC_Start();
	GP2_IIC_Send_Byte(SlaveAddress);
	if(GP2_IIC_Wait_Ack()) 
	{
		GP2_IIC_Stop();
		return 1;
	}
	GP2_IIC_Send_Byte(REG_Address);
	GP2_IIC_Wait_Ack();
	while(len--)
	{
		GP2_IIC_Send_Byte(*buf++);
		GP2_IIC_Wait_Ack();
	}
	GP2_IIC_Stop();
	return STATUS_OK;
}

PS:使用时请注意镜面反射的影响,如果不改地址使用多个传感器模块,需控制使能脚依次读取数据

版权声明:本文为CSDN博主「宋君千里」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42388209/article/details/119150572

生成海报
点赞 0

宋君千里

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

pwm电机调速的原理介绍与代码实现

1、pwm实现调速的原理与介绍 PWM(Pulse Width Modulation)脉冲宽度调制。 1)占空比 pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。 通过调节PWM的占空比就能调节IO口上电压的持续

【STM32Cube笔记】2-STM32Cube安装教程

【STM32Cube笔记】系列文章目录 1-基于STM32的VSCode入门级教程前言 2-STM32Cube安装教程 3-STM32CubeIDE汉化 4-STM32Cube配置时钟设置 5-跑马灯引脚配置 6-Cortex-M7内核基本配

Proteus STM32仿真学习板

一 全球IC爆冷,价格猛涨,ST系列单片机更是一马当先,贵到你怀疑人生。这个时候想学习STM32的基础去购买开发板是很不划算的,而且用完就搁置了,吃灰到永远,