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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5351|回復: 3
打印 上一主題 下一主題
收起左側

51單片機讀取BMP280 180 280氣壓值1602顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:318730 發表于 2018-4-29 08:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機讀取BMP280 180 280氣壓值1602顯示程序

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

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

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

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

  41. void delay(unsigned int k);
  42. void InitLcd();                            //初始化lcd1602

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

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

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

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

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

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

  151.     while (n--);
  152. }

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

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

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

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

  198.     return CY;
  199. }

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

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

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

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

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

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

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

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

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

  313. //**************************************************************

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

  348.          //*************

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

  358.          
  359.      //*************
  360.         
  361.         b6 = b5 - 4000;
  362.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  363.         x2 = ac2 * b6 >> 11;
  364.         x3 = x1 + x2;
  365.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
  366.         x1 = ac3 * b6 >> 13;
  367.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  368.         x3 = ((x1 + x2) + 2) >> 2;
  369.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  370.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  371.         if( b7 < 0x80000000)
  372.              p = (b7 * 2) / b4 ;
  373.            else  
  374.                     p = (b7 / b4) * 2;
  375.         x1 = (p >> 8) * (p >> 8);
  376.         x1 = (x1 * 3038) >> 16;
  377.         x2 = (-7357 * p) >> 16;
  378.          pressure = p + ((x1 + x2 + 3791) >> 4);

  379.          conversion(pressure);
  380.      DisplayOneChar(4,1,'P');    //顯示壓強
  381.      DisplayOneChar(5,1,':');
  382.          DisplayOneChar(6,1,shiwan);
  383.          DisplayOneChar(7,1,wan);   
  384.      DisplayOneChar(8,1,qian);
  385.      DisplayOneChar(9,1,'.');
  386.      DisplayOneChar(10,1,bai);
  387.      DisplayOneChar(11,1,shi);
  388.          DisplayOneChar(12,1,'K');   //氣壓單位
  389.          DisplayOneChar(13,1,'p');
  390.          DisplayOneChar(14,1,'a');

  391. }

  392. //*********************************************************
  393. //******主程序********
  394. //*********************************************************
  395. void main()
  396. {
  397.     delay(50);                           //上電延時               
  398.     InitLcd();                     //液晶初始化
  399.     Init_BMP085();                //初始化BMP085
  400.   while(1)                         //循環
  401.   {
  402.     bmp085Convert();
  403.         delay(100);
  404.   }
  405. }
復制代碼
以上代碼Keil工程51hei附件下載:
51讀氣壓計.rar (44.5 KB, 下載次數: 121)


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

使用道具 舉報

沙發
ID:382786 發表于 2018-8-26 15:04 | 只看該作者
親,有連線嗎

回復

使用道具 舉報

板凳
ID:919104 發表于 2021-5-11 08:42 | 只看該作者
還要連線?不是吧兄弟
回復

使用道具 舉報

地板
ID:902232 發表于 2021-9-19 22:45 | 只看該作者
為啥溫度不會變化呢?而且氣壓數值也不對

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女羞羞视频在线观看 | 夜夜爽99久久国产综合精品女不卡 | 国产欧美视频一区二区 | 久久久久久久久久久成人 | av网站观看 | 成人午夜| 亚洲一区日韩 | 久久久国产一区二区三区四区小说 | 国产精品一区二区三区在线播放 | 99视频免费在线观看 | 国产精品夜夜夜一区二区三区尤 | 国产成人一区二区 | 国产成人精品999在线观看 | 久久99精品久久久久久国产越南 | 一级网站 | 黄色网址大全在线观看 | 成人福利在线 | 乳色吐息在线观看 | 欧美一级片在线观看 | 久久久久国产精品一区二区 | 一区二区三区国产好 | 久久久精品一区二区三区 | 久久91 | 一区二区国产在线观看 | 最新一级毛片 | 久久精品视频亚洲 | 999视频| 久久99精品久久久久久狂牛 | 99久久精品国产麻豆演员表 | 欧美日韩综合精品 | 日韩1区2区 | 成人亚洲片 | 亚洲成人综合在线 | 99免费精品视频 | 亚洲精视频| 蜜桃精品视频在线 | 成人精品久久日伦片大全免费 | 四虎影院在线观看免费视频 | 久久com | 国产成人一区二 | 九九久久精品 |