#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; }