利用msp430g2553通过i2协议读取bmp180的测量的气压数据并通过串口在pc端显示出来,请给出具体程序及详细的注释 (程序适用于Code Composer Studio 12.3.0)

时间: 2023-06-19 16:03:22 浏览: 40
以下是一个简单的程序,用于读取BMP180的气压数据并通过UART发送到PC端。注释中会解释每个步骤的作用。 ``` #include <msp430.h> #include <stdio.h> // 定义BMP180的I2C地址 #define BMP180_ADDR 0x77 // 定义BMP180的寄存器地址 #define BMP180_CTRL_REG 0xF4 #define BMP180_TEMP_REG 0x2E #define BMP180_PRESSURE_REG 0x34 // 定义串口参数 #define BAUDRATE 9600 #define CLK_FREQ 1000000 // 初始化串口 void initUART() { P1SEL |= BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD P1SEL2 |= BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = CLK_FREQ / BAUDRATE; UCA0BR1 = 0; UCA0MCTL = UCBRS2 + UCBRS0; // Modulation UCBRSx = 5 UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine } // 向BMP180写入一个字节的数据 void writeByte(unsigned char addr, unsigned char data) { // 发送START信号 UCB0CTL1 |= UCTR + UCTXSTT; // 等待START信号发送完毕 while(!(IFG2 & UCB0TXIFG)); // 发送设备地址和寄存器地址 UCB0TXBUF = BMP180_ADDR << 1; while(!(IFG2 & UCB0TXIFG)); UCB0TXBUF = addr; while(!(IFG2 & UCB0TXIFG)); // 发送数据 UCB0TXBUF = data; while(!(IFG2 & UCB0TXIFG)); // 发送STOP信号 UCB0CTL1 |= UCTXSTP; while(UCB0CTL1 & UCTXSTP); } // 从BMP180读取一个字节的数据 unsigned char readByte(unsigned char addr) { unsigned char data; // 发送START信号 UCB0CTL1 |= UCTR + UCTXSTT; // 等待START信号发送完毕 while(!(IFG2 & UCB0TXIFG)); // 发送设备地址和寄存器地址 UCB0TXBUF = BMP180_ADDR << 1; while(!(IFG2 & UCB0TXIFG)); UCB0TXBUF = addr; while(!(IFG2 & UCB0TXIFG)); // 发送RESTART信号 UCB0CTL1 &= ~UCTR; UCB0CTL1 |= UCTXSTT; while(!(IFG2 & UCB0TXIFG)); // 发送设备地址,读取数据 UCB0TXBUF = (BMP180_ADDR << 1) | 0x01; while(!(IFG2 & UCB0TXIFG)); // 接收数据 while(!(IFG2 & UCB0RXIFG)); data = UCB0RXBUF; // 发送STOP信号 UCB0CTL1 |= UCTXSTP; while(UCB0CTL1 & UCTXSTP); return data; } // 从BMP180读取一个16位的数据 unsigned int readWord(unsigned char addr) { unsigned int data; // 发送START信号 UCB0CTL1 |= UCTR + UCTXSTT; // 等待START信号发送完毕 while(!(IFG2 & UCB0TXIFG)); // 发送设备地址和寄存器地址 UCB0TXBUF = BMP180_ADDR << 1; while(!(IFG2 & UCB0TXIFG)); UCB0TXBUF = addr; while(!(IFG2 & UCB0TXIFG)); // 发送RESTART信号 UCB0CTL1 &= ~UCTR; UCB0CTL1 |= UCTXSTT; while(!(IFG2 & UCB0TXIFG)); // 发送设备地址,读取数据 UCB0TXBUF = (BMP180_ADDR << 1) | 0x01; while(!(IFG2 & UCB0TXIFG)); // 接收数据 while(!(IFG2 & UCB0RXIFG)); data = UCB0RXBUF << 8; while(!(IFG2 & UCB0RXIFG)); data |= UCB0RXBUF; // 发送STOP信号 UCB0CTL1 |= UCTXSTP; while(UCB0CTL1 & UCTXSTP); return data; } void main(void) { WDTCTL = WDTPW + WDTHOLD; // 禁用看门狗 // 初始化I2C P1SEL |= BIT6 + BIT7; P1SEL2 |= BIT6 + BIT7; UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; UCB0CTL1 = UCSSEL_2 + UCSWRST; UCB0BR0 = 10; UCB0BR1 = 0; UCB0CTL1 &= ~UCSWRST; initUART(); // 初始化串口 // 读取BMP180的厂商ID,用于检测BMP180是否连接成功 unsigned int id = readByte(0xD0) << 8; id |= readByte(0xD1); if(id != 0x55) { // 厂商ID应为0x55 printf("BMP180 not found\r\n"); return; } // 读取BMP180的温度,并计算出实际温度值 writeByte(BMP180_CTRL_REG, BMP180_TEMP_REG); __delay_cycles(5000); // 等待BMP180完成温度测量 unsigned int ut = readWord(0xF6); long x1 = (ut - 0xAC6) * 160 / 32768; long x2 = 160 * 7 * 2048 / 16000; long b5 = x1 + x2; long t = (b5 + 8) / 16; // 读取BMP180的气压,并计算出实际气压值 writeByte(BMP180_CTRL_REG, BMP180_PRESSURE_REG + (3 << 6)); __delay_cycles(30000); // 等待BMP180完成气压测量 unsigned char msb = readByte(0xF6); unsigned char lsb = readByte(0xF7); unsigned char xlsb = readByte(0xF8); long up = ((msb << 16) + (lsb << 8) + xlsb) >> (8 - 3); long b6 = b5 - 4000; x1 = (b6 * b6) >> 12; x1 *= 16; x2 = 160 * b6 / 2048; long x3 = x1 + x2; long b3 = (((long)readWord(0xB4)) * x3 + 2) >> 2; x1 = 160 * b6 / 2048; x2 = (b6 * b6) >> 11; x2 *= 4; x3 = (x2 >> 12) * 3755; x2 = (x2 * b6) >> 12; long b4 = readWord(0xB6); long b7 = ((long)(up - b3)) * (50000 >> 3); long p; 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; p += (x1 + x2 + 3791) >> 4; printf("Temperature: %ld.%ld C\r\n", t / 10, t % 10); printf("Pressure: %ld Pa\r\n", p); } ``` 注意:这个程序只是一个示例,实际应用中需要根据具体情况进行修改。例如,需要根据实际的CLK_FREQ和BAUDRATE值来计算正确的UBR值。另外,读取BMP180的气压数据需要进行一系列复杂的计算,可能需要使用浮点数和更高精度的整数计算。

相关推荐

最新推荐

MSP430F5529_25Hz方波发生及测量实验.doc

利用msp430f5529单片机从IO口产生一个25Hz方波...2、利用MSP430内部AD测量出该方波峰值幅度并显示在OLED上。 3、通过往复按键改变所产生方波的频率为50Hz,75Hz和100Hz。 4、利用AD同时测量出其频率变化显示于OLED。

MSP430G2553寄存器资料

MSP430G2553寄存器说明,如看门狗寄存器说明、输入输出口寄存器说明、比较器寄存器说明等等

MSP430硬件I2C使用方法——以BH1710和AT24C02为例

硬件的I2C控制器终于调出来了,这些天一直在钻死胡同,其实最好的参考资料还是TI官方提供的。代码参考了MSP430的User’s Guide和Application Note,下面提供IAR工程并做简要解释。

基于MSP430G2553的电压表设计

基于MSP430G2553的电压表设计,运用片内自带的ADC,实现模数转换,测出输入电压,带有显示。本文档含有全部程序,并带有外围电路,系统的设计方案,可以让初学者走捷径,也可供高手参考,谢谢。

基于I2C接口的数据采集.doc

能够将采集到的数据通过串口上传至PC,结合上述参数能够在一定时间范围内通过MATLAB等工具还原MPU6050传感器的运动轨迹。 为电子科技大学微处理器最小系统课程实验第三个,内部已经具有完整原理、框图、代码、图片、...

数据仓库数据挖掘综述.ppt

数据仓库数据挖掘综述.ppt

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

springboot新闻信息管理系统开发技术文档更新

# 1. 系统概述 ## 1.1 项目背景 在当今信息爆炸的时代,新闻信息是人们获取信息的重要渠道之一。为了满足用户对新闻阅读的需求,我们决定开发一个新闻信息管理系统,该系统旨在提供便捷的新闻发布、浏览与管理功能,同时也要保证系统的性能和安全防护。 ## 1.2 系统目标与功能需求 系统的目标是构建一个高效、稳定、安全的新闻信息管理平台,主要包括但不限于以下功能需求: - 新闻信息的增加、修改、删除、查询 - 用户的注册、登录与权限控制 - 数据库性能优化与缓存机制实现 - 安全防护措施的设计与漏洞修复 ## 1.3 技术选型与架构设计 在系统设计中,我们选择采用Java

hive 分区字段获取10天账期数据

假设你的 Hive 表名为 `my_table`,分区字段为 `account_date`,需要获取最近 10 天的数据,可以按照以下步骤操作: 1. 首先,获取当前日期并减去 10 天,得到起始日期,比如: ``` start_date=$(date -d "10 days ago" +"%Y-%m-%d") ``` 2. 接下来,使用 Hive 查询语句从分区中筛选出符合条件的数据。查询语句如下: ``` SELECT * FROM my_table WHERE account_date >= '${start_date}' ```

生活垃圾卫生填埋场运营管理手册.pdf

生活垃圾卫生填埋场运营管理手册.pdf