找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4542|回复: 10
收起左侧

51单片机+oled显示 气压,温度,湿度(bmp180模块+DHT11)

  [复制链接]
ID:441689 发表于 2018-12-7 16:13 | 显示全部楼层 |阅读模式

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "BMP180.h"
  3. #include  <math.h>  
  4. #include  <stdlib.h>  
  5. #include  <stdio.h>  
  6. #include "intrins.h"
  7. #include "oled.h"
  8. long  temperature;    //定义温度
  9. long  pressure;       //定义气压
  10. short ac1,ac2,ac3,b1,b2,mb,mc,md;
  11. unsigned short ac4,ac5,ac6;
  12. /**************************************
  13. 延时5微秒(STC90C52RC@12M)
  14. 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
  15. 当改用1T的MCU时,请调整此延时函数
  16. **************************************/
  17. void Delay5us()
  18. {
  19.     _nop_();_nop_();_nop_();_nop_();
  20.     _nop_();_nop_();_nop_();_nop_();
  21.         _nop_();_nop_();_nop_();_nop_();
  22.         _nop_();_nop_();_nop_();_nop_();
  23. }

  24. /**************************************
  25. 延时5毫秒(STC90C52RC@12M)
  26. 不同的工作环境,需要调整此函数
  27. 当改用1T的MCU时,请调整此延时函数
  28. **************************************/
  29. void Delay5ms()
  30. {
  31.     WORD n = 560;

  32.     while (n--);
  33. }

  34. /**************************************
  35. 起始信号
  36. **************************************/
  37. void BMP180_Start()
  38. {
  39.     SDA = 1;                    //拉高数据线
  40.     SCL = 1;                    //拉高时钟线
  41.     Delay5us();                 //延时
  42.     SDA = 0;                    //产生下降沿
  43.     Delay5us();                 //延时
  44.     SCL = 0;                    //拉低时钟线
  45. }

  46. /**************************************
  47. 停止信号
  48. **************************************/
  49. void BMP180_Stop()
  50. {
  51.     SDA = 0;                    //拉低数据线
  52.     SCL = 1;                    //拉高时钟线
  53.     Delay5us();                 //延时
  54.     SDA = 1;                    //产生上升沿
  55.     Delay5us();                 //延时
  56. }

  57. /**************************************
  58. 发送应答信号
  59. 入口参数:ack (0:ACK 1:NAK)
  60. **************************************/
  61. void BMP180_SendACK(bit ack)
  62. {
  63.     SDA = ack;                  //写应答信号
  64.     SCL = 1;                    //拉高时钟线
  65.     Delay5us();                 //延时
  66.     SCL = 0;                    //拉低时钟线
  67.     Delay5us();                 //延时
  68. }

  69. /**************************************
  70. 接收应答信号
  71. **************************************/
  72. bit BMP180_RecvACK()
  73. {
  74.     SCL = 1;                    //拉高时钟线
  75.     Delay5us();                 //延时
  76.     CY = SDA;                   //读应答信号
  77.     SCL = 0;                    //拉低时钟线
  78.     Delay5us();                 //延时

  79.     return CY;
  80. }

  81. /**************************************
  82. 向IIC总线发送一个字节数据
  83. **************************************/
  84. void BMP180_SendByte(BYTE dat)
  85. {
  86.     BYTE i;

  87.     for (i=0; i<8; i++)         //8位计数器
  88.     {
  89.         dat <<= 1;              //移出数据的最高位
  90.         SDA = CY;               //送数据口
  91.         SCL = 1;                //拉高时钟线
  92.         Delay5us();             //延时
  93.         SCL = 0;                //拉低时钟线
  94.         Delay5us();             //延时
  95.     }
  96.     BMP180_RecvACK();
  97. }

  98. /**************************************
  99. 从IIC总线接收一个字节数据
  100. **************************************/
  101. BYTE BMP180_RecvByte()
  102. {
  103.     BYTE i;
  104.     BYTE dat = 0;

  105.     SDA = 1;                    //使能内部上拉,准备读取数据,
  106.     for (i=0; i<8; i++)         //8位计数器
  107.     {
  108.         dat <<= 1;
  109.         SCL = 1;                //拉高时钟线
  110.         Delay5us();             //延时
  111.         dat |= SDA;             //读数据               
  112.         SCL = 0;                //拉低时钟线
  113.         Delay5us();             //延时
  114.     }
  115.     return dat;
  116. }

  117. //*********************************************************
  118. //读出BMP085内部数据,连续两个
  119. //*********************************************************
  120. short Multiple_read(uchar ST_Address)
  121. {   
  122.     uchar msb, lsb;
  123.     short _data;
  124.     BMP180_Start();                          //起始信号
  125.     BMP180_SendByte(BMP180_SlaveAddress);    //发送设备地址+写信号
  126.     BMP180_SendByte(ST_Address);             //发送存储单元地址
  127.     BMP180_Start();                          //起始信号
  128.     BMP180_SendByte(BMP180_SlaveAddress+1);         //发送设备地址+读信号

  129.     msb = BMP180_RecvByte();                 //BUF[0]存储
  130.     BMP180_SendACK(0);                       //回应ACK
  131.     lsb = BMP180_RecvByte();     
  132.     BMP180_SendACK(1);                       //最后一个数据需要回NOACK

  133.     BMP180_Stop();                           //停止信号
  134.     Delay5ms();                  //延时5MS                                                                                                                                       
  135.     _data = msb << 8;
  136.     _data |= lsb;   
  137.     return _data;
  138. }
  139. //********************************************************************
  140. long bmp180ReadTemp(void)             //读取未校准温度数据
  141. {

  142.     BMP180_Start();                  //起始信号
  143.     BMP180_SendByte(BMP180_SlaveAddress);   //发送设备地址+写信号
  144.     BMP180_SendByte(0xF4);            // write register address
  145.     BMP180_SendByte(0x2E);          // write register data for temp
  146.     BMP180_Stop();                   //发送停止信号
  147.     Delay5ms();                      //延时5MS                    
  148.     // max time is 4.5ms
  149.     return (long) Multiple_read(0xF6);
  150. }
  151. //*************************************************************
  152. long bmp180ReadPressure(void)          //读取未校准气压数据
  153. {
  154.     long pressure = 0;
  155.     BMP180_Start();                   //起始信号
  156.     BMP180_SendByte(BMP180_SlaveAddress);   //发送设备地址+写信号
  157.     BMP180_SendByte(0xF4);            // write register address
  158.     BMP180_SendByte(0x34);            // write register data for pressure
  159.     BMP180_Stop();                    //发送停止信号
  160.     Delay5ms();                       // max time is 4.5ms
  161.      
  162.     pressure = Multiple_read(0xF6);
  163.     pressure &= 0x0000FFFF;
  164.      
  165.     return pressure;   
  166.     //return (long) bmp085ReadShort(0xF6);
  167. }
  168. //初始化BMP085,根据需要请参考pdf进行修改**************
  169. void Init_BMP180()
  170. {
  171.     ac1 = Multiple_read(0xAA);
  172.     ac2 = Multiple_read(0xAC);
  173.     ac3 = Multiple_read(0xAE);
  174.     ac4 = Multiple_read(0xB0);
  175.     ac5 = Multiple_read(0xB2);
  176.     ac6 = Multiple_read(0xB4);
  177.     b1 =  Multiple_read(0xB6);
  178.     b2 =  Multiple_read(0xB8);
  179.     mb =  Multiple_read(0xBA);
  180.     mc =  Multiple_read(0xBC);
  181.     md =  Multiple_read(0xBE);
  182. }

  183. /////***************************************气压
  184. void conversion(long temp_data)  
  185. {  
  186.     BMP_shiwan=temp_data/100000+0x30 ;
  187.     temp_data=temp_data%100000;   //取余运算
  188.     BMP_wan=temp_data/10000+0x30 ;
  189.     temp_data=temp_data%10000;   //取余运算
  190.           BMP_qian=temp_data/1000+0x30 ;
  191.     temp_data=temp_data%1000;    //取余运算
  192.     BMP_bai=temp_data/100+0x30   ;
  193.     temp_data=temp_data%100;     //取余运算
  194.     BMP_shi=temp_data/10+0x30    ;
  195.     temp_data=temp_data%10;      //取余运算
  196.     BMP_ge=temp_data+0x30;         
  197. }

  198. void bmp180Convert()
  199. {
  200.     long ut;
  201.     long up;
  202.     long x1, x2, b5, b6, x3, b3, p;
  203.     unsigned long b4, b7;
  204.    
  205.      
  206.     ut = bmp180ReadTemp();
  207.     ut = bmp180ReadTemp();     // 读取温度
  208.     up = bmp180ReadPressure();
  209.     up = bmp180ReadPressure();  // 读取压强
  210. //*************************************************************************     
  211.     x1 = ((long)ut - ac6) * ac5 >> 15;          //温度校正
  212.     x2 = ((long) mc << 11) / (x1 + md);
  213.     b5 = x1 + x2;
  214.      temperature = (b5 + 8) >> 4;
  215. ……………………

  216. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
oled显示.rar (81.32 KB, 下载次数: 206)

评分

参与人数 1黑币 +10 收起 理由
INVIO + 10 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-12-8 01:29 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:441689 发表于 2018-12-10 17:21 | 显示全部楼层
气压模块就 IIC总线+VCC+GND 没了  
回复

使用道具 举报

ID:478130 发表于 2019-2-21 17:05 | 显示全部楼层
可以发下仿真图吗
回复

使用道具 举报

ID:471632 发表于 2019-2-21 22:39 | 显示全部楼层
说一下电路图呀!
回复

使用道具 举报

ID:445069 发表于 2019-3-1 17:13 | 显示全部楼层
下载了,可是代码不全。没有dht11的代码。
楼主能重发一份完整的吗?
回复

使用道具 举报

ID:601357 发表于 2019-9-16 14:10 | 显示全部楼层
下载了但是打不开呢
回复

使用道具 举报

ID:65480 发表于 2019-9-17 21:57 | 显示全部楼层
学习一下。谢谢分享!
回复

使用道具 举报

ID:627076 发表于 2019-10-22 08:49 | 显示全部楼层
Archer串 发表于 2018-12-10 17:21
气压模块就 IIC总线+VCC+GND 没了

文件里DH11模块没有 可以麻烦发一下吗
回复

使用道具 举报

ID:306303 发表于 2020-12-17 20:22 | 显示全部楼层
向大佬低头
回复

使用道具 举报

ID:902991 发表于 2021-4-13 14:39 | 显示全部楼层
感谢分享
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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