This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
#include <msp430.h>
#include "OLED.h"
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) //延时x微秒
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define SDA_H P2DIR&=~BIT5 //设为输入,上拉电阻把总线拉高,即电阻上拉
#define SDA_L P2DIR|=BIT5
#define SDA_0 P2OUT&=~BIT5 //设为输入,输出低电平,把总线拉低,即总线主器件拉低
#define SCL_H P2DIR&=~BIT4 //设为输入,上拉电阻把总线拉高,即电阻上拉
#define SCL_L P2DIR|=BIT4
#define SCL_0 P2OUT&=~BIT4 //设为输入,输出低电平,把总线拉低,即总线主器件拉低
#define uchar unsigned char
#define uint unsigned int
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收数据缓存区
//uchar ge,shi,bai,qian,wan; //显示变量
int dis_data; //变量
void Init_BH1750(void);
void Single_Write_BH1750(uchar REG_Address); //单个写入数据
uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
//------------------------------------
void BH1750_Start(); //起始信号
void BH1750_Stop(); //停止信号
void BH1750_SendACK(uchar ack); //应答ACK
uchar BH1750_RecvACK(); //读ack
void BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE BH1750_RecvByte(); //IIC单个字节读
//-----------------------------------
/**************************************
起始信号
**************************************/
void BH1750_Start()
{
SDA_H;
//SDA = 1; //拉高数据线
SCL_H; //拉高时钟线
delay_us(5); //延时
SDA_L;
SDA_0; //产生下降沿
delay_us(5); //延时
SCL_L;
SCL_0; //拉低时钟线
}
/**************************************
停止信号
**************************************/
void BH1750_Stop()
{
SDA_L;
SDA_0; //拉低数据线
SCL_H; //拉高时钟线
delay_us(5); //延时
SDA_H; //产生上升沿
delay_us(5); //延时
}
/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(uchar ack)
{
if(!ack)
{
SDA_L;
SDA_0;
}else
SDA_H;
//SDA = ack; //写应答信号
SCL_H; //拉高时钟线
delay_us(5); //延时
SCL_L;
SCL_0; //拉低时钟线
delay_us(5); //延时
}
/**************************************
接收应答信号
**************************************/
uchar BH1750_RecvACK()
{
SCL_H; //拉高时钟线
delay_us(5); //延时
if(P2IN&BIT5)
{
SCL_L;
SCL_0;
BH1750_Stop();
return 1;
}else
{
SCL_L;
SCL_0;
return 0;
}
//CY = SDA; //读应答信号
SCL_L;
SCL_0; //拉低时钟线
delay_us(5); //延时
return 1;
}
/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
if(dat & 0x80)
SDA_H;
else
{
SDA_L;
SCL_0;
//SDA = CY; //送数据口
}
SCL_H; //拉高时钟线
delay_us(5); //延时
SCL_L;
SCL_0; //拉低时钟线
delay_us(5); //延时
}
BH1750_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BH1750_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA_H; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL_H; //拉高时钟线
delay_us(5); //延时
if(P2IN&BIT5)
dat = dat|0x01;
//dat |= SDA; //读数据
SCL_L;
SCL_0; //拉低时钟线
delay_us(5); //延时
}
return dat;
}
//*********************************
void Single_Write_BH1750(uchar REG_Address)
{
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
BH1750_SendByte(REG_Address); //内部寄存器地址,
// BH1750_SendByte(REG_data); //内部寄存器数据,
BH1750_Stop(); //发送停止信号
}
//*********************************************************
//
//连续读出BH1750内部数据
//
//*********************************************************
void Multiple_read(void)
{ uchar i;
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 3)
{
BH1750_SendACK(1); //最后一个数据需要回NOACK
}
else
{
BH1750_SendACK(0); //回应ACK
}
}
BH1750_Stop(); //停止信号
delay_ms(5);
}
//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
Single_Write_BH1750(0x01);
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
float temp;
delay_ms(100); //延时100ms
LED_Init();
Init_BH1750(); //初始化BH1750
while(1) //循环
{
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
delay_ms(180); //延时180ms
Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
temp=(float)dis_data/1.2;
LED_PrintValueF(3,3,temp,2);
LED_P6x8Str(4,4,"BH1750");
}
}