找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3777|回复: 0
收起左侧

用于51单片机的MS5837气压水压传感器测试例程

[复制链接]
ID:469511 发表于 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. //产生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总线,准备发送或接收数据
  20. }         
  21. //产生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;//发送I2C总线结束信号
  29.         delayus(4);                                                                  
  30. }
  31. //等待应答信号到来
  32. //返回值:1,接收应答失败
  33. //        0,接收应答成功
  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;//拉低时钟开始数据传输
  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个字节,ack=1时,发送ACK,ack=0,发送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;}//发送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);//发送复位命令
  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的读数据
  131.                 intl = ms5837_IIC_Read_Byte(0);                         //最后一个字节NACK
  132.                 ms5837_IIC_Stop();
  133.     Cal_C[i] = (((u16)inth << 8) | intl);
  134.         }
  135.          
  136. }


  137. /**************************实现函数********************************************
  138. *函数原型:unsigned long MS561101BA_getConversion(void)
  139. *功  能:    读取 MS5837 的转换结果
  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); //写转换命令
  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的读数据  bit 23-16
  164.                         temp[1] = ms5837_IIC_Read_Byte(1);  //带ACK的读数据  bit 8-15
  165.                         temp[2] = ms5837_IIC_Read_Byte(0);  //带NACK的读数据 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, 下载次数: 113)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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