MPU6050(姿态传感器)
BH1750(光照度)
HDC1080(温湿度)
MCP3421(数模转换)
都在一个I2C总线上

main.c

  1. /**********************
  2. 芯片:STM32F103
  3. 实现功能:
  4. 引脚:
  5. ***********************/
  6. #include "stdio.h"
  7. #include "stm32f10x.h"
  8. #include "main.h"
  9. #include "bsp_DMAusart2.h"
  10. #include "bsp_tim3.h"
  11. #include "bsp_tim2.h"
  12. #include "bsp_SysTick.h"
  13. #include "bsp_dwt.h"
  14. #include "bsp_i2c.h"
  15. #include "bsp_crc.h"
  16. #include "bsp_mpu6050.h"
  17. #include "bsp_bh1750.h"
  18. #include "bsp_hdc1080.h"
  19. #include "bsp_mcp3421.h"
  20. extern unsigned int Task_Delay[NumOfTask];
  21. uint8_t Scan_key_flag;
  22. float DWT_UsedTime = 0; //DWT
  23. int main()
  24. {
  25. // 初始化USART
  26. USART2_DMA_Init(9600, TwoUART.Tx_buf, TwoUART.Rx_buf, USART2_REC_LEN);
  27. USART2_DMASendString("AppStart!\n", sizeof("AppStart!"));
  28. // 初始化定时器
  29. TIM2_Init();
  30. //TIM3_Init(36-1, 1);1us
  31. TIM3_Int_Init(71, 999); // 1ms
  32. uint8_t status1 = 0;
  33. uint8_t hdc1080_delay = 0;
  34. uint8_t bh1750_delay = 0;
  35. uint8_t hdc1080_init_flage = 0;
  36. float bh1750_dat;
  37. float temper = 0, humidity = 0;
  38. float mcp3421_dat = 0;
  39. int bh1750_err = 0, hdc1080_err = 0, MCP3421_err = 0;
  40. short mpu6050_Accel[3]; // 加速度
  41. short mpu6050_Gyro[3]; // 陀螺仪
  42. float mpu6050_Temp; // 姿态传感器内部温度
  43. uint8_t mpu6050_init_flage = 0;
  44. while(1)
  45. {
  46. DWT_UsedTime = DWT_TS_GET_Flag();
  47. if(Scan_key_flag == 1)
  48. {
  49. Scan_key_flag = 0;
  50. // 计数
  51. hdc1080_delay++;
  52. bh1750_delay++;
  53. }
  54. switch(status1)
  55. {
  56. case 0: // bh1750光照
  57. bh1750_err = BH1750_READ_DATA(&bh1750_dat , &bh1750_delay);
  58. if(bh1750_err >= 0)
  59. {
  60. status1 = 1;
  61. }
  62. break;
  63. case 1: // mcp3421温湿度
  64. if(hdc1080_init_flage == 0)
  65. {
  66. HDC1080_Init();
  67. hdc1080_init_flage = 1;
  68. }else
  69. {
  70. hdc1080_err = HDC1080_Read_TemperAndHumidity( &temper, &humidity, &hdc1080_delay);
  71. if(hdc1080_err >= 0)
  72. {
  73. status1 = 2;
  74. }
  75. }
  76. break;
  77. case 2: // hdc1080数压力
  78. MCP3421_Init();
  79. MCP3421_Read(&mcp3421_dat);
  80. status1 = 3;
  81. break;
  82. case 3: // mpu6050姿态传感器
  83. if(mpu6050_init_flage == 0)
  84. {
  85. MPU6050_Init();
  86. mpu6050_init_flage = 1;
  87. }else
  88. {
  89. if(MPU6050ReadID() == 1) // 检测MPU是否存在
  90. {
  91. MPU6050ReadAcc(mpu6050_Accel); // 加速度
  92. MPU6050ReadGyro(mpu6050_Gyro); // 陀螺仪
  93. MPU6050_ReturnTemp(&mpu6050_Temp); // 器件内部温度
  94. }
  95. status1 = 0;
  96. }
  97. break;
  98. }
  99. DWT_UsedTime = DWT_TS_GET();
  100. // 输出数据
  101. if(bh1750_err >=0 && hdc1080_err >=0 )
  102. {
  103. char buffer6[256] = {0};
  104. sprintf(buffer6, "时间: %6.7f 计数:%d 光照: %5.5f 温度: %5.5f 湿度: %5.5f 压力: %5.5f Status%d\r\n 姿态: 加速度: %d %d %d 陀螺仪:%d %d %d 温度:%5.2f\r\n",
  105. DWT_UsedTime/72000000.0, hdc1080_delay, bh1750_dat, temper, humidity, mcp3421_dat, status1,
  106. mpu6050_Accel[0], mpu6050_Accel[1], mpu6050_Accel[2],
  107. mpu6050_Gyro[0], mpu6050_Gyro[1], mpu6050_Gyro[2], mpu6050_Temp); // 计数耗时时间
  108. USART2_DMASendString(buffer6, 256);
  109. }
  110. }
  111. }

程序:

STM32_Project_I2C_Connect5.zip