> 技术文档 > 备赛记录第一天——感为八路传感器IIC使用_灰度传感器代码

备赛记录第一天——感为八路传感器IIC使用_灰度传感器代码

注:本文记录的原因是方便资料整理和电赛使用,所以有些地方写的可能不是那么清楚,望见谅。

1、使用元器件:感为八路灰度传感器、STM32;

2、配置过程:感为八路灰度传感器每次使用前均需校准,校准方式如下,注意在校准时不要插任何跳线帽。

3、代码编写:

  博主使用的是IIC通信,获取八路传感器的10值,根据资料,传感器的八路10值会被打包成一个char类型8位数据,例如:当八路传感器均为高电平时,输出1111 1111;代码根据江科大IIC例程改编,这里不再赘述:

#include \"main.h\"#include \"gpio.h\"#define Huidu_Address 0x9E#define Huidu_Num_Address 0xDDvoid Huidu_W_SCL(uint8_t BitValue){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,(GPIO_PinState)BitValue);Delay_us(10);}void Huidu_W_SDA(uint8_t BitValue){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,(GPIO_PinState)BitValue);Delay_us(10);}uint8_t Huidu_R_SDA(void){uint8_t BitValue;BitValue =HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15);Delay_us(10);return BitValue;}void Huidu_Init(void){ MX_GPIO_Init();Huidu_W_SCL(1);Huidu_W_SDA(1);}void Huidu_Start(void){Huidu_W_SCL(1);Huidu_W_SDA(1);Huidu_W_SDA(0);Huidu_W_SCL(0);}void Huidu_Stop(void){Huidu_W_SCL(0);Huidu_W_SDA(0);Huidu_W_SCL(1);Huidu_W_SDA(1);}void Huidu_SendByte(uint8_t Byte){uint8_t i=0;for(i=0;i>i));Huidu_W_SCL(1);Huidu_W_SCL(0);}}uint8_t Huidu_ReceiveByte(void){ uint8_t Byte=0x00;Huidu_W_SDA(1);uint8_t i=0;for(i=0;i>i); Huidu_W_SCL(0);}return Byte;}uint8_t Huidu_ReceiveAck(void){uint8_t AckBit;Huidu_W_SDA(1);Huidu_W_SCL(1);AckBit = Huidu_R_SDA();Huidu_W_SCL(0);return AckBit;}void Huidu_SendAck(uint8_t AckBit){Huidu_W_SDA(AckBit);Huidu_W_SCL(1);Huidu_W_SCL(0);}void Huidu_GetNum_Start(void){Huidu_Start();Huidu_SendByte(Huidu_Address);Huidu_ReceiveAck();Huidu_SendByte(Huidu_Num_Address);Huidu_ReceiveAck();Huidu_Stop();}char Huidu_GetNum(void){char GetNum;Huidu_Start();Huidu_SendByte(Huidu_Address | 0x9F);Huidu_ReceiveAck();GetNum = Huidu_ReceiveByte();Huidu_SendAck(1); Huidu_Stop();return GetNum;}

有以下三种读取方式:

我选择第二种,并在OLED上显示:

主程序代码:

 Huidu_Init(); Huidu_GetNum_Start(); while (1) {aa=Huidu_GetNum(); OLED_ShowSignedNum(2, 1, aa, 8); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ }

记得初始化