基于51单片机+bmp180的数字海拔计程序

发布者:EtherealBeauty最新更新时间:2020-08-25 来源: 51hei关键字:51单片机  bmp180  数字海拔计 手机看文章 扫描二维码
随时随地手机看文章

12684液晶屏,bmp180传感器,51单片机


单片机源程序如下:

#include 

#include      //Keil library

#include    //Keil library

#include     //Keil library

#include  //Keil library

#include

#include "lcd.h"

#include "BMP180.H"

/*定义传感器内部的EEPROM存储单元里面11个值*/

#define   uchar unsigned char

#define   uint unsigned int

typedef unsigned char  BYTE;

typedef unsigned short WORD;

#define BMP085_SlaveAddress   0xee  //定义器件在IIC总线中的从地址

short ac1;

short ac2;

short ac3;

unsigned short ac4;

unsigned short ac5;

unsigned short ac6;

short b1;

short b2;

uchar idata flag;

int idata AltitudeTemp[10]={0,0,0,0,0,0,0,0,0,0};              // 海拔高度的10个临时值,取平均值

short mb;

short mc;

short md;

#define OSS 0// Oversampling Setting (note: code is not set up to use other OSS values)

uchar code PressureTitle[16]=   {"气压温度测量"};

uchar idata ShowPressure[16]=   {"高度:        米"};

uchar idata ShowTemperature[16]={"温度:       . ℃"};

uchar idata ShowAltitude[16]=   {"电压:        . V"};

uchar code HZW0[10]={"欢迎使用"};

uchar code HZW1[12]={"海拔高度计"};

uchar code Blank[16];

bit ack;

sbit DA = P2^0;

sbit CK = P2^1;

sbit CS = P2^2;

uchar TaskFlag;

//*延时us级函数

           

void Delay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

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

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

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

void Delay1ms(uint xms)

{        uint a,b;

   for(a=0;a<110;a++)

    for(b=0;b}


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();                 //延时

}


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

发送应答信号

入口参数:ack (0:ACK 1:NAK)

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

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;

}

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

向IIC总线发送一个字节数据

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

void BMP085_SendByte(BYTE dat)

{

    BYTE i;

    for (i=0; i<8; i++)         //8位计数器

    {

        dat <<= 1;              //移出数据的最高位

        SDA = CY;               //送数据口

        SCL = 1;                //拉高时钟线

        Delay5us();             //延时

        SCL = 0;                //拉低时钟线

        Delay5us();             //延时

    }

    BMP085_RecvACK();

}

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

从IIC总线接收一个字节数据

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

BYTE BMP085_RecvByte()

{

    BYTE i;

    BYTE dat = 0;

    SDA = 1;                    //使能内部上拉,准备读取数据,

    for (i=0; i<8; i++)         //8位计数器

    {

        dat <<= 1;

        SCL = 1;                //拉高时钟线

        Delay5us();             //延时

        dat |= SDA;             //读数据              

        SCL = 0;                //拉低时钟线

        Delay5us();             //延时

}

    return dat;

}

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

//读出BMP085内部数据,连续两个

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

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();                 //BUF[0]存储

    BMP085_SendACK(0);                       //回应ACK

    lsb = BMP085_RecvByte();   

    BMP085_SendACK(1);                       //最后一个数据需要回NOACK

    BMP085_Stop();                           //停止信号

    Delay5ms();

    _data = msb << 8;

    _data |= lsb;

    return _data;

}

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

long bmp085ReadTemp(void)

{

    BMP085_Start();                  //起始信号

    BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号

    BMP085_SendByte(0xF4);          // write register address

    BMP085_SendByte(0x2E);       // write register data for temp

    BMP085_Stop();                   //发送停止信号

    Delay1ms(10);// max time is 4.5ms

    return (long) Multiple_read(0xF6);

}

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

long bmp085ReadPressure(void)

{

    long pressure = 0;

    BMP085_Start();                   //起始信号

    BMP085_SendByte(BMP085_SlaveAddress);   //发送设备地址+写信号

    BMP085_SendByte(0xF4);          // write register address

    BMP085_SendByte(0x34);         // write register data for pressure

    BMP085_Stop();                    //发送停止信号

    Delay1ms(10);                      // max time is 4.5ms

    pressure = Multiple_read(0xF6);

    pressure &= 0x0000FFFF;

    return pressure;

}

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


//初始化BMP085,根据需要请参考pdf进行修改**************

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 da5615(unsigned int da)

{

  unsigned char i;

  da <<= 6;//10有效数据左对齐

  CS = 0;

  CK = 0;

  for (i=0;i<12;i++)

  {

    DA = (bit)(da & 0x8000);

    CK = 1;

[1] [2]
关键字:51单片机  bmp180  数字海拔计 引用地址:基于51单片机+bmp180的数字海拔计程序

上一篇:单片机+MAX6675热电偶(热电堆)智能体温检测系统
下一篇:超详细的单片机交通信号灯控制程序

推荐阅读最新更新时间:2024-11-07 06:44

增强型51单片机定时器2与串行通讯应用
  这里我们主要说的是波特率和定时器2的应用.   一般来说,我们串口通讯用到的都是异步串行通讯,工作的方式为方式1.   方式1即为发送一个完整的信号为10个bit.起始信号为低电平,终止信号为高电平,串口通讯的两根线在平常时候都是处于高电平状态,当一旦有数据要进行转发的时候,电平拉低,通讯芯片马上对信号进行监听.这样子就能正常收发数据了.   一般来说,我们都是采用定时器1的模式2(自动重装模式)来作为波特率发生器的,同理,定时器1的中断也就被我们遗弃了,因为为了波特率产生的时候不会受到干扰(如果定时器1有中断函数,那么处理中断函数会关闭定时器1中断,这时候波特率发生器就处于关闭状态了).根据STC给我们的文档,定时器1所具有
[单片机]
延时20ms和1s的51单片机程序举例
试分别编写延时20ms和1s的程序。设fosc=6MHz。 参考答案: yh equ 20h yl equ 21h x equ 22h start: mov a,x mov dptr,#tab movc a,@a+dptr mov yh,a mov a,x add a,#1 movc a,@a+dptr mov yl,a here: sjmp here tab: dw 1,8,27,64,125,216,343,512,729
[单片机]
51单片机程序转AVR的方法
将 C51 向 ICCAVR的转换进行一次总结 1、头文件 对C51中定义寄存器的头文件如 reg51.h at89x51.h等替换成相应的 AVR头文件 如 io8515.h io2313.h等 2、中断处理函数 在 C51 中以 interrupt 关键字来说明某一个函数为中断处理函数 在 ICCVAR 中可采用#pragma interrupt_handler预处理命令在程序开始处声明 具体用法如下: #pragma interrupt_handler 中断处理函数名 中断向量号 注意 对原 C51 源程序中的 interrupt 和 using关键字应当删除 3 、对 C51 中的 bit 和 sbit 数据类型
[单片机]
51单片机汇编中断程序
首先,介绍一下51单片机的定时计数器,51有两个定时计数器,分别为T0,T1,基本一样,;有一点不同,下面我们介绍定时计数器T0 ;了解8051的timer0中断的程序写法,用中断法产生定时 ;上面显示的是proteus仿真图,下面的是源程序 ;说明:(源程序中的中断入口地址很重要(这个是固定的),程序中断时,会在对应中断固定的 ;入口地址进入,因为规定的相隔入口间的空进有限,只能用跳转指令跳转,最终用RETI强制返回 ;这个程序把所有的中断入口地址都写上了,没有用到的,用RETI直接屏蔽) ;运行结果是使led灯明一下,暗一下。 COUNT EQU 9217;对于11.0592的晶振来说,延时10ms LED EQ
[单片机]
51单片机 ADC0804控制
现在大多单片机都带有ADC模块,对于精度要求不是很高的场合,一般都能够满足的。这里例程重在理解控制过程。 原理图: 代码如下: //头文件 #include #include //_nop_延时一个机械周期函数所在头文件 //定义宏 #define uint unsigned int #define uchar unsigned char //端口声明 sbit duanxuan=P2^6; sbit weixuan=P2^7; sbit ADC0804_WR=P3^6; //写信号输入,低电平有效 sbit ADC0804_RD=P3^7; //读
[单片机]
51单片机汇编语言(五)
定时器 计数器 功能说明: 开始时接在单片机P1端口中的P1.7亮,用定时器延时60ms后P1.6亮,如此向右移动,移到最右端P1.0亮后,又回到最左端重新开始向右移动,不断循环。 程序:DS01.ASM 01: START: MOV R0, #8 ;设右移8次 02: MOV A, #01111111B ;存入开始点亮灯位置 03: LOOP: MOV P1, A ;传送到P1并输出 04: ACALL DELAY ;调延时子程序 05: RR A
[单片机]
51单片机中XTYBE的使用及外围设备扩展地址编址的方法
XTYBE 说法一: 2楼: ABSACC.h,XBYTE的定义是这样的, #define XBYTE ((unsigned char volatile xdata *) 0),XBYTE就相当于一个指向外部数据区的无符号字符型变量的指针(的名称,且当前的指针指向外部RAM的0地址),而在C里面指针一般和数组是可以混用的。这样也就相当于存在 一个定义在外部数据存储器的数组XBYTE ,直接使用下标就可访问其中的每个单元。 【从其它嵌入式的C带来的习惯,一直使用*(unsigned char volatile xdata *)(0x2000)=0xFF这类的方式来进行对外部绝对地址的字节访问。 】 5楼: 呵呵,倒过来写都行...
[单片机]
<font color='red'>51单片机</font>中XTYBE的使用及外围设备扩展地址编址的方法
基于STC89C51单片机数字电压表设计
0 引言 数字电压表的设计和开发已有很多类型和款式,传统的数字电压表有自己的特点,它们适合在现场做手工测量,而要完成远程测量并对测量的数据做进一步处理,运用传统的数字电压表是无法完成的。为此,本文设计了基于PC通信的数字电压表,该表既可以完成测量数据的传递,又可借助PC进行测量数据的处理。所以,这种类型的数字电压表无论在功能和实际应用上,都具有传统数字电压表无法比拟的优点,这使得它的开发和应用都具有良好的前景。 1 系统构成 本系统主要由硬件和软件两部分构成,硬件主要包括数据采集电路,单片机最小数据采集系统,单片机与PC机的接口电路等。软件主要有单片机数据采集程序,单片机与上位机通信程序,以及上位机数据处理程序。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved