赞
踩
注:本文记录的原因是方便资料整理和电赛使用,所以有些地方写的可能不是那么清楚,望见谅。
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 0xDD
-
-
- void 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<8;i++)
- {
- Huidu_W_SDA(Byte & (0x80>>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<8;i++)
- {
- Huidu_W_SCL(1);
- if(Huidu_R_SDA()==1)
- Byte|=(0x80>>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 */
- }
记得初始化
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。