在測量海拔高度時,傳統(tǒng)的做法是通過測量某一高度的大氣壓力,再經(jīng)過換算才能得到高度數(shù)據(jù)。為了測量大氣壓力,就得用上氣壓傳感器,下面就來討論一下氣壓傳感器的應(yīng)用。 氣壓傳感器是壓力傳感器中的一種,它專用于測量氣體的絕對壓強。目前市場上能見到的氣壓傳感器有很多種,下面就以市場上常見的Bosch公司推出的BMP180來進行討論。BMP180不僅可以實時的測量大氣壓力,還能測量實時溫度。同時它還具有IIC總線的接口,便于單片機進行訪問。另外它的使用也很方便,不需要太多的操作就可讀取到氣壓及測量數(shù)據(jù)。 BMP180采用強大的8腳陶瓷無引線芯片承載(LCC)超薄封裝,它性能卓越,內(nèi)置有校準補償,絕對精度最低可以達到0.03hPa(0.25米),并且耗電極低,只有3μA。氣壓測量范圍從300hPa到1100hPa,換算成高度為海拔9000米到500米。下圖是其封裝外形和引腳排列。 引腳各功能如下:1腳(GND)接電源地,2腳(EOC)為完成轉(zhuǎn)換輸出,3腳(VDDA)為正電源,4腳(VDDD)為數(shù)字正電源,5腳為空,6腳(SCL)為IIC的時鐘端,7腳(SDA)為IIC的數(shù)據(jù)端,8腳(XCLR)為主清除信號輸入端,低電平有效,用來復(fù)位BMP180和初始化寄存器和控制器,在不用的情況下可以空置。 BMP180的工作電壓為1.8V~3.6V,典型工作電壓為2.5V,其與單片機相連的典型電路如下圖所示。 從上圖中可以看到,BMP180內(nèi)包含有電阻式壓力傳感器、AD轉(zhuǎn)換器和控制單元,其中控制單元包括了EEPROM和IIC接口。讀取BMP180時會直接傳送沒有經(jīng)過補償?shù)臏囟戎岛蛪毫χ。而在EEPROM中則儲存了176位單獨的校準數(shù)據(jù),這些數(shù)據(jù)將對讀取的溫度壓力值進行補償。176位的EEPROM被劃分為11個字,每個字16位,這樣就包含有11個校準系數(shù)。每個器件模塊都有自己單獨的校準系數(shù),在第一次計算溫度壓力數(shù)據(jù)之前,單片機就應(yīng)該先讀出讀出EEPROM中的這些校準數(shù)據(jù),然后再開始采集數(shù)據(jù)溫度和壓力數(shù)據(jù)。 和所有的IIC總線器件一樣,BMP180也有一個器件的固定地址,根據(jù)其數(shù)據(jù)手冊,出廠時默認BMP180的從機地址為0xEE(寫入方向),或0xEF(讀出方向)。溫度數(shù)據(jù)UT和壓力數(shù)據(jù)UP都存儲在寄存器的第0到15位之中,壓力數(shù)據(jù)UP的精度還可擴展至16~19位。
上圖中左邊是Bosch公司技術(shù)手冊上提供的讀取順序的流程圖,右邊是EEPROM中的校準數(shù)據(jù)。 從流程圖中可以看出,單片機發(fā)送開始信號啟動溫度和壓力測量,經(jīng)過一定的轉(zhuǎn)換時間(4.5ms)后,從IIC接口讀出結(jié)果。為了將溫度的單位換算成℃和將壓力的單位換算成hPa,需要用到EEPROM中的校準數(shù)據(jù)來進行補償計算,這些數(shù)據(jù)也可以從IIC接口讀出。事實上,EEPROM中的這些校準數(shù)據(jù)應(yīng)該在程序初始化的時候就讀出,以方便后面的計算。 在同一個采樣周期中BMP180可以采128次壓力值和1次溫度值,并且這些值在讀取后會被及時更新掉。若不想等待到最大轉(zhuǎn)化時間之后才讀取數(shù)據(jù),可以有效利用BMP180的輸出管腳EOC來檢查轉(zhuǎn)化是否完畢。若為1表示轉(zhuǎn)換完成,為0表示轉(zhuǎn)換正在進行中。 要得到溫度或氣壓的值,必須要訪問地址為0xF4的控制寄存器。它根據(jù)寫入數(shù)據(jù)的不同,回應(yīng)的值也不一樣,具體如下表所示。 從圖中可以看出,要獲得溫度數(shù)據(jù),必須先向控制寄存器(地址0xF4)寫0x2E,然后等待至少4.5ms,才可以從地址0xF6和0xF7讀取十六位的溫度數(shù)據(jù)。同樣,要獲得氣壓數(shù)據(jù),必須先向控制寄存器(地址0xF4)寫0x34,然后等待至少4.5ms,才可以從地址0xF6和0xF7讀取16位的氣壓數(shù)據(jù),若要擴展分辨率,還可繼續(xù)讀取0xF8(XLSB)擴展16位數(shù)據(jù)到19位。獲取到的數(shù)據(jù)還要根據(jù)EEPROM中的校準數(shù)據(jù)來進行補償后才能用,EEPROM的數(shù)據(jù)讀取可根據(jù)上圖中的地址來進行,地址從0xAA~0xBF,具體的補償算法可參看官方的數(shù)據(jù)手冊,這里就不贅述了。 下面以一個例子來看一下BMP180的具體應(yīng)用。 例子:利用單片機讀取來自BMP180的溫度和氣壓數(shù)據(jù),并把它們通過LCD1602顯示出來。 BMP180的SDA、SCL端分別接到ATMega16的TWI端(PC1、PC0),EOC和XCLR端懸空,LCD1602的接法與前面的一致。參考代碼如下。 - #include <iom16.h>
- //=========================定義從器件地址和讀寫方式=============================
- #define rd_device_add 0xef //即11101111,1110111是BMP180器件的固定地址,最后的1表示對從器件進行讀操作
- #define wr_device_add 0xee //即11101110,1110111是BMP180器件的固定地址,最后的0表示對從器件時行寫操作
- //===============================TWI狀態(tài)定義==================================
- #define START 0x08
- #define RE_START 0x10
- #define MT_SLA_ACK 0x18
- #define MT_SLA_NOACK 0x20
- #define MT_DATA_ACK 0x28
- #define MT_DATA_NOACK 0x30
- #define MR_SLA_ACK 0x40
- #define MR_SLA_NOACK 0x48
- #define MR_DATA_ACK 0x50
- #define MR_DATA_NOACK 0x58
- //=============================常用TWI操作定義================================
- #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
- #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
- #define Wait() {while(!(TWCR&(1<<TWINT)));}
- #define TestAck() (TWSR&0xf8)
- #define SetAck() (TWCR|=(1<<TWEA))
- #define SetNoAck() (TWCR&=~(1<<TWEA))
- #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
- #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
- //============引腳電平的宏定義===============
- #define LCM_RS_1 PORTB_Bit0=1 //RS腳輸出高電平
- #define LCM_RS_0 PORTB_Bit0=0 //RS腳輸出低電平
- #define LCM_RW_1 PORTB_Bit1=1 //RW腳輸出高電平
- #define LCM_RW_0 PORTB_Bit1=0 //RW腳輸出低電平
- #define LCM_EN_1 PORTB_Bit2=1 //EN腳輸出高電平
- #define LCM_EN_0 PORTB_Bit2=0 //EN腳輸出低電平
- #define DataPort PORTA //PORTA為數(shù)據(jù)端口
- #define Busy 0x80 //忙信號
- //==============定義全局變量================
- unsigned char ge,shi,bai,qian,wan,shiwan; //顯示變量
- unsigned char ReadTemp[2]; //接收到的溫度數(shù)據(jù)緩沖區(qū)
- unsigned char ReadPressure[2]; //接收到的氣壓數(shù)據(jù)緩沖區(qū)
- int ac1;
- int ac2;
- int ac3;
- unsigned int ac4;
- unsigned int ac5;
- unsigned int ac6;
- int b1;
- int b2;
- int mb;
- int mc;
- int md;
- //==============定義顯示字符串================
- const unsigned char str0[]={" T: . C "}; //顯示溫度
- const unsigned char str1[]={" P: . Kpa "}; //顯示氣壓
- //===============1mS延時===================
- void delay_1ms(void)
- {
- unsigned int i;
- for(i=1;i<(unsigned int)(8*143-2);i++)
- ;
- }
- //=============n*1mS延時===============
- void delay_nms(unsigned int n)
- {
- unsigned int i=0;
- while(i<n)
- {delay_1ms();
- i++;
- }
- }
- //===============IIC總線寫n個字節(jié)(成功返回0,失敗返回1)=====================
- unsigned char I2C_Write(unsigned char RomAddress,unsigned char *buf,unsigned char len)
- {
- unsigned char i;
- Start(); //啟動I2C總線
- Wait(); //等待回應(yīng)
- if(TestAck()!=START)
- return 1; //若回應(yīng)的不是啟動信號,則失敗返回1
- Write8Bit(wr_device_add); //寫I2C從器件地址、寫方向
- Wait(); //等待回應(yīng)
- if(TestAck()!=MT_SLA_ACK)
- return 1; //若回應(yīng)的不是ACK信號,則失敗返回值1
- Write8Bit(RomAddress); //寫B(tài)MP180的ROM地址
- Wait(); //等待回應(yīng)
- if(TestAck()!=MT_DATA_ACK)
- return 1; //若回應(yīng)的不是ACK信號則失敗返回值1
- for(i=0;i<len;i++)
- {
- Write8Bit(buf[i]); //寫數(shù)據(jù)到BMP180的ROM中
- Wait(); //等待回應(yīng)
- if(TestAck()!=MT_DATA_ACK)
- {return 1;} //若回應(yīng)的不是ACK信號則失敗返回值1
- delay_nms(10);
- }
- Stop(); //停止I2C總線
- delay_nms(10); //延時等待BMP180寫完
- return 0; //寫入成功,返回值0
- }
- //====================IIC總線讀n個字節(jié)(成功返回0,失敗返回1)=========================
- unsigned char I2C_Read(unsigned char RomAddress,unsigned char *buf,unsigned char len)
- {
- unsigned char i;
- Start(); //啟動I2C總線
- Wait(); //等待回應(yīng)
- if(TestAck()!=START)
- return 1; //若回應(yīng)的不是啟動信號,則失敗返回1
- Write8Bit(wr_device_add); //寫I2C從器件地址、寫方向
- Wait(); //等待回應(yīng)
- if(TestAck()!=MT_SLA_ACK)
- return 1; //若回應(yīng)的不是ACK信號,則失敗返回值1
- Write8Bit(RomAddress); //寫B(tài)MP180的ROM地址
- Wait(); //等待回應(yīng)
- if(TestAck()!=MT_DATA_ACK)
- return 1; //若回應(yīng)的不是ACK信號,則失敗返回值1
- Start(); //重新啟動I2C總線
- Wait(); //等待回應(yīng)
- if(TestAck()!=RE_START)
- return 1; //若回應(yīng)的不是重復(fù)啟動信號,則失敗返回1
- Write8Bit(rd_device_add); //寫I2C從器件地址、讀方向
- Wait(); //等待回應(yīng)
- if(TestAck()!=MR_SLA_ACK)
- return 1; //若回應(yīng)的不是ACK信號,則失敗返回值1
- for(i=0;i<len;i++)
- {
- Twi(); //啟動I2C讀方式
- SetAck(); //設(shè)置接收自動應(yīng)答
- delay_nms(10);
- Wait(); //等待回應(yīng)
- delay_nms(10);
- *(buf+i)=TWDR; //把連續(xù)讀取的len個字節(jié)數(shù)據(jù)依次存入對應(yīng)的地址單元(數(shù)組)中
- }
- SetNoAck(); //讀數(shù)據(jù)的最后一位后緊跟的是無應(yīng)答
- delay_nms(10);
- Stop(); //停止I2C總線
- return 0; //成功返回值0
- }
- //================檢測LCD忙信號子函數(shù)================
- void WaitForEnable(void)
- {
- unsigned char val;
- DataPort=0xff; //數(shù)據(jù)線電平拉高
- LCM_RS_0; //選擇指令寄存器
- LCM_RW_1; //選擇寫方式
- __asm("NOP"); //調(diào)用匯編指令延時一個空指令周期,等待穩(wěn)定
- LCM_EN_1; //使能端拉高電平
- __asm("NOP");
- __asm("NOP"); //調(diào)用匯編指令延時兩個空指令周期,等待穩(wěn)定
- DDRA=0x00; //改變數(shù)據(jù)線方向成輸入
- val=PINA; //讀取數(shù)據(jù)
- while(val&Busy)
- val=PINA; //當(dāng)DB7位為1時表示忙,循環(huán)檢測
- LCM_EN_0; //忙信號結(jié)束,拉低使能端電平
- DDRA=0xff; //改變數(shù)據(jù)線方向成輸出
- }
- //================寫數(shù)據(jù)到LCD子函數(shù)=================
- void LcdWriteData(unsigned char dataW) //寫數(shù)據(jù)dataW到LCD中
- {
- WaitForEnable(); //檢測忙信號
- LCM_RS_1; //選擇數(shù)據(jù)寄存器
- LCM_RW_0; //選擇讀方式
- __asm("NOP"); //調(diào)用匯編指令延時一個空指令周期,等待穩(wěn)定
- DataPort=dataW; //把顯示數(shù)據(jù)送到數(shù)據(jù)線上
- __asm("NOP"); //調(diào)用匯編指令延時一個空指令周期,等待穩(wěn)定
- LCM_EN_1; //使能端拉高電平
- __asm("NOP");
- __asm("NOP"); //調(diào)用匯編指令延時兩個空指令周期,等待穩(wěn)定
- LCM_EN_0; //拉低使能端,執(zhí)行寫入動作
- }
- //================寫命令到LCD子函數(shù)================
- void LcdWriteCommand(unsigned char CMD,unsigned char Attribc) //寫命令CMD到LCD中,Arribc為1時檢測忙信號,否則不檢測
- {
- if(Attribc)
- WaitForEnable(); //檢測忙信號
- LCM_RS_0; //選擇指令寄存器
- LCM_RW_0; //選擇寫方式
- __asm("NOP"); //調(diào)用匯編指令延時一個空指令周期,等待穩(wěn)定
- DataPort=CMD; //把命令數(shù)據(jù)送到數(shù)據(jù)線上
- __asm("NOP"); //調(diào)用匯編指令延時一個空指令周期,等待穩(wěn)定
- LCM_EN_1; //使能端拉高電平
- __asm("NOP");
- __asm("NOP"); //調(diào)用匯編指令延時兩個空指令周期,等待穩(wěn)定
- LCM_EN_0; //拉低使能端,執(zhí)行寫入動作
- }
- //================顯示光標定位子函數(shù)================
- void LocateXY(char posx,char posy) //定位位置到地址x列y行
- {
- unsigned char temp;
- temp=posx&0x0f; //屏蔽高4位,限定x坐標的范圍為0~15
- posy&=0x01; //屏蔽高7位,限定y坐標的范圍為0~1
- if(posy)
- temp|=0x40; //若要顯示的是第二行,則地址碼+0x40,因為第二行起始地址為0x40
- temp|=0x80; //指令碼為地址碼+0x80,因為寫DDRAM時DB7恒為1(即0x80)
- LcdWriteCommand(temp,1); //把temp寫入LCD中,檢測忙信號
- }
- //===========顯示指定座標的一個字符子函數(shù)============
- void DisplayOneChar(unsigned char x,unsigned char y,unsigned char Wdata) //在x列y行處顯示變量Wdata中的一個字符
- {
- LocateXY(x,y); //定位要顯示的位置
- LcdWriteData(Wdata); //將要顯示的數(shù)據(jù)Wdata寫入LCD
- }
- //==========顯示指定座標的一串字符子函數(shù)===========
- void ePutstr(unsigned char x,unsigned char y,unsigned char const *ptr) //在x列y行處顯示ptr指向的字符串
- {
- unsigned char i,j=0;
- while(ptr[j]>31)
- j++; //ptr[j]>31時為ASCII碼,j累加,計算出字符串長度
- for(i=0;i<j;i++)
- {
- DisplayOneChar(x++,y,ptr[i]); //顯示單個字符,同時x坐標遞增
- if(x==16)
- {
- x=0;
- y^=1; //當(dāng)每行顯示超過16個字符時換行繼續(xù)顯示
- }
- }
- }
- //==================LCD初始化子函數(shù)==================
- void InitLcd(void)
- {
- LcdWriteCommand(0x38,0); //8位數(shù)據(jù)方式,雙行顯示,5X7字形,不檢測忙信號
- delay_nms(5); //延時5ms
- LcdWriteCommand(0x38,0);
- delay_nms(5);
- LcdWriteCommand(0x38,0);
- delay_nms(5); //重復(fù)三次
- LcdWriteCommand(0x38,1); //8位數(shù)據(jù)方式,雙行顯示,5X7字形,檢測忙信號
- LcdWriteCommand(0x08,1); //關(guān)閉顯示,檢測忙信號
- LcdWriteCommand(0x01,1); //清屏,檢測忙信號
- LcdWriteCommand(0x06,1); //顯示光標右移設(shè)置,檢測忙信號
- LcdWriteCommand(0x0C,1); //打開顯示,光標不顯示,不閃爍,檢測忙信號
- }
- //==================轉(zhuǎn)換子函數(shù)====================
- 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;
- }
- //===================BMP180讀溫度=====================
- void BMP180ReadTemp(void)
- {
- unsigned char t=0x2e;
- I2C_Write(0xf4,&t,1); //向地址0xf4寫0x2e,進行溫度轉(zhuǎn)換
- delay_nms(5); //延時大于4.5ms
- I2C_Read(0xf6,ReadTemp,2); //從地址0xf6開始讀出溫度數(shù)據(jù)并存到數(shù)組ReadTemp中,共2個字節(jié)
- }
- //===================BMP180讀氣壓=====================
- void BMP180ReadPressure(void)
- {
- unsigned char t=0x34;
- I2C_Write(0xf4,&t,1); //向地址0xf4寫0x34,進行第一次氣壓轉(zhuǎn)換
- delay_nms(5); //延時大于4.5ms
- I2C_Read(0xf6,ReadPressure,2); //從地址0xf6開始讀出氣壓數(shù)據(jù)并存到數(shù)組ReadPressure中,共2個字節(jié)
- }
- //==================初始化BMP180====================
- void Init_BMP180(void)
- {
- unsigned char temp[2];
- I2C_Read(0xaa,temp,2);
- ac1 = (temp[0]<<8)|temp[1];
- I2C_Read(0xac,temp,2);
- ac2 = (temp[0]<<8)|temp[1];
- I2C_Read(0xae,temp,2);
- ac3 = (temp[0]<<8)|temp[1];
- I2C_Read(0xb0,temp,2);
- ac4 = (temp[0]<<8)|temp[1];
- I2C_Read(0xb2,temp,2);
- ac5 = (temp[0]<<8)|temp[1];
- I2C_Read(0xb4,temp,2);
- ac6 = (temp[0]<<8)|temp[1];
- I2C_Read(0xb6,temp,2);
- b1 = (temp[0]<<8)|temp[1];
- I2C_Read(0xb8,temp,2);
- b2 = (temp[0]<<8)|temp[1];
- I2C_Read(0xba,temp,2);
- mb = (temp[0]<<8)|temp[1];
- I2C_Read(0xbc,temp,2);
- mc = (temp[0]<<8)|temp[1];
- I2C_Read(0xbe,temp,2);
- md = (temp[0]<<8)|temp[1]; //連續(xù)讀取EEPROM中的校準數(shù)據(jù),并存放到相應(yīng)的變量中,以供后面補償使用
- }
- //===================轉(zhuǎn)換子函數(shù)=====================
- void BMP180Convert()
- {
- long ut,up,temperature,pressure; //定義長整型變量
- long x1, x2, b5, b6, x3, b3, p;
- unsigned long b4, b7; //定義無符號長整型變量
- BMP180ReadTemp(); //讀取溫度
- ut=ReadTemp[0]<<8|ReadTemp[1]; //合成溫度數(shù)據(jù)
- x1=((long)ut-ac6)*ac5>>15; //以下根據(jù)EEPROM中的值對獲取的溫度數(shù)據(jù)的進行補償換算
- x2=((long)mc<<11)/(x1+md);
- b5=x1+x2;
- temperature=(b5+8)>>4;
- conversion(temperature); //調(diào)用溫度顯示轉(zhuǎn)換函數(shù)
- DisplayOneChar(5,0,bai); //顯示溫度十位
- DisplayOneChar(6,0,shi); //顯示溫度個位
- DisplayOneChar(8,0,ge); //顯示溫度小數(shù)后一位
- BMP180ReadPressure(); //讀取氣壓
- up=ReadPressure[0]<<8|ReadPressure[1]; //合成氣壓數(shù)據(jù)
- up&=0x0000FFFF;
- b6=b5-4000; //以下根據(jù)EEPROM中的值對獲取的氣壓數(shù)據(jù)的進行補償換算
- 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>>0);
- 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); //調(diào)用氣壓顯示轉(zhuǎn)換函數(shù)
- DisplayOneChar(4,1,shiwan); //顯示氣壓的百位
- DisplayOneChar(5,1,wan); //顯示氣壓的十位
- DisplayOneChar(6,1,qian); //顯示氣壓的個位
- DisplayOneChar(8,1,bai); //顯示氣壓小數(shù)后一位
- DisplayOneChar(9,1,shi); //顯示氣壓小數(shù)后二位
- }
- //==================主函數(shù)=====================
- void main(void)
- {
- delay_nms(400); //延時400ms等待電源穩(wěn)定
- DDRA=0xff;PORTA=0x00;
- DDRB=0xff;PORTB=0x00;
- DDRC=0xff;PORTC=0xff;
- DDRD=0xff;PORTD=0xff; //初始化I/O口
- InitLcd(); //LCD初始化
- Init_BMP180(); //BMP180初始化
- ePutstr(0,0,str0); //顯示溫度
- delay_nms(10);
- DisplayOneChar(10,0,0xdf); //顯示特殊符號
- delay_nms(10);
- ePutstr(0,1,str1); //顯示氣壓
- while(1)
- {
- BMP180Convert(); //調(diào)用轉(zhuǎn)換
- delay_nms(1000);
- }
- }
復(fù)制代碼 上述程序中,是運用延時來等待數(shù)據(jù)轉(zhuǎn)換完成的,并沒使用EOC腳來檢查轉(zhuǎn)化是否完畢。同時,程序利用EEPROM中的值對獲取的數(shù)據(jù)進行補償換算的方法是直接來自BMP180的數(shù)據(jù)手冊,若對換算代碼有問題可參看其手冊。氣壓數(shù)據(jù)采用了常規(guī)的16位數(shù)據(jù),并沒有擴展到19位。另外,由于在程序中大量使用了長整型數(shù)據(jù)格式,所以在IAR開發(fā)環(huán)境中編譯時仍然要把編譯優(yōu)化選項改成Low或Medium(具體參見第一章),系統(tǒng)才能正常運行。若選擇不優(yōu)化(None)時,可能在液晶屏得不到任何顯示。究其原因可能與IAR的編譯環(huán)境有關(guān),這一點要非常注意!
把程序下載到單片機中,按要求接好連線,給系統(tǒng)上電,就可以在液晶屏上看到實時的溫度和氣壓數(shù)據(jù)了
以上的Word格式文檔51黑下載地址:
BMP180中文資料.doc
(166.5 KB, 下載次數(shù): 59)
2020-4-23 13:49 上傳
點擊文件名下載附件
|