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

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
GP2Y0A21YK0F是一种红外测距传感器,采用红外线发射和接收技术来测量物体与传感器之间的距离。该传感器具有高精度和灵敏度,可应用于多种领域,例如机器人导航、安全系统和自动化控制。 GP2Y0A21YK0F传感器具有以下特点: 1. 防尘性能好:传感器的外壳采用特殊材料制成,具有良好的防尘性能,可适应恶劣环境下的使用。 2. 高精度测距:传感器采用红外线测量技术,具有高精度的测距性能,可以测量10cm到80cm范围内物体的距离。 3. 数字输出:传感器输出为数字信号,方便与微控制器等其他电子设备进行连接和数据处理。 4. 快速响应时间:传感器具有快速的响应时间,可以实时获取物体与传感器之间的距离信息。 5. 低功耗设计:传感器采用低功耗设计,节省能源,延长电池寿命,在便携设备和电池供电系统中有较好的应用潜力。 GP2Y0A21YK0F传感器可用于室内和室外环境中,具有广泛的应用领域。比如在机器人导航中,传感器可以用来检测机器人与障碍物之间的距离,实现避障功能;在安全系统中,传感器可以用来检测人体或其他物体的接近,发出警报信号;在自动化控制中,传感器可以用来监测物体的位置和距离,实现精确控制。 总之,GP2Y0A21YK0F红外测距传感器是一种高性能的测距设备,具有高精度、快速响应和低功耗等优点,广泛应用于各个领域中的距离测量和控制任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值