#include "bh1750.h" //#include "slave.h" #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 unsigned char BUF[4]; //接收数据缓存区 /*************************************************************** ** 功能: IIC端口初始化 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750IO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//PB6/PB7/PB5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化 GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //输出高 } void In_mode(void)//SDA配置输入模式 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化 } void Out_mode(void)//SDA配置输出模式 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &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个地址数据,存储中BUF { BUF[i] = BH1750_RecvByte(); //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 data; unsigned int return_gz(void) { return data; } unsigned int Read_gz(void) { static float temp; static char ifg=0; int dis_data; switch(ifg) { case 0: Single_Write_BH1750(0x01); // power on Single_Write_BH1750(0x10); // H- resolution mode // delay_ms(200); //延时200ms ifg++; return 20;//200ms在执行读取数据 case 1: Multiple_Read_BH1750(); //连续读出数据,存储在BUF中 dis_data=BUF[0]; dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据 temp=(float)dis_data/1.2; data=(int)temp; ifg=0; break; } return 100; } /*************************************************************** ** 功能: 读取光照度 ** 参数: 无参数 ** 返回值: 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(); //连续读出数据,存储在BUF中 delay_ms(150); dis_data1=BUF[0]; dis_data1=(dis_data1<<8)+BUF[1];//合成数据,即光照数据 temp_a=(float)dis_data1/1.2; data_a=(int)temp_a; return data_a; }