标题:
51单片机BMP280气压和温度值测试程序
[打印本页]
作者:
xiuyueyuan2013
时间:
2018-5-30 04:00
标题:
51单片机BMP280气压和温度值测试程序
51单片机bmp280测试程序,实机测试通过,bmp280+lcd1602显示气压和温度值。压缩包附件中包含测试程序和详细的资料。
测试程序使用的单片机型号是STC90C516RD+,1280字节RAM,64K ROM,12Mhz晶振
0.png
(49.07 KB, 下载次数: 110)
下载附件
2018-5-30 04:04 上传
单片机源程序如下:
#include"bmp280.h"
unsigned short xdata dig_t1,dig_p1; //注意数据类型
signed short xdata dig_t2,dig_t3,dig_p2,dig_p3,dig_p4,dig_p5,dig_p6,dig_p7,dig_p8,dig_p9;
long signed int xdata bmp280_ut,bmp280_up;
long signed int xdata t_fine;
void bmpreaddata() //原始压力温度数据突发读取
{
uchar xdata n,temp=0x09,address=0xf7;
long unsigned int xdata readdata0[6]; //注意数据类型
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(0xf4,1);
i2csendbyte(0x55,1);
i2cstop();
delay10ms(10);
while(temp!=0)
{
temp=0x09;
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(0xf3,1);
i2cstop();
i2cstart();
i2csendbyte(0xed,1);
temp&=i2creadbyte(1);
i2cstop();
}
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(address,1);
i2cstop();
i2cstart();
i2csendbyte(0xed,1);
for(n=0;n<6;n++)
{
if(n<5)
{
readdata0[n]=i2creadbyte(0);
}
else
{
readdata0[n]=i2creadbyte(1);
}
}
i2cstop();
bmp280_up=(readdata0[0]<<12)|(readdata0[1]<<4)|(readdata0[2]>>4);
bmp280_ut=(readdata0[3]<<12)|(readdata0[4]<<4)|(readdata0[5]>>4);
}
void bmpreset()
{
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(0xe0,1);
i2csendbyte(0xb6,1); //软复位
i2cstop();
}
void bmpconfig()
{
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(0xf5,1);
i2csendbyte(0x00,1); //强制模式无待机时间,关滤波,禁用3线模式
i2cstop();
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(0xf4,1);
i2csendbyte(0x55,1); //压力16倍,温度2倍过采样,转换时间最大43MS,强制模式
i2cstop();
}
void readtrimming() //补偿参数单字节读取
{
uchar xdata n,address=0x88;
uchar xdata readdata[24];
for(n=0;n<24;n++)
{
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(address,1);
i2cstop();
i2cstart();
i2csendbyte(0xed,1);
if(n<23)
{
readdata[n]=i2creadbyte(0);
}
else
{
readdata[n]=i2creadbyte(1);
}
i2cstop();
address++;
}
dig_t1=(readdata[1]<<8)|(readdata[0]);
dig_t2=(readdata[3]<<8)|(readdata[2]);
dig_t3=(readdata[5]<<8)|(readdata[4]);
dig_p1=(readdata[7]<<8)|(readdata[6]);
dig_p2=(readdata[9]<<8)|(readdata[8]);
dig_p3=(readdata[11]<<8)|(readdata[10]);
dig_p4=(readdata[13]<<8)|(readdata[12]);
dig_p5=(readdata[15]<<8)|(readdata[14]);
dig_p6=(readdata[17]<<8)|(readdata[16]);
dig_p7=(readdata[19]<<8)|(readdata[18]);
dig_p8=(readdata[21]<<8)|(readdata[20]);
dig_p9=(readdata[23]<<8)|(readdata[22]);
}
uchar bmpid()
{
uchar xdata id;
i2cstart();
i2csendbyte(0xec,1);
i2csendbyte(0xd0,1);
i2cstop();
i2cstart();
i2csendbyte(0xed,1);
id=i2creadbyte(1);
i2cstop();
return id;
}
long signed int tempcal(long signed int adc_t) //c51单片机不支持64位整数,使用简化计算
{
long signed int var1,var2,t;
var1=((((adc_t>>3)-((long signed int)dig_t1<<1)))*((long signed int)dig_t2))>>11;
var2=(((((adc_t>>4)-((long signed int)dig_t1))*((adc_t>>4)-((long signed int)dig_t1)))>>12)*((long signed int)dig_t3))>>14;
t_fine=var1+var2;
t=(t_fine*5+128)>>8;
return t;
}
long unsigned int presscal(long signed int adc_p)
{
long signed int var1,var2;
long unsigned int p;
var1=(((long signed int)t_fine)>>1)-(long signed int)64000;
var2=(((var1>>2)*(var1>>2))>>11)*((long signed int)dig_p6);
var2=var2+((var1*((long signed int)dig_p5))<<1);
var2=(var2>>2)+(((long signed int)dig_p4)<<16);
var1=(((dig_p3*(((var1>>2)*(var1>>2))>>13))>>3)+((((long signed int)dig_p2)*var1)>>1))>>18;
var1=((((32768+var1))*((long signed int)dig_p1))>>15);
if(var1==0)
{
return 0;
}
p=(((long unsigned int)(((long signed int)1048576)-adc_p)-(var2>>12)))*3125;
if(p<0x80000000)
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
bmp280.zip
(5.18 MB, 下载次数: 618)
2018-5-30 03:59 上传
点击文件名下载附件
程序和详细资料
下载积分: 黑币 -5
作者:
tt98
时间:
2018-5-30 16:30
好资料,学习下!
作者:
wanggy
时间:
2018-5-31 15:21
感谢楼主
作者:
QQ2
时间:
2018-6-15 21:48
楼主,我们调试了代码调试不通
作者:
yuer04
时间:
2019-3-17 14:51
感谢分享,先看下东西能不能用
作者:
yuer04
时间:
2019-3-17 16:09
我是来看看的
作者:
风158
时间:
2019-8-11 00:43
学习学习。
作者:
huoujhy
时间:
2019-9-8 10:48
很完整的资料,谢谢!
作者:
张谋益
时间:
2019-9-8 13:08
很完整的资料,得到了不一样的学习
作者:
FMCH
时间:
2019-9-21 14:46
感谢分享
作者:
WSSHStarTree
时间:
2019-9-24 18:15
多谢分享
正需要
作者:
iws2000
时间:
2020-4-3 13:10
请问csb管脚应该接在哪里呢
作者:
chinarenxx
时间:
2020-4-15 01:38
我只调试过BMP180,280的还不会用,有空下载试试。
作者:
chinarenxx
时间:
2020-4-15 21:49
按上面程序调试显示了,可是温度值和压力值明显偏大怎么办呢,那出问题了吗
作者:
gudaochaoyue
时间:
2020-4-16 13:14
感谢分享, 学习~~
作者:
iamluckman
时间:
2020-6-3 02:19
正在调试BMP_280,学习学习
作者:
新乡家电维修
时间:
2020-10-30 11:57
iws2000 发表于 2020-4-3 13:10
请问csb管脚应该接在哪里呢
I2C模式就接高电平,SPI模式就下拉到地
作者:
新乡家电维修
时间:
2020-10-31 11:15
我的程序读出的ID识别码都是18呢?并不是资料说的58、?????
作者:
四无青年
时间:
2020-11-11 11:15
数据偏大啊,博主是哪里的问题呀
作者:
15797939041
时间:
2021-3-1 22:11
温度和大气压数据都偏大,是哪里有问题吗
作者:
赤研
时间:
2021-5-11 09:03
我太难了,下载了两遍这个用了十积分。结果被公司的防火墙给拦截了。。。。。亏了呀,,,回家再试试吧
作者:
赤研
时间:
2021-5-13 15:45
超感谢的,调了一个月,终于通了。超级工整的程序。数值问题应该很好解决
作者:
6874577
时间:
2021-12-20 20:33
很完整的资料,得到了不一样的学习
作者:
my_lcs
时间:
2022-4-14 08:38
路过的,感觉不错,谢谢了
作者:
新手小白求指教
时间:
2022-4-23 19:55
89C52的板子通用嘛
作者:
angalp
时间:
2023-3-17 18:13
为啥我用串口读出来的温度高了,室温28.5,BMP280测出来的35.4
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1