久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6718|回復: 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, 下載次數: 167)
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久国产精品影院 | 国产乱码精品一区二区三区五月婷 | 日韩成人一区 | 91色啪 | 日韩在线免费播放 | 成人在线视频观看 | 91婷婷韩国欧美一区二区 | 在线观看视频一区 | 中文字幕一区二区三区四区五区 | 成人激情免费视频 | av在线一区二区三区 | 男人的天堂视频网站 | se婷婷 | 久久在线精品 | 久久久精品一区 | 亚洲香蕉在线视频 | 欧美日韩亚洲二区 | 欧美精品一二三 | 免费a网站 | 天天夜碰日日摸日日澡 | 亚洲性视频| 国内自拍第一页 | 中国大陆高清aⅴ毛片 | 国产精品一区在线观看 | 国产91网址 | 91精品国产99 | 人人cao| 亚洲欧美激情精品一区二区 | 黄色骚片 | 中文字幕免费视频 | 一级黄色夫妻生活 | 久久久久国产精品午夜一区 | 久久最新网址 | 国产在线精品一区二区 | 日韩福利视频 | 国产精品国产三级国产播12软件 | 精品国产一区二区三区日日嗨 | 国产激情偷乱视频一区二区三区 | 99色在线 | 精品成人69xx.xyz| 国产激情在线 |