当前位置:   article > 正文

备赛记录第一天——感为八路传感器IIC使用_感为8路灰度传感器串行读数据

感为8路灰度传感器串行读数据

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

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

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

3、代码编写:

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

  1. #include "main.h"
  2. #include "gpio.h"
  3. #define Huidu_Address 0x9E
  4. #define Huidu_Num_Address 0xDD
  5. void Huidu_W_SCL(uint8_t BitValue)
  6. {
  7. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,(GPIO_PinState)BitValue);
  8. Delay_us(10);
  9. }
  10. void Huidu_W_SDA(uint8_t BitValue)
  11. {
  12. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,(GPIO_PinState)BitValue);
  13. Delay_us(10);
  14. }
  15. uint8_t Huidu_R_SDA(void)
  16. {
  17. uint8_t BitValue;
  18. BitValue =HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15);
  19. Delay_us(10);
  20. return BitValue;
  21. }
  22. void Huidu_Init(void)
  23. {
  24. MX_GPIO_Init();
  25. Huidu_W_SCL(1);
  26. Huidu_W_SDA(1);
  27. }
  28. void Huidu_Start(void)
  29. {
  30. Huidu_W_SCL(1);
  31. Huidu_W_SDA(1);
  32. Huidu_W_SDA(0);
  33. Huidu_W_SCL(0);
  34. }
  35. void Huidu_Stop(void)
  36. {
  37. Huidu_W_SCL(0);
  38. Huidu_W_SDA(0);
  39. Huidu_W_SCL(1);
  40. Huidu_W_SDA(1);
  41. }
  42. void Huidu_SendByte(uint8_t Byte)
  43. {
  44. uint8_t i=0;
  45. for(i=0;i<8;i++)
  46. {
  47. Huidu_W_SDA(Byte & (0x80>>i));
  48. Huidu_W_SCL(1);
  49. Huidu_W_SCL(0);
  50. }
  51. }
  52. uint8_t Huidu_ReceiveByte(void)
  53. {
  54. uint8_t Byte=0x00;
  55. Huidu_W_SDA(1);
  56. uint8_t i=0;
  57. for(i=0;i<8;i++)
  58. {
  59. Huidu_W_SCL(1);
  60. if(Huidu_R_SDA()==1)
  61. Byte|=(0x80>>i);
  62. Huidu_W_SCL(0);
  63. }
  64. return Byte;
  65. }
  66. uint8_t Huidu_ReceiveAck(void)
  67. {
  68. uint8_t AckBit;
  69. Huidu_W_SDA(1);
  70. Huidu_W_SCL(1);
  71. AckBit = Huidu_R_SDA();
  72. Huidu_W_SCL(0);
  73. return AckBit;
  74. }
  75. void Huidu_SendAck(uint8_t AckBit)
  76. {
  77. Huidu_W_SDA(AckBit);
  78. Huidu_W_SCL(1);
  79. Huidu_W_SCL(0);
  80. }
  81. void Huidu_GetNum_Start(void)
  82. {
  83. Huidu_Start();
  84. Huidu_SendByte(Huidu_Address);
  85. Huidu_ReceiveAck();
  86. Huidu_SendByte(Huidu_Num_Address);
  87. Huidu_ReceiveAck();
  88. Huidu_Stop();
  89. }
  90. char Huidu_GetNum(void)
  91. {
  92. char GetNum;
  93. Huidu_Start();
  94. Huidu_SendByte(Huidu_Address | 0x9F);
  95. Huidu_ReceiveAck();
  96. GetNum = Huidu_ReceiveByte();
  97. Huidu_SendAck(1);
  98. Huidu_Stop();
  99. return GetNum;
  100. }

有以下三种读取方式:

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

主程序代码:

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

记得初始化

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号