找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1743|回复: 2
收起左侧

DHT11+BMP180测量温度、压力、湿度传感器

[复制链接]
ID:478130 发表于 2019-3-18 14:45 | 显示全部楼层 |阅读模式
#include <reg51.h>
#include <intrins.h>
#include <math.h>   
#include <stdlib.h>  
#include <stdio.h>   
long  temperature;   
long  pressure;      
#define uchar unsigned char
#define uint unsigned int
#define BMP180_SlaveAddress 0xee                              
#define OSS 0
sbit   DataPort=P0;  
sbit  SCL=P1^0;      
sbit   SDA=P1^1;      
sbit Data=P3^6;   
uchar rec_dat[9];
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit lcden=P2^7;
typedef unsigned char  BYTE;
typedef unsigned short WORD;
long  pressure;
short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;
void delay(uint n)
{  uint x,y;
   for(x=n;x>0;x--)
       for(y=110;y>0;y--);
}

void write_com(uchar com)
{
        lcdrs=0;                        
        P0=com;
        delay(5);
        lcden=1;                        
        delay(5);
        lcden=0;                       
}
void write_dat(uchar dat)
{
        lcdrs=1;                        
        P0=dat;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init_lcd()
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);         
        write_com(0x0c);         
        write_com(0x06);         
        write_com(0x01);
}
void DHT11_delay_us(uchar n)
{
    while(--n);
}
void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}
void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(30);  
   Data=1;
   DHT11_delay_us(30);
}
uchar DHT11_rec_byte()      
{
   uchar i,dat=0;
  for(i=0;i<8;i++)   
   {         
      while(!Data);   
      DHT11_delay_us(8);     
      dat<<=1;           
      if(Data==1)   
         dat+=1;
      while(Data);  
    }  
    return dat;
}
void DHT11_receive()      
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);        
        DHT11_delay_us(40);
        R_H=DHT11_rec_byte();      
        R_L=DHT11_rec_byte();   
        T_H=DHT11_rec_byte();     
        T_L=DHT11_rec_byte();   
        revise=DHT11_rec_byte();
        DHT11_delay_us(25);   
        if((R_H+R_L+T_H+T_L)==revise)      
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        }
      
        rec_dat[0]='0'+(RH/10);
        rec_dat[1]='0'+(RH%10);
        rec_dat[2]='R';
        rec_dat[3]='H';
        rec_dat[4]=' ';
        rec_dat[5]=' ';
        rec_dat[6]='0'+(TH/10);
        rec_dat[7]='0'+(TH%10);
        rec_dat[8]='C';
    }
}

                                 
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                                                
Y&=1;                                                
X&=15;                                                
if(Y)X|=0x40;                                       
X|=0x80;                        
write_com(X);               
write_dat(DData);               
}                                                
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void Delay5ms()
{
    WORD n = 560;
    while (n--);
}
void BMP180_Start()
{
    SDA = 1;                  
    SCL = 1;                  
    Delay5us();              
    SDA = 0;                  
    Delay5us();               
    SCL = 0;                  
}
void BMP180_Stop()
{
    SDA = 0;                  
    SCL = 1;                    
    Delay5us();                 
    SDA = 1;                    
    Delay5us();               
}

void BMP180_SendACK(bit ack)
{
    SDA = ack;               
    SCL = 1;            
    Delay5us();               
    SCL = 0;                    
    Delay5us();               
}
bit BMP180_RecvACK()
{
    SCL = 1;               
    Delay5us();              
    CY = SDA;               
    SCL = 0;               
    Delay5us();              
    return CY;
}
void BMP180_SendByte(BYTE dat)
{
    BYTE i;
    for (i=0; i<8; i++)         
    {
        dat <<= 1;              
        SDA = CY;               
        SCL = 1;               
        Delay5us();         
        SCL = 0;           
        Delay5us();      
    }
    BMP180_RecvACK();
}
BYTE BMP180_RecvByte()
{
    BYTE i;
    BYTE dat = 0;
    SDA = 1;                    
    for (i=0; i<8; i++)         
    {
        dat <<= 1;
        SCL = 1;              
        Delay5us();           
        dat |= SDA;                        
        SCL = 0;     
        Delay5us();         
}
    return dat;
}
short Multiple_read(uchar ST_Address)
{
    uchar msb, lsb;
    short _data;
    BMP180_Start();                        
    BMP180_SendByte(BMP180_SlaveAddress);   
    BMP180_SendByte(ST_Address);            
    BMP180_Start();                          
    BMP180_SendByte(BMP180_SlaveAddress+1);
    msb = BMP180_RecvByte();                 
    BMP180_SendACK(0);                       
    lsb = BMP180_RecvByte();   
    BMP180_SendACK(1);                       
    BMP180_Stop();                          
    Delay5ms();
    _data = msb << 8;
    _data |= lsb;
    return _data;
}
long bmp180ReadTemp(void)
{
    BMP180_Start();                 
    BMP180_SendByte(BMP180_SlaveAddress);   
    BMP180_SendByte(0xF4);         
    BMP180_SendByte(0x2E);      
    BMP180_Stop();                  
    delay(10);
    return (long) Multiple_read(0xF6);
}
long bmp180ReadPressure(void)
{
    long pressure ;
    BMP180_Start();                  
    BMP180_SendByte(BMP180_SlaveAddress);   
    BMP180_SendByte(0xF4);         
    BMP180_SendByte(0x34);         
    BMP180_Stop();                  
    delay(10);                     
    pressure = Multiple_read(0xF6);
    pressure &= 0x0000FFFF;
    return pressure;
}

void Init_BMP180()
{
    ac1 = Multiple_read(0xAA);
    ac2 = Multiple_read(0xAC);
    ac3 = Multiple_read(0xAE);
    ac4 = Multiple_read(0xB0);
    ac5 = Multiple_read(0xB2);
    ac6 = Multiple_read(0xB4);
    b1 =  Multiple_read(0xB6);
    b2 =  Multiple_read(0xB8);
    mb =  Multiple_read(0xBA);
    mc =  Multiple_read(0xBC);
    md =  Multiple_read(0xBE);
}
void bmp180Convert()
{
    long ut;
    long up;
    long x1, x2, b5, b6, x3, b3, p;
    unsigned long b4, b7;
   
     
    ut = bmp180ReadTemp();
    ut = bmp180ReadTemp();     
    up = bmp180ReadPressure();
    up = bmp180ReadPressure();
    x1 = ((long)ut - ac6) * ac5 >> 15;         
    x2 = ((long) mc << 11) / (x1 + md);
    b5 = x1 + x2;
     temperature = (b5 + 8) >> 4;
    b6 = b5 - 4000;     
    x1 = (b2 * (b6 * b6 >> 12)) >> 11;
    x2 = ac2 * b6 >> 11;
    x3 = x1 + x2;
    b3 = (((long)ac1 * 4 + x3) + 2)/4;
    x1 = ac3 * b6 >> 13;
    x2 = (b1 * (b6 * b6 >> 12)) >> 16;
    x3 = ((x1 + x2) + 2) >> 2;
    b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
    b7 = ((unsigned long) up - b3) * (50000 >> OSS);
   if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;
    x1 = (p >> 8) * (p >> 8);
    x1 = (x1 * 3038) >> 16;
    x2 = (-7357 * p) >> 16;
    pressure = 2*(p + ((x1 + x2 + 3791) >> 4));

DisplayOneChar(0,1,pressure/100000+48);  
  DisplayOneChar(1,1,pressure%100000/10000+48);
  DisplayOneChar(2,1,pressure%10000/1000+48);
  DisplayOneChar(3,1,'.');
  DisplayOneChar(4,1,pressure%1000/100+48);
  DisplayOneChar(5,1,'K');
  DisplayOneChar(6,1,'p');
}


void main()
{
   uchar i;   
   init_lcd();
   Init_BMP180();  
   while(1)
   {   
       DHT11_delay_ms(100);   
       DHT11_receive();
       write_com(0x80);
       for(i=0;i<9;i++)
       write_dat(rec_dat[i]);
     bmp180Convert();
        delay(100);
  }

   
}


评分

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

查看全部评分

回复

使用道具 举报

ID:96218 发表于 2019-7-23 22:00 | 显示全部楼层
请求版主发硬件连接图
回复

使用道具 举报

ID:658240 发表于 2019-12-10 19:47 | 显示全部楼层
bmp180怎么和单片机连接
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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