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

时间: 2023-06-19 07:03:22 浏览: 50
以下是一个简单的程序,用于读取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的气压数据需要进行一系列复杂的计算,可能需要使用浮点数和更高精度的整数计算。

相关推荐

最新推荐

recommend-type

MSP430G2553寄存器资料

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

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

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

基于MSP430G2553的电压表设计

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

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

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

MSP430串口调试小结

MSP430 LaunchPad是TI推出的开发板。在需要调试别的系统的目标板上的TTL串口时,可以先取下板上RXD和TXD的短路块,然后通过杜邦线进行连接其他的目标板。不过在使用中发现,外部目标板有时会出现接收数据错误的现象...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

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

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。