找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2974|回复: 2
收起左侧

九轴飞行器STM32源码资料 串口输出HMC5883L+ADXL345+BMP085+L3G4200D

[复制链接]
ID:318349 发表于 2018-5-16 13:54 | 显示全部楼层 |阅读模式
电路原理图如下:
0.png

串口输出HMC5883L+ADXL345+BMP085+L3G4200D单片机源程序如下:

  1. /*******************************************************************************
  2. *  函数功能:串口发送数据  HMC5883L        + ADXL345 + BMP085+L3G4200D
  3. *  芯片:STM32F103XXXX
  4. *  波特率:115200
  5. *  编译环境:Keil uVision4
  6. *  编写时间:
  7. *  作    者:
  8. *******************************************************************************/

  9. #include "stm32f10x_lib.h"
  10. #include  <math.h>    //Keil library  

  11. GPIO_InitTypeDef GPIO_InitStructure;
  12. ErrorStatus HSEStartUpStatus;


  13. #define   uchar unsigned char
  14. #define   uint unsigned int        
  15. #define   OSS 0         //        BMP085使用

  16. //L3G4200D内部寄存器
  17. #define CTRL_REG1 0x20
  18. #define CTRL_REG2 0x21
  19. #define CTRL_REG3 0x22
  20. #define CTRL_REG4 0x23
  21. #define CTRL_REG5 0x24
  22. #define OUT_X_L 0x28
  23. #define OUT_X_H 0x29
  24. #define OUT_Y_L 0x2A
  25. #define OUT_Y_H 0x2B
  26. #define OUT_Z_L 0x2C
  27. #define OUT_Z_H 0x2D

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

  33. unsigned char BUF[8];                         //接收数据缓存区
  34. char  test=0;
  35. int   x,y;
  36. float angle;
  37. uchar ge,shi,bai,qian,wan,shiwan;           //显示变量
  38. int A_X,A_Y,A_Z;
  39. short T_X,T_Y,T_Z;

  40. short data_xyz[3];
  41. float Roll,Pitch,Q,T,K;


  42. //***BMP085使用
  43. short ac1;
  44. short ac2;
  45. short ac3;
  46. unsigned short ac4;
  47. unsigned short ac5;
  48. unsigned short ac6;
  49. short b1;
  50. short b2;
  51. short mb;
  52. short mc;
  53. short md;

  54. long  temperature;
  55. long  pressure;
  56. //********
  57. //************************************++++++++++++++++++++++++++++++++
  58. /*模拟IIC端口输出输入定义*/
  59. #define SCL_H         GPIOB->BSRR = GPIO_Pin_6
  60. #define SCL_L         GPIOB->BRR  = GPIO_Pin_6
  61.    
  62. #define SDA_H         GPIOB->BSRR = GPIO_Pin_7
  63. #define SDA_L         GPIOB->BRR  = GPIO_Pin_7

  64. #define SCL_read      GPIOB->IDR  & GPIO_Pin_6
  65. #define SDA_read      GPIOB->IDR  & GPIO_Pin_7

  66. /* 函数申明 -----------------------------------------------*/
  67. void RCC_Configuration(void);
  68. void GPIO_Configuration(void);
  69. void NVIC_Configuration(void);
  70. void USART1_Configuration(void);
  71. void USART2_Configuration(void);
  72. void USART3_Configuration(void);
  73. void USART4_Configuration(void);
  74. void USART5_Configuration(void);
  75. void WWDG_Configuration(void);
  76. void Delay(u32 nTime);
  77. void Delayms(vu32 m);  
  78. void conversion(long temp_data);
  79. void adxl345_angle(void);
  80. /* 变量定义 ----------------------------------------------*/

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

  106.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  107.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  108.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  109.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  110.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  111.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  112.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  113.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  114. }

  115. /*******************************************************************************
  116. * Function Name  : I2C_delay
  117. * Description    : Simulation IIC Timing series delay
  118. * Input          : None
  119. * Output         : None
  120. * Return         : None
  121. ****************************************************************************** */
  122. void I2C_delay(void)
  123. {
  124.                
  125.    u8 i=30; //这里可以优化速度        ,经测试最低到5还能写入
  126.    while(i)
  127.    {
  128.      i--;
  129.    }  
  130. }

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

  275.     SDA_H;                                
  276.     while(i--)
  277.     {
  278.       ReceiveByte<<=1;      
  279.       SCL_L;
  280.       I2C_delay();
  281.           SCL_H;
  282.       I2C_delay();        
  283.       if(SDA_read)
  284.       {
  285.         ReceiveByte|=0x01;
  286.       }
  287.     }
  288.     SCL_L;
  289.     return ReceiveByte;
  290. }
  291. //ZRX         
  292. //单字节写入*******************************************

  293. bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)                     //void
  294. {
  295.           if(!I2C_Start())return FALSE;
  296.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址
  297.     if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  298.     I2C_SendByte(REG_Address );   //设置低起始地址      
  299.     I2C_WaitAck();        
  300.     I2C_SendByte(REG_data);
  301.     I2C_WaitAck();   
  302.     I2C_Stop();
  303.     delay5ms();
  304.     return TRUE;
  305. }

  306. //单字节读取*****************************************
  307. unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
  308. {   unsigned char REG_data;            
  309.         if(!I2C_Start())return FALSE;
  310.     I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址
  311.     if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}
  312.     I2C_SendByte((u8) REG_Address);   //设置低起始地址      
  313.     I2C_WaitAck();
  314.     I2C_Start();
  315.     I2C_SendByte(SlaveAddress+1);
  316.     I2C_WaitAck();

  317.         REG_data= I2C_RadeByte();
  318.     I2C_NoAck();
  319.     I2C_Stop();
  320.     //return TRUE;
  321.         return REG_data;

  322. }                                                      

  323. /*
  324. ********************************************************************************
  325. ** 函数名称 : RCC_Configuration(void)
  326. ** 函数功能 : 时钟初始化
  327. ** 输    入        : 无
  328. ** 输    出        : 无
  329. ** 返    回        : 无
  330. ********************************************************************************
  331. */
  332. void RCC_Configuration(void)
  333. {   
  334.   /* RCC system reset(for debug purpose) */
  335.   RCC_DeInit();

  336.   /* Enable HSE */
  337.   RCC_HSEConfig(RCC_HSE_ON);

  338.   /* Wait till HSE is ready */
  339.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  340.   if(HSEStartUpStatus == SUCCESS)
  341.   {
  342.     /* HCLK = SYSCLK */
  343.     RCC_HCLKConfig(RCC_SYSCLK_Div1);
  344.   
  345.     /* PCLK2 = HCLK */
  346.     RCC_PCLK2Config(RCC_HCLK_Div1);

  347.     /* PCLK1 = HCLK/2 */
  348.     RCC_PCLK1Config(RCC_HCLK_Div2);

  349.     /* Flash 2 wait state */
  350.     FLASH_SetLatency(FLASH_Latency_2);
  351.     /* Enable Prefetch Buffer */
  352.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

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

  355.     /* Enable PLL */
  356.     RCC_PLLCmd(ENABLE);

  357.     /* Wait till PLL is ready */
  358.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  359.     {
  360.     }

  361.     /* Select PLL as system clock source */
  362.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

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

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

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


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

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

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


  437. }

  438. /*
  439. ********************************************************************************
  440. ** 函数名称 : USART1_Configuration(void)
  441. ** 函数功能 : 串口1初始化
  442. ** 输    入        : 无
  443. ** 输    出        : 无
  444. ** 返    回        : 无
  445. ********************************************************************************
  446. */
  447. void USART1_Configuration(void)
  448. {

  449. USART_InitTypeDef USART_InitStructure;
  450. USART_ClockInitTypeDef  USART_ClockInitStructure;

  451. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 |RCC_APB2Periph_USART1, ENABLE  );

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

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


  473. /*
  474. ********************************************************************************
  475. ** 函数名称 : NVIC_Configuration(void)
  476. ** 函数功能 : 中断初始化
  477. ** 输    入        : 无
  478. ** 输    出        : 无
  479. ** 返    回        : 无
  480. ********************************************************************************
  481. */
  482. void NVIC_Configuration(void)
  483. {
  484.   NVIC_InitTypeDef NVIC_InitStructure;  
  485.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  486.   NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel;
  487.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  488.   NVIC_Init(&NVIC_InitStructure);

  489. }

  490. /*
  491. ********************************************************************************
  492. ** 函数名称 : WWDG_Configuration(void)
  493. ** 函数功能 : 看门狗初始化
  494. ** 输    入        : 无
  495. ** 输    出        : 无
  496. ** 返    回        : 无
  497. ********************************************************************************
  498. */
  499. void WWDG_Configuration(void)
  500. {
  501.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);        
  502.   WWDG_SetPrescaler(WWDG_Prescaler_8);                      //  WWDG clock counter = (PCLK1/4096)/8 = 244 Hz (~4 ms)  
  503.   WWDG_SetWindowValue(0x41);                                 // Set Window value to 0x41
  504.   WWDG_Enable(0x50);                       // Enable WWDG and set counter value to 0x7F, WWDG timeout = ~4 ms * 64 = 262 ms
  505.   WWDG_ClearFlag();                               // Clear EWI flag
  506.   WWDG_EnableIT();                               // Enable EW interrupt
  507. }

  508. /*
  509. ********************************************************************************
  510. ** 函数名称 : Delay(vu32 nCount)
  511. ** 函数功能 : 延时函数
  512. ** 输    入        : 无
  513. ** 输    出        : 无
  514. ** 返    回        : 无
  515. ********************************************************************************
  516. */
  517. void Delay(vu32 nCount)
  518. {
  519.   for(; nCount != 0; nCount--);
  520. }

  521. /*
  522. ********************************************************************************
  523. ** 函数名称 : void Delayms(vu32 m)
  524. ** 函数功能 : 长延时函数         m=1,延时1ms
  525. ** 输    入        : 无
  526. ** 输    出        : 无
  527. ** 返    回        : 无
  528. ********************************************************************************
  529. */
  530. void Delayms(vu32 m)
  531. {
  532.   u32 i;
  533.   
  534.   for(; m != 0; m--)        
  535.        for (i=0; i<50000; i++);
  536. }



  537. /*
  538. ********************************************************************************
  539. ** 函数名称 : WWDG_IRQHandler(void)
  540. ** 函数功能 : 窗口提前唤醒中断
  541. ** 输    入        : 无
  542. ** 输    出        : 无
  543. ** 返    回        : 无
  544. ********************************************************************************
  545. */

  546. void WWDG_IRQHandler(void)
  547. {
  548.   /* Update WWDG counter */
  549.   WWDG_SetCounter(0x50);
  550.         
  551.   /* Clear EWI flag */
  552.   WWDG_ClearFlag();
  553.   
  554. }
  555. //************************************************
  556. void  USART1_SendData(uchar SendData)
  557. {
  558. USART_SendData(USART1, SendData);
  559. Delayms(1);
  560. }
  561.         

  562. //********************************************************************
  563. long bmp085ReadTemp(void)
  564. {   short  temp_ut;
  565.         Single_Write(BMP085_Addr,0xF4,0x2E);
  566.         Delayms(5);        // max time is 4.5ms
  567.         temp_ut = Single_Read(BMP085_Addr,0xF6);
  568.         temp_ut = (temp_ut<<8)| Single_Read(BMP085_Addr,0xF7);               
  569.         return (long) temp_ut ;
  570. }
  571. //*************************************************************

  572. long bmp085ReadPressure(void)
  573. {
  574.         long pressure = 0;
  575.         Single_Write(BMP085_Addr,0xF4,0x34);
  576.         Delayms(5);        // max time is 4.5ms
  577.         pressure = Single_Read(BMP085_Addr,0xF6);
  578.         pressure = (pressure<<8)| Single_Read(BMP085_Addr,0xF7);               
  579.         pressure &= 0x0000FFFF;        
  580.         return pressure;        
  581. }

  582. //******************
  583. Send_ADXL345_data(int dis_data)
  584.   { float temp ;
  585.         if(dis_data>0x7fff)dis_data-=0xffff;
  586.          if(dis_data<0){
  587.                dis_data=-dis_data;
  588.              USART_SendData(USART1,'-');
  589.                  Delayms(2);
  590.         }
  591.         else
  592.           {
  593.            USART_SendData(USART1,'+');
  594.            Delayms(2);
  595.            }
  596.         temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
  597.         conversion(temp);          //转换出显示需要的数据         
  598.             USART1_SendData(qian);
  599.                 USART1_SendData('.');
  600.             USART1_SendData(bai);
  601.             USART1_SendData(shi);
  602.             USART1_SendData(ge);
  603.                 USART1_SendData('g');
  604. }
  605. //***************************************
  606. //******************
  607. Send_L3G420D_data(short dis_data)
  608.   { float temp ;
  609.          if(dis_data<0){
  610.                dis_data=-dis_data;
  611.              USART_SendData(USART1,'-');
  612.                  Delayms(2);
  613.         }
  614.         else
  615.           {
  616.            USART_SendData(USART1,'+');
  617.            Delayms(2);
  618.            }
  619.         temp=(float)dis_data*0.07;  //计算数据和显示,查考ADXL345快速入门第4页
  620.         conversion(temp);           //转换出显示需要的数据         
  621.             USART1_SendData(bai);
  622.             USART1_SendData(shi);
  623.             USART1_SendData(ge);

  624. }
  625. //***************************************


  626. void Send_HMC5883L()
  627. {
  628. USART1_SendData('H');
  629. USART1_SendData('M');
  630. USART1_SendData('C');
  631. USART1_SendData('5');
  632. USART1_SendData('8');
  633. USART1_SendData('8');
  634. USART1_SendData('3');
  635. USART1_SendData('L');
  636. USART1_SendData(':');
  637. conversion(angle);
  638. USART1_SendData(bai);
  639. USART1_SendData(shi);
  640. USART1_SendData(ge);
  641. USART1_SendData('`');  
  642. USART1_SendData(0x0d);
  643. USART1_SendData(0x0a);
  644. }
  645. //*************************************************
  646. void  Send_BMP085()
  647. {
  648. USART1_SendData('B');
  649. USART1_SendData('M');
  650. USART1_SendData('P');
  651. USART1_SendData('0');
  652. USART1_SendData('8');
  653. USART1_SendData('5');
  654. USART1_SendData(':');

  655. USART1_SendData('t');
  656. USART1_SendData('=');
  657. conversion(temperature);
  658. USART1_SendData(bai);
  659. USART1_SendData(shi);
  660. USART1_SendData('.');
  661. USART1_SendData(ge);
  662. USART1_SendData('`');
  663. USART1_SendData('C');

  664. USART1_SendData(' ');
  665. USART1_SendData('p');
  666. USART1_SendData('=');
  667. conversion(pressure);

  668. USART1_SendData(shiwan);
  669. USART1_SendData(wan);
  670. USART1_SendData(qian);
  671. USART1_SendData('.');
  672. USART1_SendData(bai);
  673. USART1_SendData(shi);
  674. USART1_SendData(ge);
  675. USART1_SendData('K');
  676. USART1_SendData('p');
  677. USART1_SendData('a');                                 
  678. USART1_SendData(0x0d);
  679. USART1_SendData(0x0a);

  680. }
  681. //*****************************************************

  682. void  Send_ADXL345()
  683. {
  684. USART1_SendData('A');
  685. USART1_SendData('D');
  686. USART1_SendData('X');
  687. USART1_SendData('L');
  688. USART1_SendData('3');
  689. USART1_SendData('4');
  690. USART1_SendData('5');
  691. USART1_SendData(':');
  692.            USART1_SendData('X');
  693.            USART1_SendData('=');
  694.            Send_ADXL345_data(A_X);

  695.            USART1_SendData('Y');
  696.            USART1_SendData('=');
  697.            Send_ADXL345_data(A_Y);

  698.            USART1_SendData('Z');
  699.            USART1_SendData('=');
  700.            Send_ADXL345_data(A_Z);

  701.            adxl345_angle();


  702. USART1_SendData(0x0d);
  703. USART1_SendData(0x0a);
  704. }
  705. //*****************************************************
  706. void Send_L3G4200D()
  707. {
  708.            USART1_SendData('L');
  709.         USART1_SendData('3');
  710.         USART1_SendData('G');
  711.         USART1_SendData('4');
  712.         USART1_SendData('2');
  713.         USART1_SendData('0');
  714.         USART1_SendData('0');
  715.         USART1_SendData('D');
  716.         USART1_SendData(':');

  717.            USART1_SendData('X');
  718.            USART1_SendData('=');
  719.            Send_L3G420D_data(T_X);

  720.            USART1_SendData('Y');
  721.            USART1_SendData('=');
  722.            Send_L3G420D_data(T_Y);

  723.            USART1_SendData('Z');
  724.            USART1_SendData('=');
  725.            Send_L3G420D_data(T_Z);

  726.           USART1_SendData(0x0d);
  727.      USART1_SendData(0x0a);
  728. }
  729. //******************************************************
  730. void read_hmc5883l(void)
  731. {
  732.        Single_Write(HMC5883L_Addr,0x00,0x14);   //
  733.        Single_Write(HMC5883L_Addr,0x02,0x00);   //
  734.              Delayms(10);

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

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

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

  741.        if(x>0x7fff)x-=0xffff;         
  742.        if(y>0x7fff)y-=0xffff;         
  743.        angle= atan2(y,x) * (180 / 3.14159265) + 180; // angle in degrees
  744. }
  745. //****************************************
  746. void read_ADXL345(void)
  747. {
  748.        BUF[0]=Single_Read(ADXL345_Addr,0x32);//OUT_X_L_A
  749.        BUF[1]=Single_Read(ADXL345_Addr,0x33);//OUT_X_H_A

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

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

  754.            A_X=(BUF[1]<<8)+BUF[0];  //合成数据  
  755.            A_Y=(BUF[3]<<8)+BUF[2];  //合成数据
  756.            A_Z=(BUF[5]<<8)+BUF[4];  //合成数据
  757. }
  758. //*****************************************
  759. void read_BMP085(void)
  760. {

  761.            long ut;
  762.         long up;
  763.         long x1, x2, b5, b6, x3, b3, p;
  764.         unsigned long b4, b7;

  765.         ut = bmp085ReadTemp();           // 读取温度
  766. //        ut = bmp085ReadTemp();           // 读取温度
  767.         up = bmp085ReadPressure();  // 读取压强
  768. //        up = bmp085ReadPressure();  // 读取压强
  769.         x1 = ((long)ut - ac6) * ac5 >> 15;
  770.         x2 = ((long) mc << 11) / (x1 + md);
  771.         b5 = x1 + x2;
  772.         temperature = (b5 + 8) >> 4;
  773.         
  774.          //****************

  775.         b6 = b5 - 4000;
  776.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  777.         x2 = ac2 * b6 >> 11;
  778.         x3 = x1 + x2;
  779.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
  780.         x1 = ac3 * b6 >> 13;
  781.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  782.         x3 = ((x1 + x2) + 2) >> 2;
  783.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  784.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  785.         if( b7 < 0x80000000)
  786.              p = (b7 * 2) / b4 ;
  787.            else  
  788.                     p = (b7 / b4) * 2;
  789.         x1 = (p >> 8) * (p >> 8);
  790.         x1 = (x1 * 3038) >> 16;
  791.         x2 = (-7357 * p) >> 16;
  792.          pressure = p + ((x1 + x2 + 3791) >> 4);
  793. }
  794. //***************************
  795. void  Init_ADXL345(void)
  796. {
  797.    Single_Write(ADXL345_Addr,0x31,0x0B);   //测量范围,正负16g,13位模式
  798.   // Single_Write(ADXL345_Addr,0x2C,0x0e);   //速率设定为100hz 参考pdf13页
  799.    Single_Write(ADXL345_Addr,0x2D,0x08);   //选择电源模式   参考pdf24页
  800.    Single_Write(ADXL345_Addr,0x2E,0x80);   //使能 DATA_READY 中断
  801.   // Single_Write(ADXL345_Addr,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
  802.   // Single_Write(ADXL345_Addr,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
  803.   // Single_Write(ADXL345_Addr,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
  804. }
  805. //****************************
  806. void  Init_BMP085(void)
  807. {
  808.         ac1 = Single_Read(BMP085_Addr,0xAA);
  809.         ac1 = (ac1<<8)|Single_Read(BMP085_Addr,0xAB);

  810.     ac2 = Single_Read(BMP085_Addr,0xAC);
  811.         ac2 = (ac2<<8)| Single_Read(BMP085_Addr,0xAD);

  812.         ac3 = Single_Read(BMP085_Addr,0xAE);
  813.         ac3 = (ac3<<8)| Single_Read(BMP085_Addr,0xAF);

  814.         ac4 = Single_Read(BMP085_Addr,0xB0);
  815.         ac4 = (ac4<<8)| Single_Read(BMP085_Addr,0xB1);

  816.         ac5 = Single_Read(BMP085_Addr,0xB2);
  817.         ac5 = (ac5<<8)| Single_Read(BMP085_Addr,0xB3);

  818.         ac6 = Single_Read(BMP085_Addr,0xB4);
  819.         ac6 = (ac6<<8)| Single_Read(BMP085_Addr,0xB5);

  820.         b1 = Single_Read(BMP085_Addr,0xB6);
  821.         b1 = (b1<<8)| Single_Read(BMP085_Addr,0xB7);

  822.         b2 = Single_Read(BMP085_Addr,0xB8);
  823.         b2 = (b2<<8)| Single_Read(BMP085_Addr,0xB9);

  824.         mb = Single_Read(BMP085_Addr,0xBA);
  825.         mb = (mb<<8)| Single_Read(BMP085_Addr,0xBB);

  826.         mc = Single_Read(BMP085_Addr,0xBC);
  827. ……………………

  828. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.jpg

所有资料51hei提供下载:
九轴气压模块资料.rar (15.33 MB, 下载次数: 71)
回复

使用道具 举报

ID:316613 发表于 2020-4-3 16:29 | 显示全部楼层
缺少 stm32f10x_lib.h" 头文件啊,,
回复

使用道具 举报

ID:102688 发表于 2020-4-9 21:08 | 显示全部楼层
感谢分享,学习学习,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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