极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22026|回复: 6

气压传感器MS5611

[复制链接]
发表于 2011-12-8 13:31:21 | 显示全部楼层 |阅读模式
根据C51改编了为arduino 程序,编译通过了,还没有空试验是否正常。先发个帖子,以后再补全。


很奇怪,直接把代码复制过来再复制到arduino 022里就编译不了,我把能编译的程序放到RAR里了,哪位童鞋有空帮测试一下是否成功。
  1. #include <SPI.h>

  2. unsigned int w1,w2,w3,w4,d1,d2;
  3. float pressure,temperature;
  4. unsigned int fc[7];
  5. const int dir=6;
  6. const int clk=5;
  7. const int mosi=4;
  8. const int miso=3;
  9. const int sck=2;
  10. void setup()
  11. {  
  12.   Serial.begin(9600);   
  13.   SPI.begin();  
  14.   pinMode(dir,OUTPUT);  
  15.   pinMode(clk,OUTPUT);
  16. }


  17. unsigned int ms_read_w(unsigned char sel)
  18. {
  19.   unsigned int w;
  20.   switch(sel)
  21.   {
  22.   case 1:
  23.     ms_w(0x1d);
  24.     ms_w(0x50);
  25.     w=ms_r();
  26.     break;

  27.   case 2:
  28.     ms_w(0x1d);
  29.     ms_w(0x60);
  30.     w=ms_r();
  31.     break;

  32.   case 3:
  33.     ms_w(0x1d);
  34.     ms_w(0x90);
  35.     w=ms_r();
  36.     break;

  37.   case 4:
  38.     ms_w(0x1d);
  39.     ms_w(0xa0);
  40.     w=ms_r();
  41.     break;

  42.   default:
  43.     break;
  44.   }
  45.   return(w);
  46. }

  47. unsigned int ms_read_d(unsigned char sel)
  48. {
  49.   unsigned int d;
  50.   switch(sel)
  51.   {
  52.   case 1:
  53.     ms_w(0x0f);
  54.     ms_w(0x40);
  55.     delay(35);
  56.     d=ms_r();
  57.     break;

  58.   case 2:
  59.     ms_w(0x0f);
  60.     ms_w(0x20);
  61.     delay(35);
  62.     d=ms_r();
  63.     break;

  64.   default:
  65.     break;
  66.   }
  67.   return(d);
  68. }

  69. unsigned int change_w_to_C(unsigned char ix,unsigned int W1,unsigned int

  70. W2,unsigned int W3,unsigned int W4)
  71. {
  72.   unsigned int c=0;
  73.   unsigned int x,y;

  74.   switch(ix)
  75.   {
  76.   case 1:
  77.     c=(W1>>1)&0x7FFF;
  78.     break;

  79.   case 2:
  80.     x=(W3<<6)&0x0FC0;
  81.     y=W4&0x003F;
  82.     c=x|y;
  83.     break;

  84.   case 3:
  85.     c=(W4>>6)&0x03FF;
  86.     break;

  87.   case 4:
  88.     c=(w3>>6)&0x03FF;
  89.     break;

  90.   case 5:
  91.     x=(W1<<10)&0x0400;
  92.     y=(W2>>6)&0x03FF;
  93.     c=x|y;
  94.     break;

  95.   case 6:
  96.     c=W2&0x003F;
  97.     break;
  98.   }
  99.   return(c);
  100. }


  101. unsigned int trans_num(unsigned int d1_arg,unsigned int d2_arg)
  102. {
  103.   float dt,off,sens;
  104.   float fd1,fd2,x;
  105.   float T2,P2;
  106.   d1_arg=d1_arg&0xFFFF;
  107.   d2_arg=d2_arg&0xFFFF;
  108.   fd1=(float)d1_arg;
  109.   fd2=(float)d2_arg;

  110.   dt=fd2-((8.0*fc[5])+20224.0);
  111.   off=fc[2]*4.0+(((fc[4]-512.0)*dt)/4096.0);
  112.   sens=24576.0+fc[1]+((fc[3]*dt)/1024.0);
  113.   x=((sens*(fd1-7168.0))/16384.0)-off;

  114.   temperature=200.0+((dt*(fc[6]+50.0))/1024.0);
  115.   pressure=2500.0+x*10/32;

  116.   if (temperature<200)
  117.   {
  118.     T2=11.0*(fc[6]+24)*(200.0-temperature)*(200.0-temperature)/1048576.0;
  119.     P2=3*T2*(pressure-3500)/16384.0;
  120.   }
  121.   else if(temperature>450)
  122.   {
  123.     T2=3.0*(fc[6]+24)*(450.0-temperature)*(450.0-temperature)/1048576.0;
  124.     P2=T2*(pressure-10000)/8192.0;
  125.   }
  126.   else{
  127.     T2=0;
  128.     P2=0;
  129.   }
  130.   {
  131.     temperature=temperature-T2-40;
  132.   }
  133.   return(temperature,pressure);
  134. }

  135. void ms_rst(void)
  136. {
  137.   ms_w(0x15);
  138.   ms_w(0x55);
  139.   ms_w(0x40);
  140. }


  141. unsigned int ms_w(unsigned char dat)
  142. {
  143.   digitalWrite(dir,1);
  144.   SPI.transfer(dat);
  145.   digitalWrite(clk,0);
  146.   digitalWrite(clk,1);
  147.   digitalWrite(dir,0);
  148.   return(dat);
  149. }


  150. unsigned int ms_r()
  151. {
  152.   byte inByte=0;  
  153.   unsigned int result=0;
  154.   digitalWrite(dir,1);
  155.   digitalWrite(clk,1);
  156.   digitalWrite(clk,0);
  157.   digitalWrite(dir,0);
  158.   result=SPI.transfer(0x00);
  159.   result=result<<8;   
  160.   inByte=SPI.transfer(0x00);   
  161.   result=result|inByte;
  162.   return (result);
  163. }

  164. void loop()
  165. {
  166.   unsigned int jieguo;
  167.   unsigned char i;
  168.   ms_rst();
  169.   w1=ms_read_w(1);
  170.   w2=ms_read_w(2);
  171.   w3=ms_read_w(3);
  172.   w4=ms_read_w(4);

  173.   d1=ms_read_d(1);
  174.   d2=ms_read_d(2);

  175.   for (i=1;i<=6;i++)
  176.     fc[i]=change_w_to_C(i,w1,w2,w3,w4);

  177.   jieguo=trans_num(d1,d2);

  178.   Serial.print(jieguo);
  179.   Serial.println();
  180. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2011-12-8 17:13:03 | 显示全部楼层
都是同学,差距怎么那么大啊?我怎么像在看天书啊!我的大学啊{:soso_e109:}泪奔啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-12-8 18:15:55 | 显示全部楼层
本帖最后由 悠然小调 于 2011-12-8 18:52 编辑

美芳 真的是你吗?咦, 那么巧啊
回复 支持 反对

使用道具 举报

发表于 2011-12-8 21:46:30 | 显示全部楼层
经过测试。。。程序正常编译~~我贴出来了
@@论坛的代码高亮貌似对非IE支持不是很好。。。非IE浏览器要进入普通模式复制
回复 支持 反对

使用道具 举报

发表于 2011-12-11 18:43:24 | 显示全部楼层
悠然小调 发表于 2011-12-8 18:15
美芳 真的是你吗?咦, 那么巧啊

有内情。。。
回复 支持 反对

使用道具 举报

发表于 2013-6-6 09:55:25 | 显示全部楼层
有没MS5611的I2C程序
回复 支持 反对

使用道具 举报

发表于 2014-4-4 18:47:35 | 显示全部楼层
这个代码复制到arduino,没有什么反应,借口为A4  A5 ,求其他可用代码
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 21:14 , Processed in 0.045993 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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