基于51/STM32 GY33颜色传感器模块测试 串口打印RGB值
一. 实现功能
上电后串口打印从GY33颜色模块获取的RGB原始值和RGB888值
二. 硬件清单
- GY33颜色模块
- STM32F103C8T6/STC89C52RC
- SWD或JLINK仿真器(直接用CH340串口模块烧录也行,不过注意配置BOOT)
- 杜邦线若干
三. 资料清单
程序代码
文档资料
四. 模块简介
1.基本参数
2.引脚说明
五. 接线
基于STM32 +GY33颜色模块接线
模块------------------------------- STM32
VCC-----------------------------------5V
GND-----------------------------------GND
SCL ----------------- --------------- - GPIOB_6
SDA ----------------- --------------- -GPIOB_7
基于51 +GY33颜色模块接线
模块---------------------------------STC89C52RC
VCC-------------------------------------5V
GND-------------------------------------GND
SCL ----------------- ----------------- -- P3.6
SDA ----------------- --------------- ---- P3.7
六.代码说明
以下以32代码为例:
1. 模块引脚配置
void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SCL_H;
SDA_H;
}
2. IIC协议底层函数
u8 I2C_Start(void)
{
SDA_H;
delay_1us(5);
SCL_H;
delay_1us(5);
if(!SDA_read) return 0;
SDA_L;
delay_1us(5);
if(SDA_read) return 0;
SCL_L;
delay_1us(5);
return 1;
}
void I2C_Stop(void)
{
SDA_L;
SCL_L;
delay_1us(5);
SCL_H;
delay_1us(5);
SDA_H;
}
void I2C_SendACK(u8 i)
{
if(1==i)
SDA_H;
else
SDA_L;
SCL_H;
delay_1us(5);
SCL_L ;
delay_1us(5);
}
u8 I2C_WaitAck(void)
{
uint16_t i=0;
SDA_H;
SCL_H;
while(SDA_read)
{
i++;
if(i==500)
break;
}
if(SDA_read)
{
SCL_L;
return RESET;
}
delay_1us(5);
SCL_L;
delay_1us(5);
return SET;
}
void I2C_SendByte(u8 dat)
{
u8 i;
SCL_L;
for (i=0; i<8; i++)
{
if(dat&0x80)
SDA_H;
else
SDA_L;
SCL_H;
delay_1us(5);
SCL_L;
delay_1us(5);
dat <<= 1;
}
}
u8 I2C_RecvByte()
{
u8 i;
u8 dat = 0;
SDA_H;
delay_1us(1);
for (i=0; i<8; i++)
{
dat <<= 1;
SCL_H;
if(SDA_read)
dat |=0x01;
delay_1us(5);
SCL_L;
delay_1us(5);
}
return dat;
}
u8 Single_WriteI2C_byte(u8 Slave_Address,u8 REG_Address,u8 data)
{
if(I2C_Start()==0)
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address);
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(REG_Address);
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(data);
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_Stop();
return SET;
}
u8 Single_ReadI2C(u8 Slave_Address,u8 REG_Address,u8 *REG_data,u8 length)
{
if(I2C_Start()==0)
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address);
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
I2C_SendByte(REG_Address);
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
if(I2C_Start()==0)
{I2C_Stop(); return RESET;}
I2C_SendByte(Slave_Address+1);
if(!I2C_WaitAck()){I2C_Stop(); return RESET;}
while(length-1)
{
*REG_data++=I2C_RecvByte();
I2C_SendACK(0);
length--;
}
*REG_data=I2C_RecvByte();
I2C_SendACK(1);
I2C_Stop();
return SET;
}
3. 主函数
int main(void)
{
u8 raw_data[9]={0},data=0;
u16 datas[4]={0};
delay_init(72);
USART_Config();
I2C_GPIO_Config();
delay_ms(1);
Single_WriteI2C_byte(0xb4,0x10,0x31);
while(1)
{
if(Single_ReadI2C(0xb4,0x00,raw_data,8))
{
datas[0]=(raw_data[0]<<8)|raw_data[1];
datas[1]=(raw_data[2]<<8)|raw_data[3];
datas[2]=(raw_data[4]<<8)|raw_data[5];
datas[3]=(raw_data[6]<<8)|raw_data[7];
printf("原始AD值 AD_R:%d AD_G:%d AD_B:%d AD_C:%d \r\n",datas[0],datas[1],datas[2],datas[3]);
}
if(Single_ReadI2C(0xb4,0x08,raw_data,4))
{
datas[0]=(raw_data[0]<<8)|raw_data[1];
datas[1]=(raw_data[2]<<8)|raw_data[3];
}
if(Single_ReadI2C(0xb4,0x0f,raw_data,1))
{
printf("亮度:%d 色温:%d 颜色:%x \r\n",datas[0],datas[1],raw_data[0]);
}
if(Single_ReadI2C(0xb4,0x0c,raw_data,3))
{
printf("RGB值 R:%d G:%d B:%d \r\n",raw_data[0],raw_data[1],raw_data[2]);
}
delay_ms(1000);
}
}
七.资料获取
加群私聊群主可免费获得,也可加群学习交流 群号:1041406448。
|