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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15510|回復: 21
收起左側

51單片機讀取BMP085氣壓值1602顯示程序

  [復制鏈接]
ID:209899 發表于 2017-6-10 17:43 | 顯示全部樓層 |閱讀模式
讀取BMP085的氣壓值 以及溫度值(氣壓值帶溫度補償)
采用模擬i2c通訊
LCD1602液晶顯示
0.png

單片機源程序如下:
  1. //***************************************
  2. // BMP085 IIC測試程序
  3. // 使用單片機STC89C51
  4. // 晶振:11.0592M
  5. // 顯示:LCD1602
  6. // 編譯環境 Keil uVision2
  7. // 參考宏晶網站24c04通信程序
  8. // 時間:2011年7月1日
  9. // QQ:531389319
  10. //****************************************
  11. #include  <REG51.H>         
  12. #include  <math.h>    //Keil library  
  13. #include  <stdlib.h>  //Keil library  
  14. #include  <stdio.h>   //Keil library        
  15. #include  <INTRINS.H> //Keil library  
  16. #define   uchar unsigned char
  17. #define   uint unsigned int        
  18. #define   DataPort P0    //LCD1602數據端口
  19. sbit          SCL=P1^0;      //IIC時鐘引腳定義
  20. sbit           SDA=P1^1;      //IIC數據引腳定義
  21. sbit      LCM_RS=P2^4;   //LCD1602命令端口               
  22. sbit      LCM_RW=P2^5;   //LCD1602命令端口               
  23. sbit      LCM_EN=P2^6;   //LCD1602命令端口

  24. #define        BMP085_SlaveAddress   0xec          //定義器件在IIC總線中的從地址                              

  25. #define OSS 0        // Oversampling Setting (note: code is not set up to use other OSS values)
  26.                                                            
  27. typedef unsigned char  BYTE;
  28. typedef unsigned short WORD;
  29.            
  30. uchar ge,shi,bai,qian,wan,shiwan;           //顯示變量
  31. int  dis_data;                              //變量

  32. short ac1;
  33. short ac2;
  34. short ac3;
  35. unsigned short ac4;
  36. unsigned short ac5;
  37. unsigned short ac6;
  38. short b1;
  39. short b2;
  40. short mb;
  41. short mc;
  42. short md;

  43. void delay(unsigned int k);
  44. void InitLcd();                            //初始化lcd1602

  45. void WriteDataLCM(uchar dataW);
  46. void WriteCommandLCM(uchar CMD,uchar Attribc);
  47. void DisplayOneChar(uchar X,uchar Y,uchar DData);
  48. void conversion(long temp_data);

  49. void  Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);   //單個寫入數據
  50. uchar Single_Read(uchar REG_Address);                                      //單個讀取內部寄存器數據
  51. void  Multiple_Read(uchar,uchar);                                          //連續的讀取內部寄存器數據
  52. //------------------------------------
  53. void Delay5us();
  54. void Delay5ms();
  55. void BMP085_Start();
  56. void BMP085_Stop();
  57. void BMP085_SendACK(bit ack);
  58. bit  BMP085_RecvACK();
  59. void BMP085_SendByte(BYTE dat);
  60. BYTE BMP085_RecvByte();
  61. void BMP085_ReadPage();
  62. void BMP085_WritePage();
  63. //-----------------------------------

  64. //*********************************************************
  65. void conversion(long temp_data)  
  66. {  
  67.    
  68.     shiwan=temp_data/100000+0x30 ;
  69.     temp_data=temp_data%100000;   //取余運算
  70.     wan=temp_data/10000+0x30 ;
  71.     temp_data=temp_data%10000;   //取余運算
  72.         qian=temp_data/1000+0x30 ;
  73.     temp_data=temp_data%1000;    //取余運算
  74.     bai=temp_data/100+0x30   ;
  75.     temp_data=temp_data%100;     //取余運算
  76.     shi=temp_data/10+0x30    ;
  77.     temp_data=temp_data%10;      //取余運算
  78.     ge=temp_data+0x30;         
  79. }

  80. /*******************************/
  81. void delay(unsigned int k)        
  82. {                                                
  83. unsigned int i,j;                                
  84. for(i=0;i<k;i++)
  85. {                        
  86. for(j=0;j<121;j++)                        
  87. {;}}                                                
  88. }
  89. /*******************************/
  90. void WaitForEnable(void)        
  91. {                                       
  92. DataPort=0xff;               
  93. LCM_RS=0;LCM_RW=1;_nop_();
  94. LCM_EN=1;_nop_();_nop_();
  95. while(DataPort&0x80);        
  96. LCM_EN=0;                                
  97. }                                       
  98. /*******************************/
  99. void WriteCommandLCM(uchar CMD,uchar Attribc)
  100. {                                       
  101. if(Attribc)WaitForEnable();        
  102. LCM_RS=0;LCM_RW=0;_nop_();
  103. DataPort=CMD;_nop_();        
  104. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  105. }                                       
  106. /*******************************/
  107. void WriteDataLCM(uchar dataW)
  108. {                                       
  109. WaitForEnable();               
  110. LCM_RS=1;LCM_RW=0;_nop_();
  111. DataPort=dataW;_nop_();        
  112. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  113. }               
  114. /***********************************/
  115. void InitLcd()                                
  116. {                        
  117. WriteCommandLCM(0x38,1);        
  118. WriteCommandLCM(0x08,1);        
  119. WriteCommandLCM(0x01,1);        
  120. WriteCommandLCM(0x06,1);        
  121. WriteCommandLCM(0x0c,1);
  122. }                        
  123. /***********************************/
  124. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  125. {                                                
  126. Y&=1;                                                
  127. X&=15;                                                
  128. if(Y)X|=0x40;                                       
  129. X|=0x80;                        
  130. WriteCommandLCM(X,0);               
  131. WriteDataLCM(DData);               
  132. }                                                

  133. /**************************************
  134. 延時5微秒(STC90C52RC@12M)
  135. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  136. 當改用1T的MCU時,請調整此延時函數
  137. **************************************/
  138. void Delay5us()
  139. {
  140.     _nop_();_nop_();_nop_();_nop_();
  141.     _nop_();_nop_();_nop_();_nop_();
  142.         _nop_();_nop_();_nop_();_nop_();
  143.         _nop_();_nop_();_nop_();_nop_();
  144. }

  145. /**************************************
  146. 延時5毫秒(STC90C52RC@12M)
  147. 不同的工作環境,需要調整此函數
  148. 當改用1T的MCU時,請調整此延時函數
  149. **************************************/
  150. void Delay5ms()
  151. {
  152.     WORD n = 560;

  153.     while (n--);
  154. }

  155. /**************************************
  156. 起始信號
  157. **************************************/
  158. void BMP085_Start()
  159. {
  160.     SDA = 1;                    //拉高數據線
  161.     SCL = 1;                    //拉高時鐘線
  162.     Delay5us();                 //延時
  163.     SDA = 0;                    //產生下降沿
  164.     Delay5us();                 //延時
  165.     SCL = 0;                    //拉低時鐘線
  166. }

  167. /**************************************
  168. 停止信號
  169. **************************************/
  170. void BMP085_Stop()
  171. {
  172.     SDA = 0;                    //拉低數據線
  173.     SCL = 1;                    //拉高時鐘線
  174.     Delay5us();                 //延時
  175.     SDA = 1;                    //產生上升沿
  176.     Delay5us();                 //延時
  177. }

  178. /**************************************
  179. 發送應答信號
  180. 入口參數:ack (0:ACK 1:NAK)
  181. **************************************/
  182. void BMP085_SendACK(bit ack)
  183. {
  184.     SDA = ack;                  //寫應答信號
  185.     SCL = 1;                    //拉高時鐘線
  186.     Delay5us();                 //延時
  187.     SCL = 0;                    //拉低時鐘線
  188.     Delay5us();                 //延時
  189. }

  190. /**************************************
  191. 接收應答信號
  192. **************************************/
  193. bit BMP085_RecvACK()
  194. {
  195.     SCL = 1;                    //拉高時鐘線
  196.     Delay5us();                 //延時
  197.     CY = SDA;                   //讀應答信號
  198.     SCL = 0;                    //拉低時鐘線
  199.     Delay5us();                 //延時

  200.     return CY;
  201. }

  202. /**************************************
  203. 向IIC總線發送一個字節數據
  204. **************************************/
  205. void BMP085_SendByte(BYTE dat)
  206. {
  207.     BYTE i;

  208.     for (i=0; i<8; i++)         //8位計數器
  209.     {
  210.         dat <<= 1;              //移出數據的最高位
  211.         SDA = CY;               //送數據口
  212.         SCL = 1;                //拉高時鐘線
  213.         Delay5us();             //延時
  214.         SCL = 0;                //拉低時鐘線
  215.         Delay5us();             //延時
  216.     }
  217.     BMP085_RecvACK();
  218. }

  219. /**************************************
  220. 從IIC總線接收一個字節數據
  221. **************************************/
  222. BYTE BMP085_RecvByte()
  223. {
  224.     BYTE i;
  225.     BYTE dat = 0;

  226.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  227.     for (i=0; i<8; i++)         //8位計數器
  228.     {
  229.         dat <<= 1;
  230.         SCL = 1;                //拉高時鐘線
  231.         Delay5us();             //延時
  232.         dat |= SDA;             //讀數據               
  233.         SCL = 0;                //拉低時鐘線
  234.         Delay5us();             //延時
  235.     }
  236.     return dat;
  237. }
  238. /*
  239. //單字節寫入BMP085內部數據*******************************

  240. void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
  241. {
  242.     BMP085_Start();                  //起始信號
  243.     BMP085_SendByte(SlaveAddress);   //發送設備地址+寫信號
  244.     BMP085_SendByte(REG_Address);    //內部寄存器地址
  245.     BMP085_SendByte(REG_data);       //內部寄存器數據
  246.     BMP085_Stop();                   //發送停止信號
  247. }
  248. */
  249. /*
  250. //單字節讀取BMP085內部數據********************************
  251. uchar Single_Read(uchar REG_Address)
  252. {  uchar REG_data;
  253.     BMP085_Start();                          //起始信號
  254.     BMP085_SendByte(BMP085_SlaveAddress);           //發送設備地址+寫信號
  255.     BMP085_SendByte(REG_Address);            //發送存儲單元地址        
  256.     BMP085_Start();                          //起始信號
  257.     BMP085_SendByte(BMP085_SlaveAddress+1);         //發送設備地址+讀信號
  258.     REG_data=BMP085_RecvByte();              //讀出寄存器數據
  259.         BMP085_SendACK(1);   
  260.         BMP085_Stop();                           //停止信號
  261.     return REG_data;
  262. }
  263. */
  264. //*********************************************************
  265. //讀出BMP085內部數據,連續兩個
  266. //*********************************************************
  267. short Multiple_read(uchar ST_Address)
  268. {   
  269.         uchar msb, lsb;
  270.         short _data;
  271.     BMP085_Start();                          //起始信號
  272.     BMP085_SendByte(BMP085_SlaveAddress);    //發送設備地址+寫信號
  273.     BMP085_SendByte(ST_Address);             //發送存儲單元地址
  274.     BMP085_Start();                          //起始信號
  275.     BMP085_SendByte(BMP085_SlaveAddress+1);         //發送設備地址+讀信號

  276.     msb = BMP085_RecvByte();                 //BUF[0]存儲
  277.     BMP085_SendACK(0);                       //回應ACK
  278.     lsb = BMP085_RecvByte();     
  279.         BMP085_SendACK(1);                       //最后一個數據需要回NOACK

  280.     BMP085_Stop();                           //停止信號
  281.     Delay5ms();
  282.     _data = msb << 8;
  283.         _data |= lsb;        
  284.         return _data;
  285. }
  286. //********************************************************************
  287. long bmp085ReadTemp(void)
  288. {

  289.     BMP085_Start();                  //起始信號
  290.     BMP085_SendByte(BMP085_SlaveAddress);   //發送設備地址+寫信號
  291.     BMP085_SendByte(0xF4);                  // write register address
  292.     BMP085_SendByte(0x22);               // write register data for temp
  293.     BMP085_Stop();                   //發送停止信號
  294.         delay(10);        // max time is 4.5ms
  295.         
  296.         return (long) Multiple_read(0xFa);
  297. }
  298. //*************************************************************
  299. long bmp085ReadPressure(void)
  300. {
  301.         long pressure = 0;

  302.     BMP085_Start();                   //起始信號
  303.     BMP085_SendByte(BMP085_SlaveAddress);   //發送設備地址+寫信號
  304.     BMP085_SendByte(0xF4);                  // write register address
  305.     BMP085_SendByte(0x34);                 // write register data for pressure
  306.     BMP085_Stop();                    //發送停止信號
  307.         delay(10);                              // max time is 4.5ms
  308.         
  309.         pressure = Multiple_read(0xF9);
  310.         pressure &= 0x0000FFFF;
  311.         
  312.         return pressure;        
  313.         //return (long) bmp085ReadShort(0xF6);
  314. }

  315. //**************************************************************

  316. //初始化BMP085,根據需要請參考pdf進行修改**************
  317. void Init_BMP085()
  318. {
  319.         ac1 = Multiple_read(0xAA);
  320.         ac2 = Multiple_read(0xAC);
  321.         ac3 = Multiple_read(0xAE);
  322.         ac4 = Multiple_read(0xB0);
  323.         ac5 = Multiple_read(0xB2);
  324.         ac6 = Multiple_read(0xB4);
  325.         b1 =  Multiple_read(0xB6);
  326.         b2 =  Multiple_read(0xB8);
  327.         mb =  Multiple_read(0xBA);
  328.         mc =  Multiple_read(0xBC);
  329.         md =  Multiple_read(0xBE);
  330. }
  331. //***********************************************************************
  332. void bmp085Convert()
  333. {
  334.         long ut;
  335.         long up;
  336.         long x1, x2, b5, b6, x3, b3, p;
  337.         unsigned long b4, b7;
  338.         long  temperature;
  339.         long  pressure;
  340.         
  341.         ut = bmp085ReadTemp();
  342.         ut = bmp085ReadTemp();           // 讀取溫度
  343.         up = bmp085ReadPressure();
  344.         up = bmp085ReadPressure();  // 讀取壓強
  345.         
  346.         x1 = ((long)ut - ac6) * ac5 >> 15;
  347.         x2 = ((long) mc << 11) / (x1 + md);
  348.         b5 = x1 + x2;
  349.          temperature = (b5 + 8) >> 4;

  350.          //*************

  351.          conversion(temperature);
  352.          DisplayOneChar(4,0,'T');       //溫度顯示
  353.      DisplayOneChar(5,0,':');
  354.      DisplayOneChar(7,0,bai);      
  355.      DisplayOneChar(8,0,shi);
  356.      DisplayOneChar(9,0,'.');
  357.          DisplayOneChar(10,0,ge);
  358.          DisplayOneChar(11,0,0XDF);     //溫度單位
  359.          DisplayOneChar(12,0,'C');

  360.          
  361.      //*************
  362.         
  363.         b6 = b5 - 4000;
  364. ……………………

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

所有資料51hei提供下載:
51讀氣壓計.rar (44.5 KB, 下載次數: 257)
回復

使用道具 舉報

ID:164050 發表于 2018-1-29 23:24 | 顯示全部樓層
BMP280不知為何讀不出讀數
回復

使用道具 舉報

ID:152434 發表于 2017-6-23 21:27 | 顯示全部樓層
280的怎么修改參數啊
回復

使用道具 舉報

ID:68356 發表于 2017-6-24 10:29 | 顯示全部樓層
讀取BMP085 180 280是通用的嗎?貌似寄存器地址和最后的補償計算不一樣吧
回復

使用道具 舉報

ID:217797 發表于 2017-9-29 14:23 | 顯示全部樓層
280的這程序不能用吧?
回復

使用道具 舉報

ID:68356 發表于 2017-9-30 16:04 | 顯示全部樓層
有中文的pdf資料就好了
回復

使用道具 舉報

ID:246441 發表于 2017-11-6 10:20 | 顯示全部樓層
很好,不錯.
回復

使用道具 舉報

ID:105146 發表于 2017-12-28 16:14 | 顯示全部樓層
很好啊,參考一下
回復

使用道具 舉報

ID:263693 發表于 2018-1-2 10:01 | 顯示全部樓層
看上去很強大,下載下來試下
回復

使用道具 舉報

ID:263693 發表于 2018-1-2 10:14 | 顯示全部樓層
感謝樓主無私分享
回復

使用道具 舉報

ID:263693 發表于 2018-1-2 10:22 | 顯示全部樓層

280的這個程序用不了吧
回復

使用道具 舉報

ID:165424 發表于 2018-1-12 11:53 | 顯示全部樓層
網上這個280的資源很少,樓樓在嗎,最近也在用280,樓主的程序好像是085的,移植過來不能直接用,需要改寄存器,如果我調好了也發到論壇里
回復

使用道具 舉報

ID:282606 發表于 2018-2-6 15:07 | 顯示全部樓層
有沒有這個芯片的中文PDF啊
回復

使用道具 舉報

ID:343102 發表于 2018-6-1 23:22 | 顯示全部樓層
謝謝分享,下來學習一下。
回復

使用道具 舉報

ID:8222 發表于 2019-2-20 11:20 | 顯示全部樓層
謝謝分享。這個可以用于MPD280嗎?
回復

使用道具 舉報

ID:510315 發表于 2019-4-22 13:27 | 顯示全部樓層
大神,有沒有接口電路啊,280跟51的
回復

使用道具 舉報

ID:93375 發表于 2019-9-9 17:23 | 顯示全部樓層
thank you share!
回復

使用道具 舉報

ID:472300 發表于 2020-1-8 17:05 | 顯示全部樓層
kats 發表于 2018-1-29 23:24
BMP280不知為何讀不出讀數

085不是280
回復

使用道具 舉報

ID:675863 發表于 2020-1-12 17:52 | 顯示全部樓層
很好,不錯.
回復

使用道具 舉報

ID:704106 發表于 2020-3-28 14:36 | 顯示全部樓層
是的,大家不要下了,根本用不了
回復

使用道具 舉報

ID:718594 發表于 2020-3-30 19:37 來自手機 | 顯示全部樓層
kbq1950361006 發表于 2018-1-12 11:53
網上這個280的資源很少,樓樓在嗎,最近也在用280,樓主的程序好像是085的,移植過來不能直接用,需要改寄 ...

有程序了嗎
回復

使用道具 舉報

ID:346648 發表于 2021-8-11 16:59 | 顯示全部樓層
無情啊,單純的085.
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美在线视频二区 | 国产在线二区 | 国产不卡一区 | 欧美精品在线看 | 久久99久久99精品免视看婷婷 | 国产色在线 | 91麻豆精品国产91久久久久久久久 | 亚洲a在线视频 | 一区二区在线 | 亚洲国产aⅴ精品 | 久久久久一区二区三区四区 | 欧美一区二不卡视频 | 91欧美精品成人综合在线观看 | 在线看片国产精品 | 欧美猛交 | 成人精品| 日韩在线视频一区 | 特黄级国产片 | 久久狠狠| 久久乐国产精品 | 91手机精品视频 | 欧美成人一级 | 日韩精品免费 | 色婷综合网 | 丝袜美腿一区二区三区动态图 | 亚洲欧美一区二区三区国产精品 | 国产精品视频一二三区 | 久草青青草 | 国产综合av | 波多野结衣在线观看一区二区三区 | 日日骚av| 欧美日韩国产高清视频 | 99精品国产成人一区二区 | 免费污视频 | 日本一级淫片免费啪啪3 | 久草免费在线 | 九九伊人sl水蜜桃色推荐 | 欧美一区二区三区在线观看 | 中文无吗 | 久久亚洲综合 | 午夜视频一区二区 |