标题:
单片机程序不知道哪里出问题了?运行后气压数值不对,温度也没有显示
[打印本页]
作者:
cjzimo
时间:
2018-11-23 19:31
标题:
单片机程序不知道哪里出问题了?运行后气压数值不对,温度也没有显示
运行后气压数值不对,温度也没有显示
#include "bmp085.h"
#include "lcd12864.h"
#define BMP085_SlaveAddress 0xee // 定义器件在IIC总线中的从地址
#define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values)
sbit SCL = P3^5; // I2C时钟引脚定义
sbit SDA = P3^6; // I2C数据引脚定义
short ac1, ac2, ac3;
unsigned short ac4, ac5, ac6;
short b1, b2;
short mb, mc, md;
// 11.0592MHz 1T ----------------------------------
void Delay5us(void)
{
unsigned char a;
for(a=26; a>0; a--);
}
// 11.0592MHz 1T ----------------------------------
void Delay5ms(void)
{
unsigned char a,b,c;
for(c=7; c>0; c--)
for(b=168; b>0; b--)
for(a=22; a>0; a--);
}
// 起始信号 --------------------------------------
void I2C_Start()
{
SDA = 1; // 拉高数据线
SCL = 1; // 拉高时钟线
Delay5us(); // 延时
SDA = 0; // 产生下降沿
Delay5us(); // 延时
SCL = 0; // 拉低时钟线
}
// 停止信号 --------------------------------------
void I2C_Stop()
{
SDA = 0; // 拉低数据线
SCL = 1; // 拉高时钟线
Delay5us(); // 延时
SDA = 1; // 产生上升沿
Delay5us(); // 延时
}
// 发送应答信号 ----------------------------------
// 输入:0-ACK 1-NACK -----------------------------
void I2C_SendACK(bit ack)
{
SDA = ack; // 写应答信号
SCL = 1; // 拉高时钟线
Delay5us(); // 延时
SCL = 0; // 拉低时钟线
Delay5us(); // 延时
}
// 接收应答信号 -----------------------------------
bit I2C_RecvACK()
{
SCL = 1; // 拉高时钟线
Delay5us(); // 延时
CY = SDA; // 读应答信号
SCL = 0; // 拉低时钟线
Delay5us(); // 延时
return CY;
}
/**
* 向I2C总线发送一个字节数据
*/
void I2C_SendByte(unsigned char dat)
{
unsigned char i;
for (i=0; i<8; i++) { // 8位计数器
dat <<= 1; // 移出数据的最高位
SDA = CY; // 送数据口
SCL = 1; // 拉高时钟线
Delay5us(); // 延时
SCL = 0; // 拉低时钟线
Delay5us(); // 延时
}
I2C_RecvACK();
}
/**
* 从I2C总线接收一个字节数据
*/
unsigned char I2C_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
SDA = 1; // 使能内部上拉,准备读取数据,
for (i=0; i<8; i++) { // 8位计数器
dat <<= 1; // 移出数据的最高位
SCL = 1; // 拉高时钟线
Delay5us(); // 延时
dat |= SDA; // 读数据
SCL = 0; // 拉低时钟线
Delay5us(); // 延时
}
return dat;
}
/*
* 读出BMP085内部数据,连续两个
* 输入:adr-寄存器地址
*/
short BMP085_MultipleRead(unsigned char adr)
{
unsigned char msb, lsb;
short dat;
I2C_Start(); // 起始信号
I2C_SendByte(BMP085_SlaveAddress); // 发送设备地址 + 写信号
I2C_SendByte(adr); // 发送存储单元地址
I2C_Start(); // 起始信号
I2C_SendByte(BMP085_SlaveAddress+1); // 发送设备地址+读信号
msb = I2C_RecvByte(); // 读取数据
I2C_SendACK(0); // ACK
lsb = I2C_RecvByte();
I2C_SendACK(1); // 最后一个数据不应答
I2C_Stop(); // 停止信号
Delay5ms();
dat = msb << 8;
dat |= lsb;
return dat;
}
/*
* 读取温度数据
*/
long BMP085_ReadTemp(void)
{
I2C_Start(); // 起始信号
I2C_SendByte(BMP085_SlaveAddress); // 发送设备地址+写信号
I2C_SendByte(0xF4); // 0xF4--进行测量
I2C_SendByte(0x2E); // write register data for temp
I2C_Stop(); // 发送停止信号
Delay5ms(); // max conversion time is 4.5ms
return (long)BMP085_MultipleRead(0xF6); // 读取返回值
}
/**
* 读取压强数据
*/
long BMP085_ReadPressure(void)
{
long pressure = 0;
I2C_Start(); // 起始信号
I2C_SendByte(BMP085_SlaveAddress); // 发送设备地址+写信号
I2C_SendByte(0xF4); // 0xF4--进行测量
I2C_SendByte(0x34); // write register data for pressure
I2C_Stop(); // 发送停止信号
Delay5ms(); // max conversion time is 4.5ms
pressure = BMP085_MultipleRead(0xF6); // 读取返回值
pressure &= 0x0000FFFF;
return pressure;
}
/**
* 每个器件都有自己单独的校准系数,读取校准数据。
*/
void BMP085_Init(void)
{
ac1 = BMP085_MultipleRead(0xAA);
ac2 = BMP085_MultipleRead(0xAC);
ac3 = BMP085_MultipleRead(0xAE);
ac4 = BMP085_MultipleRead(0xB0);
ac5 = BMP085_MultipleRead(0xB2);
ac6 = BMP085_MultipleRead(0xB4);
b1 = BMP085_MultipleRead(0xB6);
b2 = BMP085_MultipleRead(0xB8);
mb = BMP085_MultipleRead(0xBA);
mc = BMP085_MultipleRead(0xBC);
md = BMP085_MultipleRead(0xBE);
}
/**
* 数据读取显示
*/
long ut, up;
long x1, x2, b5, b6, x3, b3, p;
unsigned long b4, b7;
long temperature, pressure;
void BMP085_Convert(void)
{
unsigned char i, dis_temp[9] = {0};
/* 加载温度显示数据 */
ut = BMP085_ReadTemp();
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
temperature = (b5 + 8) >> 4;
dis_temp[0] = temperature%1000/100 + 0x30;
dis_temp[1] = temperature%100/10 + 0x30;
dis_temp[2] = '.';
dis_temp[3] = temperature%10 + 0x30;
for (i=0; i<4; i++) {
SMS_Content[5+i] = dis_temp[i]; //加载数据到待发送短信
// SMS_Content[50] = "Temp:22.2, Pres:101.3KPa, Humi:50%, PM2.5:30ug/m^3";
}
LCD12864_Dis(0, 3, dis_temp);
/* 加载压强显示数据 */
up = BMP085_ReadPressure();
b6 = b5 - 4000;
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 >> OSS);
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);
if (pressure > 100000) {
dis_temp[0] = pressure/100000 + 0x30;
dis_temp[1] = pressure%100000/10000 + 0x30;
dis_temp[2] = pressure%10000/1000 + 0x30;
dis_temp[3] = '.';
dis_temp[4] = pressure%1000/100 + 0x30;
dis_temp[5] = pressure%100/10 + 0x30;
dis_temp[6] = 'K';
dis_temp[7] = 'P';
dis_temp[8] = 'a';
} else {
dis_temp[0] = 0x20; // 空格
dis_temp[1] = pressure%100000/10000 + 0x30;
dis_temp[2] = pressure%10000/1000 + 0x30;
dis_temp[3] = '.';
dis_temp[4] = pressure%1000/100 + 0x30;
dis_temp[5] = pressure%100/10 + 0x30;
dis_temp[6] = 'K';
dis_temp[7] = 'P';
dis_temp[8] = 'a';
}
for (i=0; i<6; i++) {
SMS_Content[16+i] = dis_temp[i];
}
LCD12864_WriteCmd(0x8b);
for(i=0; i<9; i++)
LCD12864_WriteDat(dis_temp[i]);
}
复制代码
作者:
调皮猫
时间:
2018-12-16 05:57
我也是,明明 (&0f) 与 运算后高4位该是全0零 可是 7279 的数码管显示还是高位有1存在,出鬼啦?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1