找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4124|回復: 0
打印 上一主題 下一主題
收起左側(cè)

用于51單片機的MS5837氣壓水壓傳感器測試例程

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:469511 發(fā)表于 2019-4-24 11:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. //初始化IIC
  2. void ms5837_IIC_Init(void)
  3. {        
  4.         DEEP = 0;
  5.         Pressure = 0;
  6.         TEMP1 = 0;
  7.         ms5837_IIC_SCL=1;
  8.         ms5837_IIC_SDA=1;
  9. }
  10. //產(chǎn)生IIC起始信號
  11. void ms5837_IIC_Start(void)
  12. {
  13.         
  14.         ms5837_IIC_SDA=1;                    
  15.         ms5837_IIC_SCL=1;
  16.         delayus(4);
  17.          ms5837_IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  18.         delayus(4);
  19.         ms5837_IIC_SCL=0;//鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
  20. }         
  21. //產(chǎn)生IIC停止信號
  22. void ms5837_IIC_Stop(void)
  23. {

  24.         ms5837_IIC_SCL=0;
  25.         ms5837_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  26.          delayus(4);
  27.         ms5837_IIC_SCL=1;
  28.         ms5837_IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號
  29.         delayus(4);                                                                  
  30. }
  31. //等待應(yīng)答信號到來
  32. //返回值:1,接收應(yīng)答失敗
  33. //        0,接收應(yīng)答成功
  34. u8 ms5837_IIC_Wait_Ack(void)
  35. {
  36.         u8 ucErrTime=0;
  37.         
  38.         ms5837_IIC_SDA=1;
  39.         delayus(4);           
  40.         ms5837_IIC_SCL=1;
  41.         delayus(1);         
  42.         while(ms5837_IIC_SDA)
  43.         {
  44.                 ucErrTime++;
  45.                 if(ucErrTime>250)
  46.                 {
  47.                         ms5837_IIC_Stop();
  48.                         return 1;
  49.                 }
  50.         }
  51.         ms5837_IIC_SCL=0;//時鐘輸出0            
  52.         return 0;  
  53. }

  54. void ms5837_IIC_Send_Byte(u8 txd)
  55. {                        
  56.     u8 t;   
  57.          
  58.     ms5837_IIC_SCL=0;//拉低時鐘開始數(shù)據(jù)傳輸
  59.     for(t=0;t<8;t++)
  60.     {              
  61.         ms5837_IIC_SDA=(txd&0x80)>>7;
  62.         txd<<=1;           
  63.                 delayus(2);   //對TEA5767這三個延時都是必須的
  64.                 ms5837_IIC_SCL=1;
  65.                 delayus(2);
  66.                 ms5837_IIC_SCL=0;        
  67.                 delayus(2);
  68.     }               
  69. }            
  70. //讀1個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK   
  71. u8 ms5837_IIC_Read_Byte(u8 ack)
  72. {
  73.         unsigned char i,receive=0;
  74.         ms5837_IIC_SDA=1;
  75.     for(i=0;i<8;i++ )
  76.         {
  77.         delayus(2);
  78.                     ms5837_IIC_SCL=1;
  79.         receive<<=1;
  80.         if(ms5837_IIC_SDA)receive++;   
  81.                 delayus(1);
  82.                 ms5837_IIC_SCL=0;
  83.     }        
  84.         
  85. if (ack==0)
  86. {        ms5837_IIC_SCL=0;
  87.         ms5837_IIC_SDA=1;
  88.         delayus(2);
  89.         
  90.         ms5837_IIC_SCL=1;
  91.         delayus(2);
  92. ms5837_IIC_SCL=0;}//發(fā)送nACK
  93. else{               
  94.   ms5837_IIC_SCL=0;
  95.         ms5837_IIC_SDA=0;
  96.         delayus(2);
  97.         
  98.         ms5837_IIC_SCL=1;
  99.         delayus(2);
  100.         ms5837_IIC_SCL=0;
  101.                 }         

  102.     return receive;
  103. }

  104. void MS583703BA_RESET(void)
  105. {
  106.                 ms5837_IIC_Start();
  107.                 ms5837_IIC_Send_Byte(0xEC);//CSB接地,主機地址:0XEE,否則 0X77
  108.           ms5837_IIC_Wait_Ack();
  109.     ms5837_IIC_Send_Byte(0x1E);//發(fā)送復位命令
  110.           ms5837_IIC_Wait_Ack();
  111.     ms5837_IIC_Stop();
  112.         
  113. }

  114. void MS5837_init(void)
  115. {         
  116.   u16  inth,intl;
  117.   for (i=0;i<=6;i++)
  118.         {
  119.                 ms5837_IIC_Start();
  120.     ms5837_IIC_Send_Byte(0xEC);
  121.                 ms5837_IIC_Wait_Ack();
  122.                 ms5837_IIC_Send_Byte(0xA0 + (i*2));
  123.                 ms5837_IIC_Wait_Ack();
  124.     ms5837_IIC_Stop();               
  125.                 delayus(5);
  126.                 ms5837_IIC_Start();
  127.                 ms5837_IIC_Send_Byte(0xEC+0x01);  //進入接收模式
  128.                 delayus(1);
  129.                 ms5837_IIC_Wait_Ack();
  130.                 inth = ms5837_IIC_Read_Byte(1);                  //帶ACK的讀數(shù)據(jù)
  131.                 intl = ms5837_IIC_Read_Byte(0);                         //最后一個字節(jié)NACK
  132.                 ms5837_IIC_Stop();
  133.     Cal_C[i] = (((u16)inth << 8) | intl);
  134.         }
  135.          
  136. }


  137. /**************************實現(xiàn)函數(shù)********************************************
  138. *函數(shù)原型:unsigned long MS561101BA_getConversion(void)
  139. *功  能:    讀取 MS5837 的轉(zhuǎn)換結(jié)果
  140. *******************************************************************************/
  141. u32  MS583703BA_getConversion(u8 command)
  142. {
  143.                         unsigned long conversion = 0;
  144.         u32 temp[3];
  145.         
  146.             ms5837_IIC_Start();
  147.                         ms5837_IIC_Send_Byte(0xEC);                 //寫地址
  148.                         ms5837_IIC_Wait_Ack();
  149.                         ms5837_IIC_Send_Byte(command); //寫轉(zhuǎn)換命令
  150.                         ms5837_IIC_Wait_Ack();
  151.                         ms5837_IIC_Stop();

  152.                         delayms(20);
  153.                         ms5837_IIC_Start();
  154.                         ms5837_IIC_Send_Byte(0xEC);                 //寫地址
  155.                         ms5837_IIC_Wait_Ack();
  156.                         ms5837_IIC_Send_Byte(0);                                // start read sequence
  157.                         ms5837_IIC_Wait_Ack();
  158.                         ms5837_IIC_Stop();
  159.                  
  160.                         ms5837_IIC_Start();
  161.                         ms5837_IIC_Send_Byte(0xEC+0x01);  //進入接收模式
  162.                         ms5837_IIC_Wait_Ack();
  163.                         temp[0] = ms5837_IIC_Read_Byte(1);  //帶ACK的讀數(shù)據(jù)  bit 23-16
  164.                         temp[1] = ms5837_IIC_Read_Byte(1);  //帶ACK的讀數(shù)據(jù)  bit 8-15
  165.                         temp[2] = ms5837_IIC_Read_Byte(0);  //帶NACK的讀數(shù)據(jù) bit 0-7
  166.                         ms5837_IIC_Stop();
  167.                         conversion = temp[0] * 65536 + temp[1] * 256 + temp[2];
  168.                
  169. return  conversion;
  170. }
復制代碼

全部資料51hei下載地址:
STC15W408AS-ms5837-02BA氣壓水壓傳感器.rar (53.08 KB, 下載次數(shù): 115)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表