|
之前用bmp280,網(wǎng)上的資源很少,尤其是51單片機(jī)用這個(gè)模塊的,所以現(xiàn)在任務(wù)做好了,模塊調(diào)通,附上成果,供大家參考免去彎路。廢話(huà)不多說(shuō),附件是bmp280的c和h文件,沒(méi)帶程序,程序有很多亂七八糟的什么4463,opt101,dht11,pcf8563.。。。。就不帶了,歡迎壇友一起討論
0.png (4.62 KB, 下載次數(shù): 112)
下載附件
2018-1-24 19:29 上傳
單片機(jī)源程序如下:
- #include <string.h>
- #include "bmp280111.h"
- #include <math.h> //Keil library
- #include <stdlib.h> //Keil library
- #include <stdio.h> //Keil library
- #include <INTRINS.H> //Keil library
- #include "sensor_am21xx.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define BMP280_SlaveAddress 0xec //定義器件在IIC總線中的從地址
- #define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values)
- unsigned short dig_T1;
- short dig_T2;
- short dig_T3;
- unsigned short dig_P1;
- short dig_P2;
- short dig_P3;
- short dig_P4;
- short dig_P5;
- short dig_P6;
- short dig_P7;
- short dig_P8;
- short dig_P9;
- void delay() //略微延時(shí) 6us約>4.7us
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- void iic_start() //啟動(dòng)信號(hào)
- {
- SDA=1;
- SCL=1;
- delay();
- SDA=0;
- delay();
- SCL=0;
- }
- void iic_stop() //停止信號(hào)
- {
- SDA=0;
- SCL=1;
- delay();
- SDA=1;
- delay();
- SCL=0;
- }
- void iic_ack() //應(yīng)答信號(hào)
- {
- uchar i=0;
- SCL=1;
- delay();
- while((SDA==1)&&(i<255))
- i++;
- SCL=0;
- delay();
- }
- void iic_send_byte(uchar bat) //發(fā)送數(shù)據(jù)
- {
- uchar i,temp;
- temp=bat;
- for(i=0;i<=7;i++)
- {
- temp=temp<<1;
- SCL=0;
- SDA=CY;
- delay();
- SCL=1;
- delay();
- }
- SCL=0;
- delay();
- SDA=1;
- delay();
- }
- unsigned char iic_rev() //接受數(shù)據(jù)
- {
- uchar temp,i;
- SCL=0;
- delay();
- SDA=1;
- for(i=0;i<=7;i++)
- {
- SCL=1;
- delay();
- temp=(temp<<1)|SDA;
- SCL=0;
- delay();
- }
- delay();
- return temp;
- }
- uchar Single_Read(uchar ST_Address)
- {
- uchar REG_data;
- //uchar bit;
-
- iic_start(); //起始信號(hào)
- iic_send_byte(BMP280_SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
- iic_ack();
- iic_send_byte(ST_Address); //發(fā)送存儲(chǔ)單元地址
- iic_ack();
- iic_start(); //起始信號(hào)
- iic_send_byte(BMP280_SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)
- iic_ack();
- REG_data = iic_rev();
- iic_ack(); //最后一個(gè)數(shù)據(jù)需要回NOACK
- return REG_data;
- }
- void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
- {
- iic_start(); //起始信號(hào)
- iic_send_byte(SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
- iic_ack();
- iic_send_byte(REG_Address); //內(nèi)部寄存器地址
- iic_ack();
- iic_send_byte(REG_data); //內(nèi)部寄存器數(shù)據(jù)
- iic_ack();
- iic_stop(); //發(fā)送停止信號(hào)
- }
- //*********************************************************
- //讀出BMP085內(nèi)部數(shù)據(jù),連續(xù)兩個(gè)
- //*********************************************************
- short Multiple_read(uchar ST_Address)
- {
- uchar msb, lsb;
- short _data;
-
- lsb = Single_Read(ST_Address);
- msb = Single_Read(ST_Address+1);
-
- _data = msb << 8;
- _data |= lsb;
- //rt_kprintf("data is %x %x\n",msb,lsb);
- return _data;
- }
- //*********************************************************
- //讀出BMP085內(nèi)部數(shù)據(jù),連續(xù)三個(gè)
- //*********************************************************
- long Multiple_three_read(uchar ST_Address)
- {
- uchar msb, lsb,xlsb;
- long _data = 0;
-
- msb = Single_Read(ST_Address);
- lsb = Single_Read(ST_Address+1);
- xlsb = Single_Read(ST_Address+2);
-
- //rt_kprintf("data is %x %x %x\n",msb,lsb,xlsb);
-
- // _data = msb << 16; ////stm32可以這么用,51有的單片機(jī)不可以,重要。!
- // _data |= lsb << 8;
- // _data |= xlsb;
- // _data = _data >> 4;
- _data=(long)(((uint32_t)msb<<12)|((uint32_t)lsb<<4)|((uint32_t)xlsb>>4));
- return _data;
- }
- //**************************************************************
- //初始化BMP280,根據(jù)需要請(qǐng)參考pdf進(jìn)行修改**************
- void Init_BMP280(void)
- {
- unsigned short temp = 0;
- unsigned char write_byte;
- temp = Single_Read(0xd0);//讀取id、判斷iic是否正常模塊是否正常,讀取出來(lái)的地址是0x58就是對(duì)的
- // if(temp==0x58)printf("BMP280 ID IS: 0x%X\n",temp);
- // else printf("BMP280 ID IS FAIL: 0x%X\n",temp);
- dig_T1 = Multiple_read(0x88);
- dig_T2 = Multiple_read(0x8A);
- dig_T3 = Multiple_read(0x8C);
- dig_P1 = Multiple_read(0x8E);
- dig_P2 = Multiple_read(0x90);
- dig_P3 = Multiple_read(0x92);
- dig_P4 = Multiple_read(0x94);
- dig_P5 = Multiple_read(0x96);
- dig_P6 = Multiple_read(0x98);
- dig_P7 = Multiple_read(0x9A);
- dig_P8 = Multiple_read(0x9C);
- dig_P9 = Multiple_read(0x9E);
- write_byte = 0x91;//write_byte
- Single_Write(BMP280_SlaveAddress,0xf4,0xb3);
- write_byte = 0x00;//配置
- Single_Write(BMP280_SlaveAddress,0xf5,5<<2);//5<<2
- //rt_thread_delay(RT_TICK_PER_SECOND);
- Delay_N1ms(200);
- }
- //***********************************************************************
- long bmp280Convert(void)
- {
- long adc_T;
- long adc_P;
- long var1, var2,t_fine,T,p;
- //rt_kprintf("----------------------------\n");
-
- //adc_T = Multiple_three_read(0xFA);
- adc_T = Multiple_three_read(0xFA); // 讀取溫度
- //adc_P = Multiple_three_read(0xF7);
- adc_P = Multiple_three_read(0xF7); // 讀取壓強(qiáng)
- if(adc_P == 0)
- {
- return 0;
- }
- //Temperature
- var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2);
- //rt_kprintf("var1 is %d\n",var1);
- var2 = ((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T)/131072.0-((double)dig_T1)/8192.0))*((double)dig_T3);
- //rt_kprintf("var2 is %d\n",var2);
-
- t_fine = (uint32)(var1+var2);
- //rt_kprintf("t_fine is %d\n",t_fine);
-
- T = (var1+var2)/5120.0;
- T = T;
- //rt_kprintf("temperature is %d\n",T);
-
- var1 = ((double)t_fine/2.0)-64000.0;
- //rt_kprintf("var1 is %d\n",var1);
-
- var2 = var1*var1*((double)dig_P6)/32768.0;
- //rt_kprintf("var2 is %d\n",var2);
-
- var2 = var2+var1*((double)dig_P5)*2.0;
- //rt_kprintf("var2 is %d\n",var2);
-
- var2 = (var2/4.0)+(((double)dig_P4)*65536.0);
- //rt_kprintf("var2 is %d\n",var2);
-
- var1 = (((double)dig_P3)*var1*var1/524288.0+((double)dig_P2)*var1)/524288.0;
- //rt_kprintf("var1 is %d\n",var1);
-
- var1 = (1.0+var1/32768.0)*((double)dig_P1);
- //rt_kprintf("var1 is %d\n",var1);
-
- p = 1048576.0-(double)adc_P;
- //rt_kprintf("p is %d\n",p);
- p = (p-(var2/4096.0))*6250.0/var1;
- //rt_kprintf("p is %d\n",p);
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
bmp280111.rar
(2.85 KB, 下載次數(shù): 450)
2018-1-24 10:43 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|