#include <INTRINS.H> //Keil library
#define uchar unsigned char
#define uint unsigned int
#include "MAIN\STC15Fxxxx.H"
#include "bmp280.h"
#include "UART1.H"
#include "DELAY.H"
long BMP280_QY;
bit BMP280_LINK;
#define BMP280_I2C_ADDR (0x76) //sdo=0 地址=0X76
#define BMP280_DEFAULT_CHIP_ID (0x58)
#define BMP280_CHIP_ID_REG (0xD0) /* Chip ID Register */
#define BMP280_RST_REG (0xE0) /* Softreset Register */
#define BMP280_STAT_REG (0xF3) /* Status Register */
#define BMP280_CTRL_MEAS_REG (0xF4) /* Ctrl Measure Register */
#define BMP280_CONFIG_REG (0xF5) /* Configuration Register */
//---------------------------------------------------------
#define BMP280_PRESSURE_MSB_REG (0xF7) /* Pressure MSB Register */
#define BMP280_PRESSURE_LSB_REG (0xF8) /* Pressure LSB Register */
#define BMP280_PRESSURE_XLSB_REG (0xF9) /* Pressure XLSB Register */
#define BMP280_TEMPERATURE_MSB_REG (0xFA) /* Temperature MSB Reg */
#define BMP280_TEMPERATURE_LSB_REG (0xFB) /* Temperature LSB Reg */
#define BMP280_TEMPERATURE_XLSB_REG (0xFC) /* Temperature XLSB Reg */
#define BMP280_FORCED_MODE (0x01)
#define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG (0x88)
//#define BMP280_PRESSURE_TEMPERATURE_CALIB_DATA_LENGTH (24)
//#define BMP280_DATA_FRAME_SIZE (6)
#define BMP280_OVERSAMP_SKIPPED (0x00)
#define BMP280_OVERSAMP_1X (0x01)
#define BMP280_OVERSAMP_2X (0x02)
#define BMP280_OVERSAMP_4X (0x03)
#define BMP280_OVERSAMP_8X (0x04)
#define BMP280_OVERSAMP_16X (0x05)
// configure pressure and temperature oversampling, forced sampling mode
#define BMP280_PRESSURE_OSR (BMP280_OVERSAMP_8X)
#define BMP280_TEMPERATURE_OSR (BMP280_OVERSAMP_1X)
#define BMP280_MODE (BMP280_PRESSURE_OSR << 2 | BMP280_TEMPERATURE_OSR << 5 | BMP280_FORCED_MODE)
#define T_INIT_MAX (20) // 20/16 = 1.25 ms
#define T_MEASURE_PER_OSRS_MAX (37) // 37/16 = 2.3125 ms
#define T_SETUP_PRESSURE_MAX (10) // 10/16 = 0.625 ms
unsigned short dig_T1,dig_P1;
short dig_T2,dig_T3 ,dig_P2,dig_P3,dig_P4,dig_P5,dig_P6,dig_P7,dig_P8,dig_P9;
long t_fine;
//bit BMP280_LINK;
uchar bmp280_chip_id = 0;
long bmp280_up = 0;
long bmp280_ut = 0;
uchar bmp280_data[24];
void bmp280_start_up();
void bmp280_get_up();
sbit BMP280_SCL=P2^5; //IIC时钟引脚定义
sbit BMP280_SDA=P2^4; //IIC数据引脚定义
////延时5ms
//void Delay5ms()
//{
// CCON = 0; //清除CF、CR、CCF0、CCF1
// CH = (65536-9216)/256; //PCA基准定时器设初值。
// CL = (65536-9216)%256; //65536-22.1184M振荡MHZ/12*5000US =65536-4608*2
// CR = 1; //启动PCA定时器。
// while (!CF);
//}
void BMP280_Delay5us() //@@22.1184MHz
{
unsigned char i;
_nop_();
i = 25;
while (--i);
}
/**************************************
起始信号
**************************************/
void BMP280_Start()
{
BMP280_SDA = 1; //拉高数据线
BMP280_Delay5us(); //延时
BMP280_SCL = 1; //拉高时钟线
BMP280_Delay5us(); //延时
BMP280_SDA = 0; //产生下降沿
BMP280_Delay5us(); //延时
BMP280_SCL = 0; //拉低时钟线
BMP280_Delay5us(); //延时
}
/**************************************
停止信号
**************************************/
void BMP280_Stop()
{
BMP280_SDA = 0; //拉低数据线
BMP280_Delay5us(); //延时
BMP280_SCL = 1; //拉高时钟线
BMP280_Delay5us(); //延时
BMP280_SDA = 1; //产生上升沿
BMP280_Delay5us(); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BMP280_SendACK(bit ack)
{
BMP280_SDA = ack; //写应答信号
BMP280_Delay5us(); //延时
BMP280_SCL = 1; //拉高时钟线
BMP280_Delay5us(); //延时
BMP280_SCL = 0; //拉低时钟线
BMP280_Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/
uchar BMP280_RecvACK()
{
BMP280_Delay5us();
BMP280_SCL = 1; //拉高时钟线
BMP280_SDA=1;
BMP280_Delay5us(); //延时
CY = BMP280_SDA; //读应答信号
BMP280_SCL = 0; //拉低时钟线
BMP280_Delay5us(); //延时
return CY;
// if (CY==0) {return 1;} else{return 0;} //没有应答,则BMP280没安装
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
uchar BMP280_SendByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
BMP280_SDA = CY; //送数据口
BMP280_Delay5us(); //延时
BMP280_SCL = 1; //拉高时钟线
BMP280_Delay5us(); //延时
BMP280_SCL = 0; //拉低时钟线
BMP280_Delay5us(); //延时
}
return BMP280_RecvACK(); // 0 =有应答 1=没有应答
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
uchar BMP280_RecvByte()
{
uchar i;
uchar dat = 0;
BMP280_SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
BMP280_SCL = 1; //拉高时钟线
BMP280_Delay5us(); //延时
dat |= BMP280_SDA; //读数据
BMP280_SCL = 0; //拉低时钟线
BMP280_Delay5us(); //延时
}
return dat;
}
uchar i2cRead(uchar add,uchar reg,uchar len,uchar *ndata)
{
uchar i;
BMP280_Start(); //起始信号
if (BMP280_SendByte(add<<1)==1){return 3;} //发送设备地址+写信号
// if (BMP280_SendByte(0xec)==1){return 3;} //发送设备地址+写信号
//----------------------------------------------
if (BMP280_SendByte(reg)==1){return 1;} //要读的寄存器起始地址
//----------------------------------------------
BMP280_Start(); //起始信号
if (BMP280_SendByte((add<<1)+1)==1){return 2;} //发送设备地址+读信号
// if (BMP280_SendByte(0xed)==1){return 2;} //发送设备地址+读信号
//----------------------------------------------
if (len==1)
{
*ndata = BMP280_RecvByte(); ndata++; //BUF[0]存储
BMP280_SendACK(1); //最后一个数据需要回NOACKM
}
else
{
for (i=0; i<(len-1); i++)
{
*ndata = BMP280_RecvByte(); ndata++; //BUF[0]存储
BMP280_SendACK(0); //不是最后一个数据,则回应ACKM
}
*ndata = BMP280_RecvByte(); ndata++; //BUF[0]存储
BMP280_SendACK(1); //最后一个数据需要回NOACKM
}
BMP280_Stop(); //发送停止信号
return 5;
return 5;
}
uchar i2cWrite(uchar add,uchar reg,uchar ndata)
{
BMP280_Start(); //起始信号
if (BMP280_SendByte(add<<1)==1){return 0;} //发送设备地址+写信号
//----------------------------------------------
if (BMP280_SendByte(reg)==1){return 0;} //要读的寄存器起始地址
if (BMP280_SendByte(ndata)==1){return 0;} //要读的寄存器起始地址
BMP280_Stop(); //发送停止信号
return 1;
}
// Returns temperature in DegC, resolution is 0.01 DegC. Output value of "5123" equals 51.23 DegC
// t_fine carries fine temperature as global va
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
KEIL C51开发,自用程序,完美测试通过,STC8A8K64S4 读取SHT20温湿度 BMP280气压数据,I2C协议,STC8A8K64S4 时钟选22.1184M
资源详情
资源评论
资源推荐
收起资源包目录
STC8K_SHT20_BMP280_DEMO.rar (20个子文件)
STC8K_SHT20_BMP280_DEMO
keilkilll.bat 417B
STC8K_SHT20_BMP280_DEMO.uvproj 14KB
STC8K_SHT20_BMP280_DEMO.uvopt 56KB
MAIN
STC15Fxxxx.H 13KB
DELAY.C 1KB
STC_EEPROM.C 9KB
UART
UART1.C 4KB
UART1.H 458B
MAIN_WX.c 3KB
README.H 5KB
README.c 24B
IO.H 888B
DELAY.H 179B
STC_EEPROM.H 1KB
OBJ
STC8K_SHT20_BMP280_DEMO固件 57KB
STC8K_SHT20_BMP280_DEMO固件.hex 15KB
SENSOR
bmp280.h 279B
SHT2X.C 8KB
SHT2X.H 240B
bmp280.c 12KB
共 20 条
- 1
周楷雯
- 粉丝: 78
- 资源: 1万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2