#include "bh1750.h" //#include "slave.h" #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 unsigned char BH_BUF[4]; //接收数据缓存区 /*************************************************************** ** 功能: IIC端口初始化 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750IO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(BH1750_SDA_RCC|BH1750_SCL_RCC,ENABLE); GPIO_InitStructure.GPIO_Pin = BH1750_SCL_GPIO_PIN;//PB6/PB7/PB5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(BH1750_SCL_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化 GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN;//PB6/PB7/PB5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化 GPIO_SetBits(BH1750_SDA_GPIO_TYPE,BH1750_SDA_GPIO_PIN); //输出高 GPIO_SetBits(BH1750_SCL_GPIO_TYPE,BH1750_SCL_GPIO_PIN); //输出高 } void bh1750_sdain_mode(void)//SDA配置输入模式 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(BH1750_SDA_RCC,ENABLE); GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化 } void bh1750_sdaout_mode(void)//SDA配置输出模式 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(BH1750_SDA_RCC,ENABLE); GPIO_InitStructure.GPIO_Pin = BH1750_SDA_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(BH1750_SDA_GPIO_TYPE, &GPIO_InitStructure); //根据设定参数初始化 } /*************************************************************** ** 功能: 产生IIC起始信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_Start() { SDA_OUT(); //sda线输出 SETSDA; SETSCL; delay_us(4); CLRSDA;//START:when CLK is high,DATA change form high to low delay_us(4); CLRSCL;//钳住I2C总线,准备发送或接收数据 } /*************************************************************** ** 功能: 产生IIC停止信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_Stop() { SDA_OUT();//sda线输出 CLRSDA;//STOP:when CLK is high DATA change form low to high SETSCL; delay_us(4); SETSDA;//发送I2C总线结束信号 delay_us(4); } /*************************************************************** ** 功能: 产生IIC应答信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_SendACK(unsigned char ack) { SDA_OUT(); //sda线输出 if(ack) { SETSDA; //写应答信号 } else { CLRSDA; } SETSCL; //拉高时钟线 delay_us(2); //延时 CLRSCL; //拉低时钟线 delay_us(2); //延时 } /*************************************************************** ** 功能: 产生IIC接收信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ unsigned char BH1750_RecvACK() { unsigned char data; SDA_IN(); //SDA设置为输入 SETSCL; //拉高时钟线 delay_us(2); //延时 data = READ_SDA; //读应答信号 CLRSCL; //拉低时钟线 delay_us(2); //延时 return data; } /*************************************************************** ** 功能: 向IIC总线发送一个字节数据 ** 参数: dat:一字节数据 ** 返回值: 无 ****************************************************************/ void BH1750_SendByte(unsigned char dat) { unsigned char i,bit; SDA_OUT(); //sda线输出 for (i=0; i<8; i++) //8位计数器 { bit=dat&0x80; if(bit) { SETSDA; } else CLRSDA; dat <<= 1; //移出数据的最高位 SETSCL; //拉高时钟线 delay_us(2); //延时 CLRSCL; //拉低时钟线 delay_us(2); //延时 } BH1750_RecvACK(); } /*************************************************************** ** 功能: 从IIC总线接收一个字节数据 ** 参数: 无参数 ** 返回值: dat:接收一字节数据 ****************************************************************/ unsigned char BH1750_RecvByte() { unsigned char i; unsigned char dat = 0; unsigned char a; SDA_IN(); //SDA设置为输入 SETSDA; //使能内部上拉,准备读取数据, for(i=0; i<8; i++) //8位计数器 { dat <<= 1; SETSCL; //拉高时钟线 delay_us(2); //延时 a=READ_SDA;//读SDA数据 if(a==1)dat+=1; CLRSCL; //拉低时钟线 delay_us(2); //延时 } return dat; } /*************************************************************** ** 功能: 向bh1750写入命令 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void Single_Write_BH1750( unsigned char REG_Address) { BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress); //发送设备地址+写信号 BH1750_SendByte(REG_Address); //内部寄存器地址, BH1750_Stop(); //发送停止信号 } /*************************************************************** ** 功能: 连续读出BH1750内部数据 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void Multiple_Read_BH1750(void) { unsigned char i; BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号 for(i=0; i<3; i++) //连续读取2个地址数据,存储中BH_BUF { BH_BUF[i] = BH1750_RecvByte(); //BH_BUF[0]存储0x32地址中的数据 if(i == 3) { BH1750_SendACK(1); //最后一个数据需要回NOACK } else { BH1750_SendACK(0); //回应ACK } } BH1750_Stop(); //停止信号 // delay_ms(150); } /*************************************************************** ** 功能: 初始化BH1750 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_Init() { BH1750IO_Init(); Single_Write_BH1750(0x01); //CLRADDR; //将ADDR位初始化拉低 } /*************************************************************** ** 功能: 读取光照度 ** 参数: 无参数 ** 返回值: data:返回光照度值 ****************************************************************/ unsigned int Dispose(void) { static float temp_a; unsigned int data_a; int dis_data1 ; Single_Write_BH1750(0x01); // power on Single_Write_BH1750(0x10); // H- resolution mode delay_ms(200); //延时200ms Multiple_Read_BH1750(); //连续读出数据,存储在BH_BUF中 delay_ms(150); dis_data1=BH_BUF[0]; dis_data1=(dis_data1<<8)+BH_BUF[1];//合成数据,即光照数据 temp_a=(float)dis_data1/1.2; data_a=(int)temp_a; return data_a; }