找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 713|回复: 0
打印 上一主题 下一主题
收起左侧

单片机BMP180气压温度检测程序 LCD1602显示

[复制链接]
跳转到指定楼层
楼主
电路连接

LCD1602:
数据端口>>>P2
RS>>>P1.2
RW>>>P1.1
EN>>>P1.3

BMP180:
SCL>>>P3.6
SDA>>>P3.7

BMP180的电源是1.8-3.6V,电压过高有可能烧坏传感器,在接5V单片机是需要注意降压使用。

由于单片机IO口电平5V,如果使用IIC推荐的4.7K上拉电阻,传感器会由于电压过高出现数据错误,读取到的气压值出现乱码,解决方法是去掉IIC上的上拉电阻。


显示效果如下:
程序:

#include  <REG52.H>         
#include  <math.h>
#include  <stdlib.h>  
#include  <stdio.h>   
#include  <INTRINS.H>

#include "1602.h"



#define   uchar unsigned char
#define   uint unsigned int        
#define   DataPort P2   
sbit          SCL=P3^6;      
sbit           SDA=P3^7;      
sbit      LCM_RS=P1^2;           
sbit      LCM_RW=P1^1;   
sbit      LCM_EN=P1^3;   

#define        BMP085_SlaveAddress   0xee                                      

#define OSS 0        
                                                           
typedef unsigned char  BYTE;
typedef unsigned short WORD;
           
uchar ge,shi,bai,qian,wan,shiwan;        
int  dis_data;                           

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(unsigned int k);
void InitLcd();                           

void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(long temp_data);

void  Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);
uchar Single_Read(uchar REG_Address);                                      
void  Multiple_Read(uchar,uchar);                                          
//------------------------------------
void Delay5us();
void Delay5ms();
void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(bit ack);
bit  BMP085_RecvACK();
void BMP085_SendByte(BYTE dat);
BYTE BMP085_RecvByte();
void BMP085_ReadPage();
void BMP085_WritePage();
//-----------------------------------

//*********************************************************
void conversion(long temp_data)  
{  

    shiwan=temp_data/100000+0x30 ;
    temp_data=temp_data%100000;  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;  
                qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;   
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;   
    ge=temp_data+0x30;         
}

/*******************************/
void delay(unsigned int k)        
{                                                
unsigned int i,j;                                
for(i=0;i<k;i++)
{                        
for(j=0;j<121;j++)                        
{;}}                                                
}
/*******************************/
void WaitForEnable(void)        
{                                       
DataPort=0xff;               
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);        
LCM_EN=0;                                
}                                       
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       
if(Attribc)WaitForEnable();        
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();        
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}                                       
/*******************************/
void WriteDataLCM(uchar dataW)
{                                       
WaitForEnable();               
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();        
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}               
/***********************************/
void InitLcd()                                
{                        
WriteCommandLCM(0x0e,1);        
WriteCommandLCM(0x3c,1);        
WriteCommandLCM(0x01,1);        
//WriteCommandLCM(0x06,1);        
//WriteCommandLCM(0x0c,1);
}                        
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                                                
Y&=1;                                                
X&=15;                                                
if(Y)X|=0x40;                                       
X|=0x80;                        
WriteCommandLCM(X,0);               
WriteDataLCM(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 BMP085_Start()
{
    SDA = 1;                  
    SCL = 1;                  
    Delay5us();               
    SDA = 0;                  
    Delay5us();               
    SCL = 0;                  
}

void BMP085_Stop()
{
    SDA = 0;                  
    SCL = 1;                  
    Delay5us();               
    SDA = 1;                  
    Delay5us();               
}

void BMP085_SendACK(bit ack)
{
    SDA = ack;                 
    SCL = 1;                  
    Delay5us();               
    SCL = 0;                  
    Delay5us();               
}

bit BMP085_RecvACK()
{
    SCL = 1;                  
    Delay5us();               
    CY = SDA;                  
    SCL = 0;                  
    Delay5us();               

    return CY;
}

void BMP085_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)        
    {
        dat <<= 1;            
        SDA = CY;              
        SCL = 1;               
        Delay5us();            
        SCL = 0;               
        Delay5us();            
    }
    BMP085_RecvACK();
}

BYTE BMP085_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;
    BMP085_Start();                          
    BMP085_SendByte(BMP085_SlaveAddress);   
    BMP085_SendByte(ST_Address);            
    BMP085_Start();                          
    BMP085_SendByte(BMP085_SlaveAddress+1);  

    msb = BMP085_RecvByte();                 
    BMP085_SendACK(0);                       
    lsb = BMP085_RecvByte();     
        BMP085_SendACK(1);                    

    BMP085_Stop();                           
    Delay5ms();
    _data = msb << 8;
        _data |= lsb;        
        return _data;
}
long bmp085ReadTemp(void)
{

    BMP085_Start();               
    BMP085_SendByte(BMP085_SlaveAddress);
    BMP085_SendByte(0xF4);            
    BMP085_SendByte(0x2E);      
    BMP085_Stop();                 
        delay(10);
        
        return (long) Multiple_read(0xF6);
}
long bmp085ReadPressure(void)
{
        long pressure = 0;

    BMP085_Start();               
    BMP085_SendByte(BMP085_SlaveAddress);
    BMP085_SendByte(0xF4);            
    BMP085_SendByte(0x34);   
    BMP085_Stop();            
        delay(10);                     
        
        pressure = Multiple_read(0xF6);
        pressure &= 0x0000FFFF;
        
        return pressure;        
}
void Init_BMP085()
{
        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 bmp085Convert()
{
        long ut;
        long up;
        long x1, x2, b5, b6, x3, b3, p;
        unsigned long b4, b7;
        long  temperature;
        long  pressure;
        
        ut = bmp085ReadTemp();
        ut = bmp085ReadTemp();           
        up = bmp085ReadPressure();
        up = bmp085ReadPressure();
        
        x1 = ((long)ut - ac6) * ac5 >> 15;
        x2 = ((long) mc << 11) / (x1 + md);
        b5 = x1 + x2;
         temperature = (b5 + 8) >> 4;

         //*************

         conversion(temperature);
         play(4,0,'T');      
         play(5,0,':');
         play(7,0,bai);      
         play(8,0,shi);
         play(9,0,'.');
         play(10,0,ge);
         play(11,0,0XDF);   
         play(12,0,'C');

         
        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 * 2) / b4 ;
           else  
                    p = (b7 / b4) * 2;
        x1 = (p >> 8) * (p >> 8);
        x1 = (x1 * 3038) >> 16;
        x2 = (-7357 * p) >> 16;
         pressure = p + ((x1 + x2 + 3791) >> 4);

         conversion(pressure);
         play(4,1,'P');   
         play(5,1,':');
         play(6,1,shiwan);
         play(7,1,wan);   
         play(8,1,qian);
         play(9,1,'.');
         play(10,1,bai);
         play(11,1,shi);
                play(12,1,ge);
         play(13,1,'K');  
         play(14,1,'p');
         play(15,1,'a');

}

void main()
{
    delay(50);                     
  init_lcd();  
//        InitLcd();               
    Init_BMP085();         
  while(1)              
  {
               
    bmp085Convert();
        delay(1000);
  }
}
1602驱动程序:
#include "1602.h"
/*
LCD1602使用延时函数
*/
void delay_lcd(uint x)
{
        uint i;
        for(i=0;i<x;i++);
}
/*
给显示屏发送控制码
*/
void sentcode(uchar cod)
{
        show=cod;
        lcdrs=0;
        lcde=1;
        delay_lcd(10);
        lcde=0;
        delay_lcd(10);
}
/*
给显示屏发送显示数据
*/
void sentdata(uchar dat)
{
        show=dat;
        lcdrs=1;
        lcde=1;
        delay_lcd(10);
        lcde=0;
        delay_lcd(10);
}                        
/*
显示屏初始化,只定不读
*/
void init_lcd(void)
{
  lcdrw=0;
        sentcode(0x0e);
        sentcode(0x3c);
        sentcode(0x01);
  delay_lcd(100);

}
/*
在a行b列显示一个字符
*/
void play(uchar a,uchar b,uchar dat)
{
        uchar dress;
        if(b)
        dress=0xc0+a;
        else
        dress=0x80+a;
        sentcode(dress);
        sentdata(dat);
}
/*
在x行y列开始显示字符串
字符串指针*p
speed:显示每一个字符后停留的时间
delay:显示完一屏后停留的时间
clear:显示完一屏后是否进行清屏操作,0为不清屏,其余为清屏
*/
void ShowStr(uchar x , uchar y , char *p , uint speed , uint delay , uchar clear)
{
  uchar dress;
  while(*p!='\0')
  {
    if(y)
    {
      dress = 0xc0+x;
      sentcode(dress);
      sentdata(*p);
      p++;
      x++;
      if((dress-0xc0)>14)
      {
        dress = 0x80+x;
        y=0;
        x=0;
        delay_lcd(delay);
        if(clear)
        {
          sentcode(LCD_CLEAR_SCREEN);
        }
      }

    }
    else
    {
      dress = 0x80+x;
      sentcode(dress);
      sentdata(*p);
      p++;
      x++;
      if((dress-0x80)>14)
      {
        dress = 0x80+x;
        y=1;
        x=0;
      }
    }
    delay_lcd(speed);
  }
}
/*
清屏操作
*/
void lcd_clear(void)
{
  sentcode(LCD_CLEAR_SCREEN);
//  sentcode(LCD_HOMING);
}
1602头文件:
#ifndef __1602_h__
#define __1602_h__

#include "reg52.h"

#define uchar unsigned char
#define uint unsigned int

#define show P2//显示数据总线
sbit lcdrs=P1^2;//控制/数据指示
sbit lcdrw=P1^1;//读/写指示
sbit lcde=P1^3;//使能


#define LCD_CLEAR_SCREEN        0x01      // 清屏
#define LCD_HOMING                  0x02      // 光标返回原点

void delay_lcd(uint x);
void sentcode(uchar cod);
void sentdata(uchar dat);
void init_lcd(void);
void play(uchar a,uchar b,uchar dat);
void ShowStr(uchar x , uchar y , char *p , uint speed , uint delay , uchar clear);
void lcd_clear(void);




#endif

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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