51單片機串口輸出BMP085程序源碼

上傳人:一*** 文檔編號:50936358 上傳時間:2022-01-24 格式:DOC 頁數(shù):9 大?。?1.88KB
收藏 版權申訴 舉報 下載
51單片機串口輸出BMP085程序源碼_第1頁
第1頁 / 共9頁
51單片機串口輸出BMP085程序源碼_第2頁
第2頁 / 共9頁
51單片機串口輸出BMP085程序源碼_第3頁
第3頁 / 共9頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《51單片機串口輸出BMP085程序源碼》由會員分享,可在線閱讀,更多相關《51單片機串口輸出BMP085程序源碼(9頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、//*************************************** // BMP085 IIC2aê?3ìDò // ê1ó?μ¥???úSTC89C51 // ?§??£o11.0592M // ??ê?£oμ???′??ú?úê? // ±àò??·?3 Keil uVision2 // 2???oê?§í???24c04í¨D?3ìDò // ê±??£o2012?ê5??1è? // QQ£o531389319 //**************************************** #include #inclu

2、de //Keil library #include //Keil library #include //Keil library #include //Keil library #define uchar unsigned char #define uint unsigned int #define DataPort P0 //LCD1602êy?Y???ú sbit SCL=P1^0; //IICê±?óòy???¨ò? sbit S

3、DA=P1^1; //IICêy?Yòy???¨ò? #define BMP085_SlaveAddress 0xee //?¨ò??÷?t?úIIC×ü???Dμ?′óμ??· #define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values) typedef unsigned char BYTE; typedef unsigned short WORD; uchar ge,shi,bai,qian,wan,shiwan;

4、 //??ê?±?á? 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; int temperature; long pressure; void delay(unsigned int k); //void I

5、nitLcd(); //3?ê??ˉlcd1602 //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

6、); //μ¥??D′è?êy?Y uchar Single_Read(uchar REG_Address); //μ¥???áè??ú2???′??÷êy?Y void Multiple_Read(uchar,uchar); //á?D?μ??áè??ú2???′??÷êy?Y //------------------------------------ void Delay5us(); void Delay5ms();

7、 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(); //----------------------------------- //********************************************* //′?

8、?ú3?ê??ˉ //9600 bps @ 11.059 MHz void init_uart() { TMOD=0x21; TH1=0xfd; TL1=0xfd; SCON=0x50; PS=1; //′??ú?D??éè?a??ó??è??±e TR0=1; //???ˉ?¨ê±?÷ TR1=1; ET0=1; //′ò?a?¨ê±?÷0?D?? ES=1; EA=1; } //*********′??úêy?Y·¢?í****************** void SeriPushSend(uchar send_data)

9、{ SBUF=send_data; while(!TI);TI=0; } //********************************************************* 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_dat

10、a/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,

11、j; for(i=0;i

12、d Delay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } /************************************** ?óê±5oá??(STC90C52RC@12M) 2?í?μ?

13、1¤×÷?·?3,Dèòaμ÷??′?oˉêy μ±??ó?1Tμ?MCUê±,??μ÷??′??óê±oˉêy **************************************/ void Delay5ms() { WORD n = 560; while (n--); } /************************************** ?eê?D?o? **************************************/ void BMP085_Start() { SDA = 1;

14、//à-??êy?Y?? SCL = 1; //à-??ê±?ó?? Delay5us(); //?óê± SDA = 0; //2úéú???μ?? Delay5us(); //?óê± SCL = 0; //à-μíê±?ó?? } /************************************** í£?1D?o? ********************************

15、******/ void BMP085_Stop() { SDA = 0; //à-μíêy?Y?? SCL = 1; //à-??ê±?ó?? Delay5us(); //?óê± SDA = 1; //2úéúé?éy?? Delay5us(); //?óê± } /************************************** ·¢?íó|′eD?o? è??ú2?êy:a

16、ck (0:ACK 1:NAK) **************************************/ void BMP085_SendACK(bit ack) { SDA = ack; //D′ó|′eD?o? SCL = 1; //à-??ê±?ó?? Delay5us(); //?óê± SCL = 0; //à-μíê±?ó?? Delay5us(); //?óê± } /****

17、********************************** ?óê?ó|′eD?o? **************************************/ bit BMP085_RecvACK() { SCL = 1; //à-??ê±?ó?? Delay5us(); //?óê± CY = SDA; //?áó|′eD?o? SCL = 0; //à-μíê±?ó?? Delay5us();

18、 //?óê± return CY; } /************************************** ?òIIC×ü??·¢?íò???×??úêy?Y **************************************/ void BMP085_SendByte(BYTE dat) { BYTE i; for (i=0; i<8; i++) //8????êy?÷ { dat <<= 1; //ò?3?êy?Yμ?×????? SDA = CY;

19、//?íêy?Y?ú SCL = 1; //à-??ê±?ó?? Delay5us(); //?óê± SCL = 0; //à-μíê±?ó?? Delay5us(); //?óê± } BMP085_RecvACK(); } /************************************** ′óIIC×ü???óê?ò???×??úêy?Y **************************************/ BYTE BMP085_

20、RecvByte() { BYTE i; BYTE dat = 0; SDA = 1; //ê1?ü?ú2?é?à-,×?±??áè?êy?Y, for (i=0; i<8; i++) //8????êy?÷ { dat <<= 1; SCL = 1; //à-??ê±?ó?? Delay5us(); //?óê± dat |= SDA; //?áêy?Y SCL = 0; //à-μíê±?ó?? Del

21、ay5us(); //?óê± } return dat; } /* //μ¥×??úD′è?BMP085?ú2?êy?Y******************************* void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data) { BMP085_Start(); //?eê?D?o? BMP085_SendByte(SlaveAddress); //·¢?íéè±?μ??·+D′D?o? BMP085_Send

22、Byte(REG_Address); //?ú2???′??÷μ??· BMP085_SendByte(REG_data); //?ú2???′??÷êy?Y BMP085_Stop(); //·¢?íí£?1D?o? } */ /* //μ¥×??ú?áè?BMP085?ú2?êy?Y******************************** uchar Single_Read(uchar REG_Address) { uchar REG_data; BMP085_Start();

23、 //?eê?D?o? BMP085_SendByte(BMP085_SlaveAddress); //·¢?íéè±?μ??·+D′D?o? BMP085_SendByte(REG_Address); //·¢?í′?′¢μ¥?aμ??· BMP085_Start(); //?eê?D?o? BMP085_SendByte(BMP085_SlaveAddress+1); //·¢?íéè±?μ??·+?áD?o? REG_data=BMP085_RecvBy

24、te(); //?á3???′??÷êy?Y BMP085_SendACK(1); BMP085_Stop(); //í£?1D?o? return REG_data; } */ //********************************************************* //?á3?BMP085?ú2?êy?Y,á?D?á??? //********************************************************* short Multip

25、le_read(uchar ST_Address) { uchar msb, lsb; short _data; BMP085_Start(); //?eê?D?o? BMP085_SendByte(BMP085_SlaveAddress); //·¢?íéè±?μ??·+D′D?o? BMP085_SendByte(ST_Address); //·¢?í′?′¢μ¥?aμ??· BMP085_Start(); //?eê?D?o? BMP085_S

26、endByte(BMP085_SlaveAddress+1); //·¢?íéè±?μ??·+?áD?o? msb = BMP085_RecvByte(); //BUF[0]′?′¢ BMP085_SendACK(0); //??ó|ACK lsb = BMP085_RecvByte(); BMP085_SendACK(1); //×?oóò???êy?YDèòa??NOACK BMP085_Stop();

27、 //í£?1D?o? Delay5ms(); _data = msb << 8; _data |= lsb; return _data; } //******************************************************************** long bmp085ReadTemp(void) { BMP085_Start(); //?eê?D?o? BMP085_SendByte(BMP085_SlaveAddress); //·¢?íéè±?μ??·+D′D?o? BM

28、P085_SendByte(0xF4); // write register address BMP085_SendByte(0x2E); // write register data for temp BMP085_Stop(); //·¢?íí£?1D?o? delay(10); // max time is 4.5ms return (long) Multiple_read(0xF6); } //****************************************************

29、********* long bmp085ReadPressure(void) { long pressure = 0; BMP085_Start(); //?eê?D?o? BMP085_SendByte(BMP085_SlaveAddress); //·¢?íéè±?μ??·+D′D?o? BMP085_SendByte(0xF4); // write register address BMP085_SendByte(0x34); // write register data for press

30、ure BMP085_Stop(); //·¢?íí£?1D?o? delay(20); // max time is 4.5ms pressure = Multiple_read(0xF6); pressure &= 0x0000FFFF; return pressure; //return (long) bmp085ReadShort(0xF6); } //*************************************************************

31、* //3?ê??ˉBMP085£??ù?YDèòa??2???pdf??DDDT??************** 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

32、(0xB8); mb = Multiple_read(0xBA); mc = Multiple_read(0xBC); md = Multiple_read(0xBE); } //*********************************************************************** void bmp085Convert() { unsigned int ut; unsigned long up; long x1, x2, b5, b6, x3, b3, p; unsigned long b4, b7; ut = bmp0

33、85ReadTemp(); // ?áè????è // ut = bmp085ReadTemp(); // ?áè????è up = bmp085ReadPressure(); // ?áè??1?? // up = bmp085ReadPressure(); // ?áè??1?? x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15; x2 = ((long) mc << 11) / (x1 + md); b5 = x1 + x2; temperature = ((b5 + 8) >> 4); //*******

34、****** b6 = b5 - 4000; // Calculate B3 x1 = (b2 * (b6 * b6)>>12)>>11; x2 = (ac2 * b6)>>11; x3 = x1 + x2; b3 = (((((long)ac1)*4 + x3)<>2; // Calculate B4 x1 = (ac3 * b6)>>13; x2 = (b1 * ((b6 * b6)>>12))>>16; x3 = ((x1 + x2) + 2)>>2; b4 = (ac4 * (unsigned long)(x3 + 32768))

35、>>15; b7 = ((unsigned long)(up - b3) * (50000>>OSS)); if (b7 < 0x80000000) p = (b7<<1)/b4; else p = (b7/b4)<<1; x1 = (p>>8) * (p>>8); x1 = (x1 * 3038)>>16; x2 = (-7357 * p)>>16; pressure = p+((x1 + x2 + 3791)>>4); } //********************************************************* //**

36、****?÷3ìDò******** //********************************************************* void main() { delay(100); //é?μ??óê± init_uart(); Init_BMP085(); //3?ê??ˉBMP085 while(1) //?-?· { Init_BMP085(); bmp085Convert(); conversion(tempe

37、rature); SeriPushSend('T'); //???è??ê? SeriPushSend(':'); SeriPushSend(bai); SeriPushSend(shi); SeriPushSend('.'); SeriPushSend(ge); SeriPushSend(' '); SeriPushSend(' '); conversion(pressure); SeriPushSend('P'); //??ê??1?? SeriPushSend(':'); SeriPushSend(shiwan); SeriPushSend(wan); SeriPushSend(qian); SeriPushSend('.'); SeriPushSend(bai); SeriPushSend(shi); SeriPushSend('K'); //???1μ¥?? SeriPushSend('p'); SeriPushSend('a'); SeriPushSend(0x0d); SeriPushSend(0x0a); delay(100); } }