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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

GY-68源碼與資料下載 BMP180 BOSCH溫度 氣壓傳感器模塊

[復制鏈接]
跳轉到指定樓層
樓主
BMP180電路原理圖如下:


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  197.     return CY;
  198. }

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

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

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

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

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

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

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

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

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

  312. //**************************************************************

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

  347.          //*************

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

  357.          
  358.      //*************
  359.        
  360.         b6 = b5 - 4000;
  361. ……………………

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

所有資料51hei提供下載:
GY-68 BMP180 新款 BOSCH溫度 代替BMP085 氣壓傳感器模塊1.rar (1023.66 KB, 下載次數: 134)


評分

參與人數 1黑幣 +6 收起 理由
lzz562 + 6 贊一個!

查看全部評分

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

使用道具 舉報

沙發
ID:565752 發表于 2019-6-18 15:25 來自手機 | 只看該作者
很不錯
回復

使用道具 舉報

板凳
ID:658240 發表于 2019-12-10 19:25 | 只看該作者

你好,為什么我的lcd顯示小方塊,沒有數據,這個需要AD轉換器麼
回復

使用道具 舉報

地板
ID:658240 發表于 2019-12-10 19:46 | 只看該作者
你好,為什么我的LCD顯示小方塊沒有數據,有電路圖嗎
回復

使用道具 舉報

5#
ID:659682 發表于 2019-12-10 20:26 來自手機 | 只看該作者
程序設計非常棒,學到了好多
回復

使用道具 舉報

6#
ID:658240 發表于 2019-12-11 16:48 | 只看該作者
aayy 發表于 2019-12-10 20:26
程序設計非常棒,學到了好多

你好,請問一下你這個顯示成功了嗎
回復

使用道具 舉報

7#
ID:325646 發表于 2020-6-16 10:44 | 只看該作者
BOSCH溫度 氣壓傳感器模塊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区中文字幕 | 国产综合视频 | 亚洲欧美日韩在线 | 国产特级毛片aaaaaa喷潮 | 亚洲一区二区三区在线视频 | 欧美aaaaa| 精品国产一区二区三区免费 | 国产高清在线观看 | 精品亚洲91| 亚洲三区在线观看 | 欧洲精品码一区二区三区免费看 | a级性视频 | 日本三级电影免费 | 激情欧美一区二区三区中文字幕 | 日韩精品成人av | 男女网站免费观看 | 丁香五月网久久综合 | 中文字幕一区二区三区四区五区 | 日韩高清中文字幕 | 一级大片网站 | av大片| 精品一二 | 天天久久| 国产精品久久久久一区二区三区 | 91在线视频播放 | 91精品久久久久 | 午夜激情免费 | 自拍偷拍第一页 | 91影片 | 涩涩视频大全 | 性生活毛片 | 国产精品久久久久久吹潮日韩动画 | 黑人精品| 亚洲瑟瑟| 久久99精品久久久久久 | 精品国产免费一区二区三区五区 | 国产成人亚洲精品 | 九九热在线观看 | 91av免费看| 亚洲精品观看 | 国产一区二区高清在线 |