欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: BMP180數據手冊+STM32例程+51單片機例程 [打印本頁]

作者: 小馮同學    時間: 2017-5-29 13:22
標題: BMP180數據手冊+STM32例程+51單片機例程
如題,正巧在做一個bmp180課題,找的一點資料


里面有如下文件:
51單片機BMP180氣壓計例程
STM32_bmp180例程
STM32F103氣壓計BMP180例程


BMP180數據手冊pdf格式文件(附件中可下載):


STM32單片機源程序如下:
  1. #include "BMP180.h"
  2. #include "delay.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //氣壓傳感器BMP180的STM32驅動,本程序只供學習使用
  5. //////////////////////////////////////////////////////////////////////////////////
  6.   
  7. //初始化IIC
  8. void IIC_Init(void)
  9. {
  10.       
  11. GPIO_InitTypeDef GPIO_InitStructure;
  12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
  13.    
  14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
  15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽輸出
  16. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17. GPIO_Init(GPIOB, &GPIO_InitStructure);
  18. GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //PB10,PB11 輸出高

  19. }
  20. //產生IIC起始信號
  21. void IIC_Start(void)
  22. {

  23. SDA_OUT();     //sda線輸出
  24. IIC_SDA=1;   
  25. IIC_SCL=1;
  26. delay_us(4);
  27. IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  28. delay_us(4);
  29. IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據

  30. }
  31. //產生IIC停止信號
  32. void IIC_Stop(void)
  33. {

  34. SDA_OUT();//sda線輸出
  35. IIC_SCL=0;
  36. IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  37. delay_us(4);
  38. IIC_SCL=1;
  39. IIC_SDA=1;//發送I2C總線結束信號
  40. delay_us(4);  

  41. }
  42. //等待應答信號到來
  43. //返回值:1,接收應答失敗
  44. //        0,接收應答成功
  45. u8 IIC_Wait_Ack(void)
  46. {

  47. u8 ucErrTime=0;
  48. SDA_IN();      //SDA設置為輸入
  49. IIC_SDA=1;delay_us(1);  
  50. IIC_SCL=1;delay_us(1);
  51. while(READ_SDA)
  52. {

  53. ucErrTime++;
  54. if(ucErrTime>250)
  55. {

  56. IIC_Stop();
  57. return 1;

  58. }

  59. }
  60. IIC_SCL=0;//時鐘輸出0   
  61. return 0;

  62. }
  63. //產生ACK應答
  64. void IIC_Ack(void)
  65. {

  66. IIC_SCL=0;
  67. SDA_OUT();
  68. IIC_SDA=0;
  69. delay_us(2);
  70. IIC_SCL=1;
  71. delay_us(2);
  72. IIC_SCL=0;

  73. }
  74. //不產生ACK應答   
  75. void IIC_NAck(void)
  76. {

  77. IIC_SCL=0;
  78. SDA_OUT();
  79. IIC_SDA=1;
  80. delay_us(2);
  81. IIC_SCL=1;
  82. delay_us(2);
  83. IIC_SCL=0;

  84. }     
  85. //IIC發送一個字節
  86. //返回從機有無應答
  87. //1,有應答
  88. //0,無應答
  89. void IIC_Send_Byte(u8 txd)
  90. {
  91.                         
  92.     u8 t;  
  93. SDA_OUT();   
  94.     IIC_SCL=0;//拉低時鐘開始數據傳輸
  95.     for(t=0;t<8;t++)
  96.     {
  97.                
  98.         //IIC_SDA=(txd&0x80)>>7;
  99. if((txd&0x80)>>7)
  100. IIC_SDA=1;
  101. else
  102. IIC_SDA=0;
  103. txd<<=1;  
  104. delay_us(2);   //對TEA5767這三個延時都是必須的
  105. IIC_SCL=1;
  106. delay_us(2);
  107. IIC_SCL=0;
  108. delay_us(2);
  109.      
  110. }

  111. }   
  112. //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK  
  113. u8 IIC_Read_Byte(unsigned char ack)
  114. {

  115. unsigned char i,receive=0;
  116. SDA_IN();//SDA設置為輸入
  117.     for(i=0;i<8;i++ )
  118. {

  119.         IIC_SCL=0;
  120.         delay_us(2);
  121. IIC_SCL=1;
  122.         receive<<=1;
  123.         if(READ_SDA)receive++;  
  124. delay_us(1);
  125.      
  126. }
  127.     if (!ack)
  128.         IIC_NAck();//發送nACK
  129.     else
  130.         IIC_Ack(); //發送ACK  
  131.     return receive;

  132. }

  133. u8 BMP180_ReadOneByte(u8 ReadAddr)
  134. {
  135.    
  136. u8 temp=0;      
  137.     IIC_Start();
  138. IIC_Send_Byte(BMP180_WR_ADDR);   //發送寫命令
  139. IIC_Wait_Ack();  
  140.     IIC_Send_Byte(ReadAddr);   //發送要讀的寄存器地址
  141. IIC_Wait_Ack();   
  142. IIC_Start();     
  143. IIC_Send_Byte(BMP180_RD_ADDR);           //進入接收模式  
  144. IIC_Wait_Ack();
  145.     temp=IIC_Read_Byte(0);  
  146.     IIC_Stop();//產生一個停止條件   
  147. return temp;

  148. }



  149. // u16 BMP180_ReadTowByte(u8 ReadAddr)
  150. // {
  151.    
  152. // u16 temp=0;      
  153. //     IIC_Start();
  154. // IIC_Send_Byte(BMP180_WR_ADDR);   //發送寫命令
  155. // IIC_Wait_Ack();  
  156. //     IIC_Send_Byte(ReadAddr);   //發送要讀的寄存器地址
  157. // IIC_Wait_Ack();   
  158. // IIC_Start();     
  159. // IIC_Send_Byte(BMP180_RD_ADDR);           //進入接收模式  
  160. // IIC_Wait_Ack();
  161. // IIC_Send_Byte(BMP180_RD_ADDR);           //進入接收模式  
  162. // IIC_Wait_Ack();
  163. //     temp=IIC_Read_Byte(0);  
  164. //     IIC_Stop();//產生一個停止條件   
  165. // return temp;
  166. //
  167. }
  168. //在AT24CXX指定地址寫入一個數據
  169. //WriteAddr  :寫入數據的目的地址   
  170. //DataToWrite:要寫入的數據
  171. void BMP180_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
  172. {
  173.            
  174.     IIC_Start();

  175. IIC_Send_Byte(BMP180_WR_ADDR);    //發送寫命令
  176.   
  177. IIC_Wait_Ack();  
  178.     IIC_Send_Byte(WriteAddr);   //發送地址
  179. IIC_Wait_Ack();      
  180. IIC_Send_Byte(DataToWrite);     //發送字節  
  181. IIC_Wait_Ack();        
  182.     IIC_Stop();//產生一個停止條件
  183. delay_us(1);

  184. }

  185. // int BMP180_CRC_Read(u8 addr)
  186. // {

  187. // u16 temp;
  188. // temp = (BMP180_ReadOneByte(addr)<<8)|BMP180_ReadOneByte(addr+1);   
  189. // return temp;
  190. //
  191. }
  192. short BMP180_CRC_Read(u8 addr)
  193. {

  194.         u8 msb,lsb;
  195.         short data;
  196.         IIC_Start();
  197.         IIC_Send_Byte(BMP180_WR_ADDR);   //發送寫命令
  198.         IIC_Wait_Ack();  
  199.         IIC_Send_Byte(addr);   //發送要讀的寄存器地址
  200.         IIC_Wait_Ack();
  201.         IIC_Start();
  202.         IIC_Send_Byte(BMP180_RD_ADDR);
  203.          
  204.         IIC_Wait_Ack();
  205.         msb=IIC_Read_Byte(1);
  206.         //IIC_Wait_Ack();
  207.         lsb=IIC_Read_Byte(0);
  208.         //IIC_Wait_Ack();
  209.         IIC_Stop();
  210.         delay_us(5);
  211.         data= msb << 8;
  212.         data|= lsb;
  213.         return data;

  214. }
  215. u16 BMP085_Get_UT(void)
  216. {

  217.         IIC_Start();
  218.         IIC_Send_Byte(BMP180_WR_ADDR);//發送寫命令
  219.         //IIC_Wait_Ack();
  220.         IIC_Send_Byte(0xf4);        //發送字
  221.         //IIC_Wait_Ack();
  222.         IIC_Send_Byte(0x2E);
  223.         IIC_Stop();
  224.         delay_ms(5);
  225. ……………………

  226. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
BMP180數據手冊 STM32例程 51例程.zip (1.65 MB, 下載次數: 725)



作者: yuanchunwei99    時間: 2017-7-7 00:16
樓主好人,謝謝分享
作者: andayjon    時間: 2017-11-15 10:42
多謝樓主分享!!正在找相關的資料呢
作者: 輕730    時間: 2017-12-19 11:10
你好,樓主,我用了你在資料里面發的51單片機例程,是不是需要相應配套的主函數。。還
作者: stm322016    時間: 2017-12-22 19:40
謝謝分享
作者: liuzhihong1986    時間: 2017-12-30 22:31
下載還要積分真是的。才開始啥都不會啊。。。。。。
作者: FeatherZone    時間: 2018-5-14 08:41
謝謝分享
作者: houzero    時間: 2018-5-28 16:39
樓主好人,謝謝分享2333
作者: hclin    時間: 2018-5-30 11:26
Just need, Thanks !!!
作者: helic    時間: 2018-5-31 19:53
感謝樓主 正需要用這個呢
作者: 風158    時間: 2018-6-1 20:12
多謝樓主分享!
作者: 風158    時間: 2018-6-1 21:55
謝謝分享,下來學習學習。
作者: mjfu2018    時間: 2018-6-13 22:00
編譯失敗,不能使用
作者: 海嵌    時間: 2018-6-26 20:45
厲害,底層還是比較少人研究的
作者: WYWD    時間: 2018-7-5 09:48
牛啊,謝謝分享,一起加油!
作者: avpexe    時間: 2018-7-29 15:47
牛逼啊 可是怎么才能下載呢
作者: avpexe    時間: 2018-7-29 15:49
下載那 牛逼啊大兄弟
作者: 如風若簡    時間: 2018-8-3 15:25
感謝樓主的分享
作者: sgq402    時間: 2018-8-9 15:04
樓主好人,謝謝分享
作者: zhangpeng622    時間: 2018-8-10 09:22
謝謝分享
作者: NPC-1024    時間: 2018-8-18 21:49
恕我直言,文件里面51那部分函數寫的跟翔一樣,typedef覆蓋了一部分數據類型,有些關鍵字還有缺失,比如unsigned少了第一個u,變成了nsigned這樣。縮進亂七八糟,空格和換行哪里都是。說是例程,實際上是從例程把主函數刪去,只剩下BMP180相關的部分了,可以明顯看到殘留的各種頭文件和殘缺的顯示函數。
倒不是說樓主怎么樣,也許這程序也不是樓主大人寫的,但是這質量,不忍直視。
作者: NPC-1024    時間: 2018-8-18 22:21
之前說的有些言重了,我把BMP180的51部分驅動函數排版了一下,函數聲明已經在C文件里寫了,不再需要h頭文件。聲明一下,還沒有進行測試,只是將樓主的函數整理了一下而已。傳上來給大家驗證好了。

BMP180.zip (1.74 KB, 下載次數: 139)
作者: 柯敏軒    時間: 2018-12-4 17:05
謝謝樓主。。。
作者: gefeifan    時間: 2018-12-19 16:14
謝謝樓主。
作者: liu281469315    時間: 2019-1-8 16:48
感謝,準備開發一款相關產品,很有參考價值
作者: liu281469315    時間: 2019-1-8 16:50
NPC-1024 發表于 2018-8-18 22:21
之前說的有些言重了,我把BMP180的51部分驅動函數排版了一下,函數聲明已經在C文件里寫了,不再需要h頭文件 ...

怎么辦,直接伸手要了,不過感謝整理,論壇有你更精彩1

作者: sdsslh    時間: 2019-3-27 09:24
謝謝樓上大神的分享 辛苦了

作者: 數字卡卡    時間: 2019-3-28 22:44
樓主真愛啊
作者: 笨笨兔    時間: 2019-5-31 15:56
謝謝樓主分享。
謝謝沙發。
作者: 薩達塞塞    時間: 2019-7-12 10:16
正在用這個模塊,感覺很有用
作者: 幻想就youth    時間: 2020-3-15 09:29
謝謝樓主
作者: liuqiqing4    時間: 2020-4-8 12:02
NPC-1024 發表于 2018-8-18 22:21
之前說的有些言重了,我把BMP180的51部分驅動函數排版了一下,函數聲明已經在C文件里寫了,不再需要h頭文件 ...

多謝分享
作者: 騰飛的龍    時間: 2021-4-26 08:44
  1. //#include<intrins.h>
  2. #include<reg52.h>
  3. sbit BMP180_SCL=P0^3;
  4. sbit BMP180_SDA=P0^4;

  5. #define BMP180_SlaveAddress 0xee//定義器件在IIC總線中的從地址
  6. #define OSS 0//Over sampling Setting(note:code is not set up to use other OSS values)

  7. void Init_BMP180();
  8. void BMP180_Calculate();

  9. long BMP180_Temperature=0;//溫度值
  10. long BMP180_Pressure=0;//壓力值
  11. long BMP180_Height=0;//相對海拔高度值

  12. int dis_data;
  13. short ac1;
  14. short ac2;
  15. short ac3;
  16. unsigned short ac4;
  17. unsigned short ac5;
  18. unsigned short ac6;
  19. short b1;
  20. short b2;
  21. short mb;
  22. short mc;
  23. short md;

  24. void BMP180_Delay5us()//@11.0592MHz
  25. {
  26.         unsigned char i;

  27.         _nop_();
  28.         i=11;
  29.         while(--i);
  30. }

  31. void BMP180_Delay4500us()//@11.0592MHz
  32. {
  33.         unsigned char i, j;

  34.         _nop_();
  35.         _nop_();
  36.         i = 49;
  37.         j = 101;
  38.         do
  39.         {
  40.                 while (--j);
  41.         } while (--i);
  42. }

  43. void BMP180_IIC_Start()
  44. {
  45.         BMP180_SDA=1;//拉高數據線
  46.         BMP180_SCL=1;//拉高時鐘線
  47.         BMP180_Delay5us();//延時
  48.         BMP180_SDA=0;//產生下降沿
  49.         BMP180_Delay5us();//延時
  50.         BMP180_SCL=0;//拉低時鐘線
  51. }

  52. void BMP180_IIC_Stop()
  53. {
  54.         BMP180_SDA=0;//拉低數據線
  55.         BMP180_SCL=1;//拉高時鐘線
  56.         BMP180_Delay5us();//延時
  57.         BMP180_SDA=1;//產生上升沿
  58.         BMP180_Delay5us();//延時
  59. }

  60. void BMP180_IIC_SendACK(bit ack)//發送應答信號,參數0:ACK1:NAK
  61. {
  62.         BMP180_SDA=ack;//寫應答信號
  63.         BMP180_SCL=1;//拉高時鐘線
  64.         BMP180_Delay5us();//延時
  65.         BMP180_SCL=0;//拉低時鐘線
  66.         BMP180_Delay5us();//延時
  67. }

  68. bit BMP180_IIC_ReceiveACK()
  69. {
  70.         BMP180_SCL=1;//拉高時鐘線
  71.         BMP180_Delay5us();//延時
  72.         CY=BMP180_SDA;//讀應答信號
  73.         BMP180_SCL=0;//拉低時鐘線
  74.         BMP180_Delay5us();//延時

  75.         return CY;
  76. }

  77. void BMP180_IIC_SendByte(unsigned char dat)
  78. {
  79.         unsigned char i;

  80.         for(i=0;i<8;i++)//8位計數器
  81.         {
  82.                 dat<<=1;//移出數據的最高位
  83.                 BMP180_SDA=CY;//送數據口
  84.                 BMP180_SCL=1;//拉高時鐘線
  85.                 BMP180_Delay5us();//延時
  86.                 BMP180_SCL=0;//拉低時鐘線
  87.                 BMP180_Delay5us();//延時
  88.         }
  89.         BMP180_IIC_ReceiveACK();
  90. }

  91. unsigned char BMP180_IIC_RecvByte()
  92. {
  93.         unsigned char i;
  94.         unsigned char dat=0;

  95.         BMP180_SDA=1;//使能內部上拉,準備讀取數據,
  96.         for(i=0;i<8;i++)//8位計數器
  97.         {
  98.                 dat<<=1;
  99.                 BMP180_SCL=1;//拉高時鐘線
  100.                 BMP180_Delay5us();//延時
  101.                 dat|=BMP180_SDA;//讀數據
  102.                 BMP180_SCL=0;//拉低時鐘線
  103.                 BMP180_Delay5us();//延時
  104.         }
  105.         return dat;
  106. }

  107. short BMP180_IIC_MultRead(unsigned char ST_Address)//讀取兩個字節
  108. {
  109.         unsigned char msb,lsb;
  110.         short _data;
  111.         BMP180_IIC_Start();//起始信號
  112.         BMP180_IIC_SendByte(BMP180_SlaveAddress);//發送設備地址+寫信號
  113.         BMP180_IIC_SendByte(ST_Address);//發送存儲單元地址
  114.         BMP180_IIC_Start();//起始信號
  115.         BMP180_IIC_SendByte(BMP180_SlaveAddress+1);//發送設備地址+讀信號

  116.         msb=BMP180_IIC_RecvByte();//BUF[0]存儲
  117.         BMP180_IIC_SendACK(0);//回應ACK
  118.         lsb=BMP180_IIC_RecvByte();
  119.         BMP180_IIC_SendACK(1);//最后一個數據需要回NOACK

  120.         BMP180_IIC_Stop();//停止信號
  121.         Delay5ms();
  122.         _data=msb<<8;
  123.         _data|=lsb;
  124.         return _data;
  125. }

  126. long BMP180_Read_Temperature()
  127. {
  128.         BMP180_IIC_Start();//起始信號
  129.         BMP180_IIC_SendByte(BMP180_SlaveAddress);//發送設備地址+寫信號
  130.         BMP180_IIC_SendByte(0xF4);//writeregisteraddress
  131.         BMP180_IIC_SendByte(0x2E);//writeregisterdatafortemp
  132.         BMP180_IIC_Stop();//發送停止信號
  133.         Delay_1ms(10);//maxtimeis4.5ms

  134.         return (long)BMP180_IIC_MultRead(0xF6);
  135. }

  136. long BMP180_Read_Pressure()
  137. {
  138.         long BMP180_Pressure=0;

  139.         BMP180_IIC_Start();//起始信號
  140.         BMP180_IIC_SendByte(BMP180_SlaveAddress);//發送設備地址+寫信號
  141.         BMP180_IIC_SendByte(0xF4);//writeregisteraddress
  142.         BMP180_IIC_SendByte(0x34);//writeregisterdataforpressure
  143.         BMP180_IIC_Stop();//發送停止信號
  144.         BMP180_Delay4500us();//max time is 4.5ms

  145.         BMP180_Pressure=BMP180_IIC_MultRead(0xF6);
  146.         BMP180_Pressure&=0x0000FFFF;

  147.         return BMP180_Pressure;
  148. }

  149. void Init_BMP180()//初始化BMP180
  150. {
  151.         ac1=BMP180_IIC_MultRead(0xAA);
  152.         ac2=BMP180_IIC_MultRead(0xAC);
  153.         ac3=BMP180_IIC_MultRead(0xAE);
  154.         ac4=BMP180_IIC_MultRead(0xB0);
  155.         ac5=BMP180_IIC_MultRead(0xB2);
  156.         ac6=BMP180_IIC_MultRead(0xB4);
  157.         b1=BMP180_IIC_MultRead(0xB6);
  158.         b2=BMP180_IIC_MultRead(0xB8);
  159.         mb=BMP180_IIC_MultRead(0xBA);
  160.         mc=BMP180_IIC_MultRead(0xBC);
  161.         md=BMP180_IIC_MultRead(0xBE);
  162. }

  163. void BMP180_Calculate()
  164. {
  165.         unsigned int ut;
  166.         unsigned long up;
  167.         long x1,x2,b5,b6,x3,b3,p;
  168.         unsigned long b4,b7;

  169.         ut=BMP180_Read_Temperature();//讀取溫度
  170.         up=BMP180_Read_Pressure();//讀取壓強
  171.         x1=(((long)ut-(long)ac6)*(long)ac5)>>15;
  172.         x2=((long)mc<<11)/(x1+md);
  173.         b5=x1+x2;
  174.         BMP180_Temperature=((b5+8)>>4);
  175.         b6=b5-4000;
  176.         //Calculate B3
  177.         x1=(b2*(b6*b6)>>12)>>11;
  178.         x2=(ac2*b6)>>11;
  179.         x3=x1+x2;
  180.         b3=(((((long)ac1)*4+x3)<<OSS)+2)>>2;

  181.         //Calculate B4
  182.         x1=(ac3*b6)>>13;
  183.         x2=(b1*((b6*b6)>>12))>>16;
  184.         x3=((x1+x2)+2)>>2;
  185.         b4=(ac4*(unsigned long)(x3+32768))>>15;

  186.         b7=((unsigned long)(up-b3)*(50000>>OSS));
  187.         if(b7<0x80000000)
  188.         {
  189.                 p=(b7<<1)/b4;
  190.         }
  191.         else
  192.         {
  193.                 p=(b7/b4)<<1;
  194.         }

  195.         x1=(p>>8)*(p>>8);
  196.         x1=(x1*3038)>>16;
  197.         x2=(-7357*p)>>16;
  198.         BMP180_Pressure=p+((x1+x2+3791)>>4);

  199.         BMP180_Height=(101325-BMP180_Pressure)*9;
  200. }
復制代碼

作者: 熊貓day    時間: 2022-3-25 21:05
騰飛的龍 發表于 2021-4-26 08:44

請問這是51單片機的完整代碼嗎?
作者: 小卿    時間: 2023-3-27 13:42
感謝樓主的熱心分享




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1