找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3634|回复: 0
打印 上一主题 下一主题
收起左侧

stm32f103c8t6的GY_85模块测试源程序

[复制链接]
跳转到指定楼层
楼主
ID:342599 发表于 2018-6-1 00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32f103c8t6的GY_85模块测试程序已测试,实用

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "../HARDWARE/OLED/oled.h"
  4. #include  <math.h>

  5. #define   uchar unsigned char
  6. #define   uint unsigned int       
  7. #define   OSS 0         //        BMP085使用

  8. //L3G4200D内部寄存器
  9. #define CTRL_REG1 0x20
  10. #define CTRL_REG2 0x21
  11. #define CTRL_REG3 0x22
  12. #define CTRL_REG4 0x23
  13. #define CTRL_REG5 0x24
  14. #define OUT_X_L 0x28
  15. #define OUT_X_H 0x29
  16. #define OUT_Y_L 0x2A
  17. #define OUT_Y_H 0x2B
  18. #define OUT_Z_L 0x2C
  19. #define OUT_Z_H 0x2D

  20. //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  21. #define        HMC5883L_Addr   0x3C        //磁场传感器器件地址
  22. #define        ADXL345_Addr    0xA6        //加速度传感器器件地址
  23. #define        BMP085_Addr     0xee        //气压传感器器件地址
  24. #define        L3G4200_Addr    0xD2        //陀螺仪传感器器件地址

  25. unsigned char BUF[8];                         //接收数据缓存区
  26. char  test=0;
  27. int   x,y;
  28. float angle;
  29. uchar ge,shi,bai,qian,wan,shiwan;           //显示变量
  30. int A_X,A_Y,A_Z;
  31. short T_X,T_Y,T_Z;

  32. short data_xyz[3];
  33. float Roll,Pitch,Q,T,K;


  34. //***BMP085使用
  35. short ac1;
  36. short ac2;
  37. short ac3;
  38. unsigned short ac4;
  39. unsigned short ac5;
  40. unsigned short ac6;
  41. short b1;
  42. short b2;
  43. short mb;
  44. short mc;
  45. short md;

  46. long  temperature;
  47. long  pressure;
  48. //********
  49. //************************************++++++++++++++++++++++++++++++++
  50. /*模拟IIC端口输出输入定义*/
  51. #define SCL_H         GPIOB->BSRR = GPIO_Pin_6
  52. #define SCL_L         GPIOB->BRR  = GPIO_Pin_6
  53.    
  54. #define SDA_H         GPIOB->BSRR = GPIO_Pin_7
  55. #define SDA_L         GPIOB->BRR  = GPIO_Pin_7

  56. #define SCL_read      GPIOB->IDR  & GPIO_Pin_6
  57. #define SDA_read      GPIOB->IDR  & GPIO_Pin_7

  58. /* 函数申明 -----------------------------------------------*/
  59. void RCC_Configuration(void);
  60. void GPIO_Configuration(void);
  61. void NVIC_Configuration(void);
  62. void USART1_Configuration(void);
  63. void USART2_Configuration(void);
  64. void USART3_Configuration(void);
  65. void USART4_Configuration(void);
  66. void USART5_Configuration(void);
  67. void WWDG_Configuration(void);
  68. void Delay(u32 nTime);
  69. void Delayms(vu32 m);  
  70. void conversion(long temp_data);
  71. void adxl345_angle(void);
  72. /* 变量定义 ----------------------------------------------*/

  73. //***************************************************
  74. void conversion(long temp_data)  
  75. {     
  76.     shiwan=temp_data/100000+0x30 ;
  77.     temp_data=temp_data%100000;   //取余运算
  78.     wan=temp_data/10000+0x30 ;
  79.     temp_data=temp_data%10000;   //取余运算
  80.         qian=temp_data/1000+0x30 ;
  81.     temp_data=temp_data%1000;    //取余运算
  82.     bai=temp_data/100+0x30   ;
  83.     temp_data=temp_data%100;     //取余运算
  84.     shi=temp_data/10+0x30    ;
  85.     temp_data=temp_data%10;      //取余运算
  86.     ge=temp_data+0x30;        
  87. }
  88. /*******************************************************************************
  89. * Function Name  : I2C_GPIO_Config
  90. * Description    : Configration Simulation IIC GPIO
  91. * Input          : None
  92. * Output         : None
  93. * Return         : None
  94. ****************************************************************************** */
  95. void I2C_GPIO_Config(void)
  96. {
  97.   GPIO_InitTypeDef  GPIO_InitStructure;

  98.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  99.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  100.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  101.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  102.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  103.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  104.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  105.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  106. }

  107. /*******************************************************************************
  108. * Function Name  : I2C_delay
  109. * Description    : Simulation IIC Timing series delay
  110. * Input          : None
  111. * Output         : None
  112. * Return         : None
  113. ****************************************************************************** */
  114. void I2C_delay(void)
  115. {
  116.                
  117.    u8 i=30; //这里可以优化速度        ,经测试最低到5还能写入
  118.    while(i)
  119.    {
  120.      i--;
  121.    }  
  122. }

  123. void delay5ms(void)
  124. {
  125.                
  126.    int i=5000;  
  127.    while(i)
  128.    {
  129.      i--;
  130.    }  
  131. }
  132. /*******************************************************************************
  133. * Function Name  : I2C_Start
  134. * Description    : Master Start Simulation IIC Communication
  135. * Input          : None
  136. * Output         : None
  137. * Return         : Wheather         Start
  138. ****************************************************************************** */
  139. int I2C_Start(void)
  140. {
  141.         SDA_H;
  142.         SCL_H;
  143.         I2C_delay();
  144.         if(!SDA_read)return 0;        //SDA线为低电平则总线忙,退出
  145.         SDA_L;
  146.         I2C_delay();
  147.         if(SDA_read) return 0;        //SDA线为高电平则总线出错,退出
  148.         SDA_L;
  149.         I2C_delay();
  150.         return 1;
  151. }
  152. /*******************************************************************************
  153. * Function Name  : I2C_Stop
  154. * Description    : Master Stop Simulation IIC Communication
  155. * Input          : None
  156. * Output         : None
  157. * Return         : None
  158. ****************************************************************************** */
  159. void I2C_Stop(void)
  160. {
  161.         SCL_L;
  162.         I2C_delay();
  163.         SDA_L;
  164.         I2C_delay();
  165.         SCL_H;
  166.         I2C_delay();
  167.         SDA_H;
  168.         I2C_delay();
  169. }
  170. /*******************************************************************************
  171. * Function Name  : I2C_Ack
  172. * Description    : Master Send Acknowledge Single
  173. * Input          : None
  174. * Output         : None
  175. * Return         : None
  176. ****************************************************************************** */
  177. void I2C_Ack(void)
  178. {       
  179.         SCL_L;
  180.         I2C_delay();
  181.         SDA_L;
  182.         I2C_delay();
  183.         SCL_H;
  184.         I2C_delay();
  185.         SCL_L;
  186.         I2C_delay();
  187. }   
  188. /*******************************************************************************
  189. * Function Name  : I2C_NoAck
  190. * Description    : Master Send No Acknowledge Single
  191. * Input          : None
  192. * Output         : None
  193. * Return         : None
  194. ****************************************************************************** */
  195. void I2C_NoAck(void)
  196. {       
  197.         SCL_L;
  198.         I2C_delay();
  199.         SDA_H;
  200.         I2C_delay();
  201.         SCL_H;
  202.         I2C_delay();
  203.         SCL_L;
  204.         I2C_delay();
  205. }
  206. /*******************************************************************************
  207. * Function Name  : I2C_WaitAck
  208. * Description    : Master Reserive Slave Acknowledge Single
  209. * Input          : None
  210. * Output         : None
  211. * Return         : Wheather         Reserive Slave Acknowledge Single
  212. ****************************************************************************** */
  213. int I2C_WaitAck(void)          //返回为:=1有ACK,=0无ACK
  214. {
  215.         SCL_L;
  216.         I2C_delay();
  217.         SDA_H;                       
  218.         I2C_delay();
  219.         SCL_H;
  220.         I2C_delay();
  221.         if(SDA_read)
  222.         {
  223.       SCL_L;
  224.           I2C_delay();
  225.       return 0;
  226.         }
  227.         SCL_L;
  228.         I2C_delay();
  229.         return 1;
  230. }
  231. /*******************************************************************************
  232. * Function Name  : I2C_SendByte
  233. * Description    : Master Send a Byte to Slave
  234. * Input          : Will Send Date
  235. * Output         : None
  236. * Return         : None
  237. ****************************************************************************** */
  238. void I2C_SendByte(u8 SendByte) //数据从高位到低位//
  239. {
  240.     u8 i=8;
  241.     while(i--)
  242.     {
  243.         SCL_L;
  244.         I2C_delay();
  245.       if(SendByte&0x80)
  246.         SDA_H;  
  247.       else
  248.         SDA_L;   
  249.         SendByte<<=1;
  250.         I2C_delay();
  251.                 SCL_H;
  252.         I2C_delay();
  253.     }
  254.     SCL_L;
  255. }  
  256. /*******************************************************************************
  257. * Function Name  : I2C_RadeByte
  258. * Description    : Master Reserive a Byte From Slave
  259. * Input          : None
  260. * Output         : None
  261. * Return         : Date From Slave
  262. ****************************************************************************** */
  263. unsigned char I2C_RadeByte(void)  //数据从高位到低位//
  264. {
  265.     u8 i=8;
  266.     u8 ReceiveByte=0;

  267.     SDA_H;                               
  268.     while(i--)
  269.     {
  270.       ReceiveByte<<=1;      
  271.       SCL_L;
  272.       I2C_delay();
  273.           SCL_H;
  274.       I2C_delay();       
  275.       if(SDA_read)
  276.       {
  277.         ReceiveByte|=0x01;
  278.       }
  279.     }
  280.     SCL_L;
  281.     return ReceiveByte;
  282. }
  283. //ZRX         
  284. //单字节写入*******************************************

  285. int Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)                     //void
  286. {
  287.           if(!I2C_Start())return 0;
  288.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址
  289.     if(!I2C_WaitAck()){I2C_Stop(); return 0;}
  290.     I2C_SendByte(REG_Address );   //设置低起始地址      
  291.     I2C_WaitAck();       
  292.     I2C_SendByte(REG_data);
  293.     I2C_WaitAck();   
  294.     I2C_Stop();
  295.     delay5ms();
  296.     return 1;
  297. }

  298. //单字节读取*****************************************
  299. unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
  300. {   unsigned char REG_data;            
  301.         if(!I2C_Start())return 0;
  302.     I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址
  303.     if(!I2C_WaitAck()){I2C_Stop();test=1; return 0;}
  304.     I2C_SendByte((u8) REG_Address);   //设置低起始地址      
  305.     I2C_WaitAck();
  306.     I2C_Start();
  307.     I2C_SendByte(SlaveAddress+1);
  308.     I2C_WaitAck();

  309.         REG_data= I2C_RadeByte();
  310.     I2C_NoAck();
  311.     I2C_Stop();
  312.     //return TRUE;
  313.         return REG_data;

  314. }                                                     

  315. /*
  316. ********************************************************************************
  317. ** 函数名称 : RCC_Configuration(void)
  318. ** 函数功能 : 时钟初始化
  319. ** 输    入        : 无
  320. ** 输    出        : 无
  321. ** 返    回        : 无
  322. ********************************************************************************
  323. */
  324. void RCC_Configuration(void)
  325. {   
  326.   ErrorStatus HSEStartUpStatus;
  327.    
  328.   /* RCC system reset(for debug purpose) */
  329.   RCC_DeInit();

  330.   /* Enable HSE */
  331.   RCC_HSEConfig(RCC_HSE_ON);

  332.   /* Wait till HSE is ready */
  333.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  334.   if(HSEStartUpStatus == SUCCESS)
  335.   {
  336.     /* HCLK = SYSCLK */
  337.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  338.   
  339.     /* PCLK2 = HCLK */
  340.     RCC_PCLK2Config(RCC_HCLK_Div1);

  341.     /* PCLK1 = HCLK/2 */
  342.     RCC_PCLK1Config(RCC_HCLK_Div2);

  343.     /* Flash 2 wait state */
  344.     FLASH_SetLatency(FLASH_Latency_2);
  345.     /* Enable Prefetch Buffer */
  346.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  347.     /* PLLCLK = 8MHz * 9 = 72 MHz */
  348.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  349.     /* Enable PLL */
  350.     RCC_PLLCmd(ENABLE);

  351.     /* Wait till PLL is ready */
  352.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  353.     {
  354.     }

  355.     /* Select PLL as system clock source */
  356.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  357.     /* Wait till PLL is used as system clock source */
  358.     while(RCC_GetSYSCLKSource() != 0x08)
  359.     {
  360.     }
  361.   }
  362.    /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
  363.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
  364.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE);
  365.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF , ENABLE);
  366.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO  , ENABLE);  
  367. }

  368. /*
  369. ********************************************************************************
  370. ** 函数名称 : GPIO_Configuration(void)
  371. ** 函数功能 : 端口初始化
  372. ** 输    入        : 无
  373. ** 输    出        : 无
  374. ** 返    回        : 无
  375. ********************************************************************************
  376. */
  377. void GPIO_Configuration(void)
  378. {
  379.   GPIO_InitTypeDef GPIO_InitStructure;
  380.   RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE  );
  381.    /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  382.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                 //        选中管脚9
  383.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 // 复用推挽输出
  384.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 // 最高输出速率50MHz
  385.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                 // 选择A端口
  386.    
  387.   /* Configure USART1 Rx (PA.10) as input floating */
  388.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                          //选中管脚10
  389.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空输入
  390.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                  //选择A端口

  391.   /* Configure USART2 Tx (PA.02) as alternate function push-pull */
  392.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 //        选中管脚2
  393.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 // 复用推挽输出
  394.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 // 最高输出速率50MHz
  395.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                 // 选择A端口
  396.    
  397.   /* Configure USART2 Rx (PA.03) as input floating */
  398.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                          //选中管脚3
  399.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空输入
  400.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                  //选择A端口


  401.   /* Configure USART3 Tx (PB.10) as alternate function push-pull */
  402.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                 //        选中管脚10
  403.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 // 复用推挽输出
  404.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 // 最高输出速率50MHz
  405.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                 // 选择B端口
  406.    
  407.   /* Configure USART3 Rx (PB.11) as input floating */
  408.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                          //选中管脚11
  409.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空输入
  410.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                  //选择B端口

  411.    /* Configure USART4 Tx (PC.10) as alternate function push-pull */
  412.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                 //        选中管脚10
  413.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 // 复用推挽输出
  414.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 // 最高输出速率50MHz
  415.   GPIO_Init(GPIOC, &GPIO_InitStructure);                                 // 选择C端口
  416.    
  417.   /* Configure USART4 Rx (PC.11) as input floating */
  418.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                          //选中管脚11
  419.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空输入
  420.   GPIO_Init(GPIOC, &GPIO_InitStructure);                                  //选择C端口

  421.    /* Configure USART5 Tx (PC.12) as alternate function push-pull */
  422.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                 //        选中管脚12
  423.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 // 复用推挽输出
  424.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 // 最高输出速率50MHz
  425.   GPIO_Init(GPIOC, &GPIO_InitStructure);                                 // 选择C端口
  426.    
  427.   /* Configure USART5 Rx (PD.2) as input floating */
  428.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                          //选中管脚2
  429.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //浮空输入
  430.   GPIO_Init(GPIOD, &GPIO_InitStructure);                                  //选择D端口


  431. }

  432. /*
  433. ********************************************************************************
  434. ** 函数名称 : USART1_Configuration(void)
  435. ** 函数功能 : 串口1初始化
  436. ** 输    入        : 无
  437. ** 输    出        : 无
  438. ** 返    回        : 无
  439. ********************************************************************************
  440. */
  441. void USART1_Configuration(void)
  442. {

  443. USART_InitTypeDef USART_InitStructure;
  444. USART_ClockInitTypeDef  USART_ClockInitStructure;

  445. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 |RCC_APB2Periph_USART1, ENABLE  );

  446. USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;                        // 时钟低电平活动
  447. USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;                                // 时钟低电平
  448. USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;                                // 时钟第二个边沿进行数据捕获
  449. USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;                // 最后一位数据的时钟脉冲不从SCLK输出
  450. /* Configure the USART1 synchronous paramters */
  451. USART_ClockInit(USART1, &USART_ClockInitStructure);                                        // 时钟参数初始化设置
  452.                                                                                                                                          
  453. USART_InitStructure.USART_BaudRate = 115200;                                                  // 波特率为:115200
  454. USART_InitStructure.USART_WordLength = USART_WordLength_8b;                          // 8位数据
  455. USART_InitStructure.USART_StopBits = USART_StopBits_1;                                  // 在帧结尾传输1个停止位
  456. USART_InitStructure.USART_Parity = USART_Parity_No ;                                  // 奇偶失能
  457. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        // 硬件流控制失能

  458. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                  // 发送使能+接收使能
  459. /* Configure USART1 basic and asynchronous paramters */
  460. USART_Init(USART1, &USART_InitStructure);
  461.    
  462.   /* Enable USART1 */
  463. USART_ClearFlag(USART1, USART_IT_RXNE);                         //清中断,以免一启用中断后立即产生中断
  464. USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);                //使能USART1中断源
  465. USART_Cmd(USART1, ENABLE);                                                        //USART1总开关:开启
  466. }

  467. /*
  468. ********************************************************************************
  469. ** 函数名称 : Delay(vu32 nCount)
  470. ** 函数功能 : 延时函数
  471. ** 输    入        : 无
  472. ** 输    出        : 无
  473. ** 返    回        : 无
  474. ********************************************************************************
  475. */
  476. void Delay(vu32 nCount)
  477. {
  478.   for(; nCount != 0; nCount--);
  479. }

  480. /*
  481. ********************************************************************************
  482. ** 函数名称 : void Delayms(vu32 m)
  483. ** 函数功能 : 长延时函数         m=1,延时1ms
  484. ** 输    入        : 无
  485. ** 输    出        : 无
  486. ** 返    回        : 无
  487. ********************************************************************************
  488. */
  489. void Delayms(vu32 m)
  490. {
  491.   u32 i;
  492.   
  493.   for(; m != 0; m--)       
  494.        for (i=0; i<50000; i++);
  495. }

  496. //************************************************
  497. void  USART1_SendData(uchar SendData)
  498. {
  499. USART_SendData(USART1, SendData);
  500. Delayms(1);
  501. }
  502.        

  503. //********************************************************************
  504. long bmp085ReadTemp(void)
  505. {   short  temp_ut;
  506.         Single_Write(BMP085_Addr,0xF4,0x2E);
  507.         Delayms(5);        // max time is 4.5ms
  508.         temp_ut = Single_Read(BMP085_Addr,0xF6);
  509.         temp_ut = (temp_ut<<8)| Single_Read(BMP085_Addr,0xF7);               
  510.         return (long) temp_ut ;
  511. }
  512. //*************************************************************

  513. long bmp085ReadPressure(void)
  514. {
  515.         long pressure = 0;
  516.         Single_Write(BMP085_Addr,0xF4,0x34);
  517.         Delayms(5);        // max time is 4.5ms
  518.         pressure = Single_Read(BMP085_Addr,0xF6);
  519.         pressure = (pressure<<8)| Single_Read(BMP085_Addr,0xF7);               
  520.         pressure &= 0x0000FFFF;       
  521.         return pressure;       
  522. }

  523. //******************
  524. void Send_ADXL345_data(int dis_data)
  525.   { float temp ;
  526.         if(dis_data>0x7fff)dis_data-=0xffff;
  527.         if(dis_data<0){
  528.                dis_data=-dis_data;
  529.              USART_SendData(USART1,'-');
  530.                  Delayms(2);
  531.         }
  532.         else
  533.           {
  534.            USART_SendData(USART1,'+');
  535.            Delayms(2);
  536.            }
  537.         temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
  538.         conversion(temp);          //转换出显示需要的数据         
  539.             USART1_SendData(qian);
  540.                 USART1_SendData('.');
  541.             USART1_SendData(bai);
  542.             USART1_SendData(shi);
  543.             USART1_SendData(ge);
  544.                 USART1_SendData('g');
  545. }
  546. //***************************************
  547. //******************
  548. void Send_L3G420D_data(short dis_data)
  549.   { float temp ;
  550.         if(dis_data<0){
  551.                dis_data=-dis_data;
  552.              USART_SendData(USART1,'-');
  553.                  Delayms(2);
  554.         }
  555.         else
  556.           {
  557.            USART_SendData(USART1,'+');
  558.            Delayms(2);
  559.            }
  560.         temp=(float)dis_data*0.07;  //计算数据和显示,查考ADXL345快速入门第4页
  561.         conversion(temp);           //转换出显示需要的数据         
  562.             USART1_SendData(bai);
  563.             USART1_SendData(shi);
  564.             USART1_SendData(ge);

  565. }
  566. //***************************************


  567. void Send_HMC5883L()
  568. {
  569. USART1_SendData('H');
  570. USART1_SendData('M');
  571. USART1_SendData('C');
  572. USART1_SendData('5');
  573. USART1_SendData('8');
  574. USART1_SendData('8');
  575. USART1_SendData('3');
  576. USART1_SendData('L');
  577. USART1_SendData(':');
  578. conversion(angle);
  579. USART1_SendData(bai);
  580. USART1_SendData(shi);
  581. USART1_SendData(ge);
  582. USART1_SendData('`');  
  583. USART1_SendData(0x0d);
  584. USART1_SendData(0x0a);
  585. }
  586. //*************************************************
  587. void  Send_BMP085()
  588. {
  589. USART1_SendData('B');
  590. USART1_SendData('M');
  591. USART1_SendData('P');
  592. USART1_SendData('0');
  593. USART1_SendData('8');
  594. USART1_SendData('5');
  595. USART1_SendData(':');

  596. USART1_SendData('t');
  597. USART1_SendData('=');
  598. conversion(temperature);
  599. USART1_SendData(bai);
  600. USART1_SendData(shi);
  601. USART1_SendData('.');
  602. USART1_SendData(ge);
  603. USART1_SendData('`');
  604. USART1_SendData('C');

  605. USART1_SendData(' ');
  606. USART1_SendData('p');
  607. USART1_SendData('=');
  608. conversion(pressure);

  609. USART1_SendData(shiwan);
  610. USART1_SendData(wan);
  611. USART1_SendData(qian);
  612. USART1_SendData('.');
  613. USART1_SendData(bai);
  614. USART1_SendData(shi);
  615. USART1_SendData(ge);
  616. USART1_SendData('K');
  617. USART1_SendData('p');
  618. USART1_SendData('a');                                 
  619. USART1_SendData(0x0d);
  620. USART1_SendData(0x0a);

  621. }
  622. //*****************************************************

  623. void  Send_ADXL345()
  624. {
  625. USART1_SendData('A');
  626. USART1_SendData('D');
  627. USART1_SendData('X');
  628. USART1_SendData('L');
  629. USART1_SendData('3');
  630. USART1_SendData('4');
  631. USART1_SendData('5');
  632. USART1_SendData(':');
  633.            USART1_SendData('X');
  634.            USART1_SendData('=');
  635.            Send_ADXL345_data(A_X);

  636.            USART1_SendData('Y');
  637.            USART1_SendData('=');
  638.            Send_ADXL345_data(A_Y);

  639.            USART1_SendData('Z');
  640.            USART1_SendData('=');
  641.            Send_ADXL345_data(A_Z);

  642.            adxl345_angle();


  643. USART1_SendData(0x0d);
  644. USART1_SendData(0x0a);
  645. }
  646. //*****************************************************
  647. void Send_L3G4200D()
  648. {
  649.            USART1_SendData('L');
  650.         USART1_SendData('3');
  651.         USART1_SendData('G');
  652.         USART1_SendData('4');
  653.         USART1_SendData('2');
  654.         USART1_SendData('0');
  655.         USART1_SendData('0');
  656.         USART1_SendData('D');
  657.         USART1_SendData(':');

  658.            USART1_SendData('X');
  659.            USART1_SendData('=');
  660.            Send_L3G420D_data(T_X);

  661.            USART1_SendData('Y');
  662.            USART1_SendData('=');
  663.            Send_L3G420D_data(T_Y);

  664.            USART1_SendData('Z');
  665.            USART1_SendData('=');
  666.            Send_L3G420D_data(T_Z);

  667.           USART1_SendData(0x0d);
  668.      USART1_SendData(0x0a);
  669. }
  670. //******************************************************
  671. void read_hmc5883l(void)
  672. {
  673.        Single_Write(HMC5883L_Addr,0x00,0x14);   //
  674.        Single_Write(HMC5883L_Addr,0x02,0x00);   //
  675.              Delayms(10);

  676.        BUF[1]=Single_Read(HMC5883L_Addr,0x03);//OUT_X_L_A
  677.        BUF[2]=Single_Read(HMC5883L_Addr,0x04);//OUT_X_H_A

  678.            BUF[3]=Single_Read(HMC5883L_Addr,0x07);//OUT_Y_L_A
  679.        BUF[4]=Single_Read(HMC5883L_Addr,0x08);//OUT_Y_H_A

  680.        x=(BUF[1] << 8) | BUF[2]; //Combine MSB and LSB of X Data output register
  681.        y=(BUF[3] << 8) | BUF[4]; //Combine MSB and LSB of Z Data output register

  682.        if(x>0x7fff)x-=0xffff;          
  683.        if(y>0x7fff)y-=0xffff;          
  684.        angle= atan2(y,x) * (180 / 3.14159265) + 180; // angle in degrees
  685. }
  686. //****************************************
  687. void read_ADXL345(void)
  688. {
  689.        BUF[0]=Single_Read(ADXL345_Addr,0x32);//OUT_X_L_A
  690.        BUF[1]=Single_Read(ADXL345_Addr,0x33);//OUT_X_H_A

  691.            BUF[2]=Single_Read(ADXL345_Addr,0x34);//OUT_Y_L_A
  692.        BUF[3]=Single_Read(ADXL345_Addr,0x35);//OUT_Y_H_A

  693.            BUF[4]=Single_Read(ADXL345_Addr,0x36);//OUT_Z_L_A
  694.        BUF[5]=Single_Read(ADXL345_Addr,0x37);//OUT_Z_H_A

  695.            A_X=(BUF[1]<<8)+BUF[0];  //合成数据  
  696.            A_Y=(BUF[3]<<8)+BUF[2];  //合成数据
  697.            A_Z=(BUF[5]<<8)+BUF[4];  //合成数据
  698. }
  699. //*****************************************
  700. void read_BMP085(void)
  701. {

  702.            long ut;
  703.         long up;
  704.         long x1, x2, b5, b6, x3, b3, p;
  705.         unsigned long b4, b7;

  706.         ut = bmp085ReadTemp();           // 读取温度
  707. //        ut = bmp085ReadTemp();           // 读取温度
  708.         up = bmp085ReadPressure();  // 读取压强
  709. //        up = bmp085ReadPressure();  // 读取压强
  710.         x1 = ((long)ut - ac6) * ac5 >> 15;
  711.         x2 = ((long) mc << 11) / (x1 + md);
  712.         b5 = x1 + x2;
  713.         temperature = (b5 + 8) >> 4;
  714.        
  715.          //****************

  716.         b6 = b5 - 4000;
  717.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  718.         x2 = ac2 * b6 >> 11;
  719.         x3 = x1 + x2;
  720.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
  721.         x1 = ac3 * b6 >> 13;
  722.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  723.         x3 = ((x1 + x2) + 2) >> 2;
  724.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  725.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  726.         if( b7 < 0x80000000)
  727.              p = (b7 * 2) / b4 ;
  728.            else  
  729.                     p = (b7 / b4) * 2;
  730.         x1 = (p >> 8) * (p >> 8);
  731.         x1 = (x1 * 3038) >> 16;
  732.         x2 = (-7357 * p) >> 16;
  733.          pressure = p + ((x1 + x2 + 3791) >> 4);
  734. }
  735. //***************************
  736. void  Init_ADXL345(void)
  737. {
  738.    Single_Write(ADXL345_Addr,0x31,0x0B);   //测量范围,正负16g,13位模式
  739.   // Single_Write(ADXL345_Addr,0x2C,0x0e);   //速率设定为100hz 参考pdf13页
  740.    Single_Write(ADXL345_Addr,0x2D,0x08);   //选择电源模式   参考pdf24页
  741.    Single_Write(ADXL345_Addr,0x2E,0x80);   //使能 DATA_READY 中断
  742.   // Single_Write(ADXL345_Addr,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
  743.   // Single_Write(ADXL345_Addr,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
  744.   // Single_Write(ADXL345_Addr,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
  745. }
  746. //****************************
  747. void  Init_BMP085(void)
  748. {
  749.         ac1 = Single_Read(BMP085_Addr,0xAA);
  750.         ac1 = (ac1<<8)|Single_Read(BMP085_Addr,0xAB);

  751.     ac2 = Single_Read(BMP085_Addr,0xAC);
  752.         ac2 = (ac2<<8)| Single_Read(BMP085_Addr,0xAD);

  753.         ac3 = Single_Read(BMP085_Addr,0xAE);
  754.         ac3 = (ac3<<8)| Single_Read(BMP085_Addr,0xAF);

  755.         ac4 = Single_Read(BMP085_Addr,0xB0);
  756.         ac4 = (ac4<<8)| Single_Read(BMP085_Addr,0xB1);

  757.         ac5 = Single_Read(BMP085_Addr,0xB2);
  758.         ac5 = (ac5<<8)| Single_Read(BMP085_Addr,0xB3);

  759.         ac6 = Single_Read(BMP085_Addr,0xB4);
  760.         ac6 = (ac6<<8)| Single_Read(BMP085_Addr,0xB5);

  761.         b1 = Single_Read(BMP085_Addr,0xB6);
  762.         b1 = (b1<<8)| Single_Read(BMP085_Addr,0xB7);

  763.         b2 = Single_Read(BMP085_Addr,0xB8);
  764.         b2 = (b2<<8)| Single_Read(BMP085_Addr,0xB9);

  765.         mb = Single_Read(BMP085_Addr,0xBA);
  766.         mb = (mb<<8)| Single_Read(BMP085_Addr,0xBB);

  767.         mc = Single_Read(BMP085_Addr,0xBC);
  768.         mc = (mc<<8)| Single_Read(BMP085_Addr,0xBD);

  769.         md = Single_Read(BMP085_Addr,0xBE);
  770.         md = (md<<8)| Single_Read(BMP085_Addr,0xBF);

  771. }
  772. //****************************
  773. void  Init_HMC5883L()
  774. {
  775.    Single_Write(HMC5883L_Addr,0x00,0x14);   //
  776.    Single_Write(HMC5883L_Addr,0x02,0x00);   //
  777. }
  778. //*****************************************

  779. //************初始化L3G4200D*********************************
  780. void Init_L3G4200D(void)
  781. {
  782.         Single_Write(L3G4200_Addr,CTRL_REG1, 0x0f);
  783.         Single_Write(L3G4200_Addr,CTRL_REG2, 0x00);
  784.         Single_Write(L3G4200_Addr,CTRL_REG3, 0x08);
  785.         Single_Write(L3G4200_Addr,CTRL_REG4, 0x30);        //+-2000dps
  786.         Single_Write(L3G4200_Addr,CTRL_REG5, 0x00);
  787. }       
  788. //******读取L3G4200D数据****************************************
  789. void read_L3G4200D(void)
  790. {
  791.    BUF[0]=Single_Read(L3G4200_Addr,OUT_X_L);
  792.    BUF[1]=Single_Read(L3G4200_Addr,OUT_X_H);
  793.    T_X=        (BUF[1]<<8)|BUF[0];



  794.    BUF[2]=Single_Read(L3G4200_Addr,OUT_Y_L);
  795.    BUF[3]=Single_Read(L3G4200_Addr,OUT_Y_H);
  796.    T_Y=        (BUF[3]<<8)|BUF[2];
  797.   

  798.    BUF[4]=Single_Read(L3G4200_Addr,OUT_Z_L);
  799.    BUF[5]=Single_Read(L3G4200_Addr,OUT_Z_H);
  800.    T_Z=        (BUF[5]<<8)|BUF[4];

  801. }

  802. //******************ADXL345计算倾斜角度************
  803. void adxl345_angle(void)
  804. {

  805. data_xyz[0]=A_X;  //合成数据   
  806. data_xyz[1]=A_Y;  //合成数据   
  807. data_xyz[2]=A_Z;  //合成数据   

  808. //分别是加速度X,Y,Z的原始数据,10位的
  809. Q=(float)data_xyz[0]*3.9;
  810. T=(float)data_xyz[1]*3.9;
  811. K=(float)data_xyz[2]*3.9;
  812. Q=-Q;

  813.   Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180);    //X轴角度值
  814.   Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180);  //Y轴角度值
  815.   //conversion(Pitch);                                                                   //需要显示时候请更换
  816.   conversion(Roll);
  817.         USART1_SendData(' ');
  818.                 USART1_SendData(' ');
  819.               USART1_SendData(bai);
  820.             USART1_SendData(shi);
  821.             USART1_SendData(ge);
  822. }

  823.   /*
  824. ********************************************************************************
  825. ** 函数名称 : main(void)
  826. ** 函数功能 : 主函数
  827. ** 输    入        : 无
  828. ** 输    出        : 无
  829. ** 返    回        : 无
  830. ********************************************************************************
  831. */
  832. int main(void)
  833. {
  834.   RCC_Configuration();
  835.   GPIO_Configuration();
  836.   USART1_Configuration();
  837.   I2C_GPIO_Config();

  838.   Init_HMC5883L();
  839.   Init_ADXL345();
  840.   Init_BMP085();
  841.   Init_L3G4200D();                     //初始化L3G4200D

  842.   while(1)
  843. {
  844.         read_hmc5883l();
  845.        Send_HMC5883L();
  846.         read_ADXL345();
  847.            Send_ADXL345();
  848.         read_L3G4200D();
  849.             Send_L3G4200D();
  850.         read_BMP085();                  
  851.            Send_BMP085();
  852.                           
  853.         Delayms(20);       
  854.   }
  855. }

  856. /*************结束***************/

复制代码

所有资料51hei提供下载:
GY-85-C8T6.rar (293.39 KB, 下载次数: 34)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表