#include "bh1750.h" #include "public.h" #define bh1750_SlaveAddress 0x46 unsigned char bh1750_buffer[4]={0}; //void system_delay_us(unsigned int n); //void system_delay_ms(int x); /*************************************************************** ** 功能: IIC端口初始化 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750IO_Init(void) { BH1750_SCL_PIN_OUT(); BH1750_SDA_PIN_OUT(); } /*************************************************************** ** 功能: 产生IIC起始信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_Start(void) { BH1750_SDA_PIN_OUT(); //sda线输出 SETSDA; SETSCL; system_delay_us(4); CLRSDA;//START:when CLK is high,DATA change form high to low system_delay_us(4); CLRSCL;//钳住I2C总线,准备发送或接收数据 } /*************************************************************** ** 功能: 产生IIC停止信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_Stop(void) { BH1750_SDA_PIN_OUT();///sda线输出 CLRSDA;//STOP:when CLK is high DATA change form low to high SETSCL; system_delay_us(4); SETSDA;//发送I2C总线结束信号 system_delay_us(4); } /*************************************************************** ** 功能: 产生IIC应答信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_SendACK(unsigned char ack) { BH1750_SDA_PIN_OUT(); //sda线输出 if(ack) { SETSDA; //写应答信号 } else { CLRSDA; } SETSCL; //拉高时钟线 system_delay_us(2); //延时 CLRSCL; //拉低时钟线 system_delay_us(2); //延时 } /*************************************************************** ** 功能: 产生IIC接收信号 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ unsigned char BH1750_RecvACK(void) { unsigned char data; BH1750_SDA_PIN_IN(); //SDA设置为输入 SETSCL; //拉高时钟线 system_delay_us(2); //延时 data = READ_SDA; //读应答信号 CLRSCL; //拉低时钟线 system_delay_us(2); //延时 return data; } /*************************************************************** ** 功能: 向IIC总线发送一个字节数据 ** 参数: dat:一字节数据 ** 返回值: 无 ****************************************************************/ void BH1750_SendByte(unsigned char dat) { unsigned char i,bit; BH1750_SDA_PIN_OUT(); for (i=0; i<8; i++) { bit=dat&0x80; if(bit) { SETSDA; } else CLRSDA; dat <<= 1; SETSCL; system_delay_us(2); CLRSCL; system_delay_us(2); } BH1750_RecvACK(); } /*************************************************************** ** 功能: 从IIC总线接收一个字节数据 ** 参数: 无参数 ** 返回值: dat:接收一字节数据 ****************************************************************/ unsigned char BH1750_RecvByte(void) { unsigned char i; unsigned char dat = 0; unsigned char a; BH1750_SDA_PIN_IN(); //SDA设置为输入 SETSDA; for(i=0; i<8; i++) { dat <<= 1; SETSCL; system_delay_us(2); a=READ_SDA; if(a==1)dat+=1; CLRSCL; system_delay_us(2); } return dat; } /*************************************************************** ** 功能: 向bh1750写入命令 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void Single_Write_BH1750( unsigned char REG_Address) { BH1750_Start(); //起始信号 BH1750_SendByte(bh1750_SlaveAddress); //发送设备地址+写信号 BH1750_SendByte(REG_Address); //内部寄存器地址, BH1750_Stop(); //发送停止信号 } /*************************************************************** ** 功能: 连续读出BH1750内部数据 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void Multiple_Read_BH1750(void) { unsigned char i; BH1750_Start(); //起始信号 BH1750_SendByte(bh1750_SlaveAddress+1); //发送设备地址+读信号 for(i=0; i<3; i++) //连续读取2个地址数据,存储中BUF { bh1750_buffer[i] = BH1750_RecvByte(); //bh1750_buffer[0]存储0x32地址中的数据 if(i == 3) { BH1750_SendACK(1); //最后一个数据需要回NOACK } else { BH1750_SendACK(0); //回应ACK } } BH1750_Stop(); //停止信号 } /*************************************************************** ** 功能: 初始化BH1750 ** 参数: 无参数 ** 返回值: 无 ****************************************************************/ void BH1750_Init() { BH1750IO_Init(); Single_Write_BH1750(0x01); //CLRADDR; //将ADDR位初始化拉低 } /*************************************************************** ** 功能: 读取光照度 ** 参数: 无参数 ** 返回值: data:返回光照度值 ****************************************************************/ unsigned int get_bh1750_value(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 system_delay_ms(200); //延时200ms Multiple_Read_BH1750(); //连续读出数据,存储在BUF中 system_delay_ms(150); dis_data1=bh1750_buffer[0]; dis_data1=(dis_data1<<8)+bh1750_buffer[1];//合成数据,即光照数据 temp_a=(float)dis_data1/1.2; data_a=(int)temp_a; return data_a; }