找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5471|回复: 6
收起左侧

ms5611大气压强传感器的IIC驱动源码

  [复制链接]
ID:312140 发表于 2018-4-20 02:08 | 显示全部楼层 |阅读模式
分享ms5611的IIC驱动源程序资料:

单片机源程序如下:
  1. #include "main.h"


  2. /*变量声明----------------------------------------------------------------*/  
  3. uint16_t Cal_C[7];  //用于存放PROM中的6组数据      
  4. uint32_t D1_Pres,D2_Temp; // 存放数字压力和温度  
  5. float Pressure;             //温度补偿大气压  
  6. double dT;
  7. float Temperature,Temperature2;//实际和参考温度之间的差异,实际温度,中间值  
  8. double OFF,SENS;  //实际温度抵消,实际温度灵敏度  
  9. float Aux,OFF2,SENS2;  //温度校验值  
  10.   
  11. uint32_t ex_Pressure;           //串口读数转换值  
  12. uint8_t  exchange_num[8];

  13. /***初始化函数**/
  14. void MS561101BA_Init(void)
  15. {
  16.         my_IIC_Init();
  17.         MS561101BA_Reset();
  18.         delay_ms(100);
  19.         MS561101BA_readPROM();
  20.         delay_ms(100);
  21. }

  22. /***软复位函数****/
  23. void MS561101BA_Reset(void)  
  24. {  
  25.     IIC_Start();
  26.     IIC_Send_Byte(MS561101BA_Device_Address);
  27.     while(IIC_Wait_Ack());
  28.     delay_us(100);
  29.     IIC_Send_Byte(MS561101BA_RESET);
  30.     while(IIC_Wait_Ack());
  31.     delay_us(100);
  32.     IIC_Stop();
  33. }


  34. //从PROM读取出厂校准数据
  35. void MS561101BA_readPROM(void)
  36. {
  37.    u16 data1,data2;
  38.    u8  i=0;
  39.    for(i=0;i<=6;i++)
  40.    {
  41.      /***********************************/
  42.       IIC_Start();
  43.       IIC_Send_Byte(MS561101BA_Device_Address);//写入从设备地址,并设定为写入模式
  44.       while(IIC_Wait_Ack());
  45.       delay_us(100);
  46.       IIC_Send_Byte(MS561101BA_PROM_BASE_ADDR+i*2);//写入寄存器地址,准备读取数据
  47.       while(IIC_Wait_Ack());
  48.       delay_us(100);
  49.       IIC_Stop();
  50.       
  51.       delay_us(100);
  52.       IIC_Start();
  53.       IIC_Send_Byte(MS561101BA_Device_Address+0x01);//写入从设备地址,并设定为读取模式
  54.       while(IIC_Wait_Ack());
  55.       delay_us(100);
  56.       data1=IIC_Read_Byte(1);
  57.       data2=IIC_Read_Byte(0);
  58.       IIC_Stop();
  59.       delay_ms(10);
  60.       Cal_C[i]=(data1<<8)|data2;
  61.    }
  62. }


  63. /******读取信息函数******/
  64. uint32_t MS561101BA_DO_CONVERSION(u8 command)
  65. {
  66.             u32 conversion=0;
  67.         u16 conv1,conv2,conv3;
  68.         
  69.         IIC_Start();
  70.         IIC_Send_Byte(MS561101BA_Device_Address);//写入从设备地址,并设定为写入模式
  71.         while(IIC_Wait_Ack());
  72.         IIC_Send_Byte(command);        //写入寄存器地址(指令),准备读取数据
  73.         while(IIC_Wait_Ack());
  74.         IIC_Stop();
  75.         
  76.         delay_ms(20);
  77.         
  78.         IIC_Start();   
  79.         IIC_Send_Byte(MS561101BA_Device_Address);
  80.         while(IIC_Wait_Ack());
  81.         IIC_Send_Byte(0x00);
  82.         while(IIC_Wait_Ack());
  83.         IIC_Stop();//I2C ADC read sequence
  84.         
  85.         delay_ms(10);
  86.         IIC_Start();
  87.         IIC_Send_Byte(MS561101BA_Device_Address+1);
  88.         while(IIC_Wait_Ack());
  89.         conv1=IIC_Read_Byte(1);
  90.         conv2=IIC_Read_Byte(1);
  91.         conv3=IIC_Read_Byte(0);
  92.         IIC_Stop();
  93.         
  94.         delay_ms(10);
  95.         conversion= (conv1<<16) + (conv2<<8) + conv3;
  96.         
  97.         return conversion;
  98.         
  99. }

  100. //读取数字温度
  101. void MS561101BA_GetTemperature(u8 OSR_Temp)
  102. {
  103.    
  104.         D2_Temp= MS561101BA_DO_CONVERSION(OSR_Temp);        
  105.         delay_ms(10);
  106.         
  107.         dT=D2_Temp - ((((unsigned long)Cal_C[5])<<8)*1.0);
  108.         Temperature=2000+dT*((u32)Cal_C[6])/8388608.0;//2007等于20.07摄氏度

  109. }

  110. //读取大气压强
  111. void MS561101BA_GetPressure(u8 OSR_Pres)
  112. {
  113.       float Aux,OFF2,SENS2;  //温度校验值
  114.       D1_Pres=MS561101BA_DO_CONVERSION(OSR_Pres);
  115.       delay_ms(10);
  116.       OFF=(u32)(Cal_C[2]<<16)+((u32)Cal_C[4]*dT)/128.0;
  117.       SENS=(u32)(Cal_C[1]<<15)+((u32)Cal_C[3]*dT)/256.0;
  118.       //温度补偿
  119.               if(Temperature < 2000)// second order temperature compensation when under 20 degrees C
  120.         {
  121.                 Temperature2 = (dT*dT) / 0x80000000;//(0x80000000是2的31次方)
  122.                 Aux = (Temperature-2000)*(Temperature-2000);
  123.                 OFF2 = 2.5*Aux;
  124.                 SENS2 = 1.25*Aux;
  125.                 if(Temperature < -1500)
  126.                 {
  127.                         Aux = (Temperature+1500)*(Temperature+1500);
  128.                         OFF2 = OFF2 + 7*Aux;
  129.                         SENS2 = SENS + 5.5*Aux;
  130.                 }
  131.         }else  //(Temperature > 2000)
  132.         {
  133.                 Temperature2 = 0;
  134.                 OFF2 = 0;
  135.                 SENS2 = 0;
  136.         }
  137.         
  138.         Temperature = Temperature - Temperature2;
  139.         OFF = OFF - OFF2;
  140.         SENS = SENS - SENS2;        

  141.         Pressure=(D1_Pres*SENS/2097152.0-OFF)/32768.0;//100009= 1000.09 mbar  
  142.         //一个标准大气压的压强是1.013x10^3mbar
  143. }


  144. void MS561101BA_data_transfer(void)
  145. {
  146.   long temp_transfer=0;
  147.   long press_transfer=0;
  148.   unsigned char temp_exchange_number[]={'0'};
  149.   unsigned char press_exchange_number[]={'0'};
  150.   u8 temp_datalen=0,press_datalen=0,i=0;
  151.   
  152.   
  153.   
  154.   if(Temperature<0)
  155.   {
  156.     temp_transfer=(long)(-Temperature);//(注意此单位是100*摄氏度,需将温度转换成摄氏度为单位)
  157.     temp_exchange_number[0]='-';
  158.   }
  159.   else
  160.   {
  161.     temp_transfer=(long)Temperature;//(注意此单位是100*摄氏度,需将温度转换成摄氏度为单位)
  162.     temp_exchange_number[0]='\0';
  163.   }
  164.   
  165.   if(temp_transfer>=0&&temp_transfer<=9999)
  166.   {
  167.     temp_datalen=6;
  168.     temp_exchange_number[1]=((u16)(temp_transfer/1000.0f)+0x30);//十位
  169.     temp_transfer=temp_transfer%1000;
  170.    
  171.     temp_exchange_number[2]=((u16)(temp_transfer/100.0f)+0x30);//个位
  172.     temp_transfer=temp_transfer%100;
  173.    
  174.     temp_exchange_number[3]='.';
  175.    
  176.     temp_exchange_number[4]=((u16)(temp_transfer/10.0f)+0x30);
  177.     temp_transfer=temp_transfer%10;
  178.    
  179.     temp_exchange_number[5]=((u16)(temp_transfer)+0x30);
  180.    
  181.     printf("当前温度是:");
  182.     for(i=0;i<6;i++)
  183.     {
  184.       printf("%c",temp_exchange_number[i]);
  185.     }
  186.     printf("°C   \r \n");
  187.   }
  188.   if(temp_transfer>=10000)
  189.   {//温度大于100度
  190.     temp_datalen=7;
  191.     temp_exchange_number[1]=((u16)(temp_transfer/10000.0f)+0x30);//百位
  192.     temp_transfer=temp_transfer%10000;
  193.    
  194.     temp_exchange_number[2]=((u16)(temp_transfer/1000.0f)+0x30);//十位
  195.     temp_transfer=temp_transfer%1000;
  196.    
  197.     temp_exchange_number[3]=((u16)(temp_transfer/100.0f)+0x30);//个位
  198.     temp_transfer=temp_transfer%100;
  199.    
  200.     temp_exchange_number[4]='.';
  201.    
  202.     temp_exchange_number[5]=((u16)(temp_transfer/10.0f)+0x30);
  203.     temp_transfer=temp_transfer%10;
  204.    
  205.     temp_exchange_number[6]=((u16)(temp_transfer)+0x30);
  206.    
  207.     printf("当前温度是:");
  208.     for(i=0;i<temp_datalen;i++)
  209.     {
  210.       printf("%c",temp_exchange_number[i]);
  211.     }
  212.     printf("°C   \r \n");
  213.   }
  214.   
  215.   /*********发送气压大小***********/
  216.   if(Pressure<0)
  217.   {
  218.     press_transfer=(long)(-Pressure);//(注意此单位是100*摄氏度,需将温度转换成摄氏度为单位)
  219.     press_exchange_number[0]='-';
  220.   }
  221.   else
  222.   {
  223.     press_transfer=(long)Pressure;//(注意此单位是100*摄氏度,需将温度转换成摄氏度为单位)
  224.     press_exchange_number[0]='\0';
  225.   }
  226.   
  227.   if(press_transfer>=0&&press_transfer<=99999)
  228.   {
  229.     press_datalen=7;
  230.     press_exchange_number[1]=((u16)(press_transfer/10000.0f)+0x30);//百位
  231.     press_transfer=press_transfer%10000;
  232.    
  233.     press_exchange_number[2]=((u16)(press_transfer/1000.0f)+0x30);//十位
  234.     press_transfer=temp_transfer%1000;
  235.    
  236.     press_exchange_number[3]=((u16)(press_transfer/100.0f)+0x30);//个位
  237.     press_transfer=temp_transfer%100;
  238.    
  239.     press_exchange_number[4]='.';
  240.    
  241.     press_exchange_number[5]=((u16)(press_transfer/10.0f)+0x30);
  242.     press_transfer=temp_transfer%10;
  243.    
  244.     press_exchange_number[6]=((u16)(press_transfer)+0x30);
  245.    
  246.     printf("当前气压是:");
  247.     for(i=0;i<press_datalen;i++)
  248.     {
  249.       printf("%c",press_exchange_number[i]);
  250.     }
  251.     printf("mbar   \r \n");
  252.   }
  253.   
  254.   if(press_transfer>=100000)
  255.   {
  256.     press_datalen=8;
  257.     press_exchange_number[1]=((u16)(press_transfer/100000.0f)+0x30);//千位
  258.     press_transfer=press_transfer%100000;
  259.    
  260.     press_exchange_number[2]=((u16)(press_transfer/10000.0f)+0x30);//百位
  261.     press_transfer=press_transfer%10000;
  262.    
  263.     press_exchange_number[3]=((u16)(press_transfer/1000.0f)+0x30);//十位
  264.     press_transfer=press_transfer%1000;
  265.    
  266.     press_exchange_number[4]=((u16)(press_transfer/100.0f)+0x30);//个位
  267.     press_transfer=press_transfer%100;
  268.    
  269.     press_exchange_number[5]='.';
  270.    
  271.     press_exchange_number[6]=((u16)(press_transfer/10.0f)+0x30);
  272.     press_transfer=press_transfer%10;
  273.    
  274.     press_exchange_number[7]=((u16)(press_transfer)+0x30);
  275.    
  276.     printf("当前气压是:");
  277.     for(i=0;i<press_datalen;i++)
  278.     {
  279.       printf("%c",press_exchange_number[i]);
  280.     }
  281.     printf("mbar   \r \n");
  282.   }
  283.   
  284.   
  285. }


  286. /*****   brief     获取ms5611的数据并写出onenet平台要求的Http协议格式   *****/
  287. void  get_ms5611_data(void)      
  288. {
  289.       char data[25]={0};
  290.       MS561101BA_GetTemperature(MS561101BA_Temp_D2_OSR_4096);
  291.       MS561101BA_GetPressure(MS561101BA_Press_D1_OSR_4096);
  292. ……………………

  293. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.jpg
以上2个文件51hei附件下载:

ms5611.rar (3.52 KB, 下载次数: 162)
回复

使用道具 举报

ID:72088 发表于 2020-10-18 12:08 | 显示全部楼层
读出的数据是是矫正过的,还是未矫正的,如果是未矫正的压强,该如何与温度矫正呢
回复

使用道具 举报

ID:283363 发表于 2018-4-20 11:02 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:480881 发表于 2019-2-26 12:42 | 显示全部楼层
感谢分享!!!!!!!!!!!!
回复

使用道具 举报

ID:148938 发表于 2019-11-6 17:41 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:635700 发表于 2019-11-7 07:17 | 显示全部楼层
厉害!
回复

使用道具 举报

ID:346927 发表于 2021-11-2 11:43 | 显示全部楼层
很好的资料,已下载,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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