- #include "bh1750.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 = ADDR_GPIO_Pin|SCL_GPIO_Pin|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(GQ_GPIOx, &GPIO_InitStructure); //根据设定参数初始化
- GPIO_SetBits(GQ_GPIOx,ADDR_GPIO_Pin|SCL_GPIO_Pin|SDA_GPIO_Pin); //输出高
- }
- void In_mode(void)//SDA配置输入模式
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GQ_GPIOx, &GPIO_InitStructure); //根据设定参数初始化
- }
- void Out_mode(void)//SDA配置输出模式
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
- GPIO_InitStructure.GPIO_Pin = SDA_GPIO_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GQ_GPIOx, &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;
- }
复制代码 |