- #include "bh1750.h"
- #define SlaveAddress 0x46 //定義器件在IIC總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
- unsigned char BUF[4]; //接收數(shù)據(jù)緩存區(qū)
- /***************************************************************
- ** 功能: IIC端口初始化
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- 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); //根據(jù)設定參數(shù)初始化
- 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); //根據(jù)設定參數(shù)初始化
- }
- 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); //根據(jù)設定參數(shù)初始化
-
- }
- /***************************************************************
- ** 功能: 產(chǎn)生IIC起始信號
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- 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總線,準備發(fā)送或接收數(shù)據(jù)
- }
- /***************************************************************
- ** 功能: 產(chǎn)生IIC停止信號
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- void BH1750_Stop()
- {
- SDA_OUT();//sda線輸出
- CLRSDA;//STOP:when CLK is high DATA change form low to high
- SETSCL;
- delay_us(4);
- SETSDA;//發(fā)送I2C總線結(jié)束信號
- delay_us(4);
- }
- /***************************************************************
- ** 功能: 產(chǎn)生IIC應答信號
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- void BH1750_SendACK(unsigned char ack)
- {
- SDA_OUT(); //sda線輸出
- if(ack)
- {
- SETSDA; //寫應答信號
- }
- else
- {
- CLRSDA;
- }
- SETSCL; //拉高時鐘線
- delay_us(2); //延時
- CLRSCL; //拉低時鐘線
- delay_us(2); //延時
- }
- /***************************************************************
- ** 功能: 產(chǎn)生IIC接收信號
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- unsigned char BH1750_RecvACK()
- {
- unsigned char data;
- SDA_IN(); //SDA設置為輸入
- SETSCL; //拉高時鐘線
- delay_us(2); //延時
- data = READ_SDA; //讀應答信號
- CLRSCL; //拉低時鐘線
- delay_us(2); //延時
- return data;
- }
- /***************************************************************
- ** 功能: 向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)
- ** 參數(shù): dat:一字節(jié)數(shù)據(jù)
- ** 返回值: 無
- ****************************************************************/
- void BH1750_SendByte(unsigned char dat)
- {
- unsigned char i,bit;
- SDA_OUT(); //sda線輸出
- for (i=0; i<8; i++) //8位計數(shù)器
- {
- bit=dat&0x80;
- if(bit)
- {
- SETSDA;
- }
- else
- CLRSDA;
- dat <<= 1; //移出數(shù)據(jù)的最高位
- SETSCL; //拉高時鐘線
- delay_us(2); //延時
- CLRSCL; //拉低時鐘線
- delay_us(2); //延時
- }
- BH1750_RecvACK();
- }
- /***************************************************************
- ** 功能: 從IIC總線接收一個字節(jié)數(shù)據(jù)
- ** 參數(shù): 無參數(shù)
- ** 返回值: dat:接收一字節(jié)數(shù)據(jù)
- ****************************************************************/
- unsigned char BH1750_RecvByte()
- {
- unsigned char i;
- unsigned char dat = 0;
- unsigned char a;
- SDA_IN(); //SDA設置為輸入
- SETSDA; //使能內(nèi)部上拉,準備讀取數(shù)據(jù),
- for(i=0; i<8; i++) //8位計數(shù)器
- {
- dat <<= 1;
- SETSCL; //拉高時鐘線
- delay_us(2); //延時
- a=READ_SDA;//讀SDA數(shù)據(jù)
- if(a==1)dat+=1;
- CLRSCL; //拉低時鐘線
- delay_us(2); //延時
- }
- return dat;
- }
- /***************************************************************
- ** 功能: 向bh1750寫入命令
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- void Single_Write_BH1750( unsigned char REG_Address)
- {
- BH1750_Start(); //起始信號
- BH1750_SendByte(SlaveAddress); //發(fā)送設備地址+寫信號
- BH1750_SendByte(REG_Address); //內(nèi)部寄存器地址,
- BH1750_Stop(); //發(fā)送停止信號
- }
- /***************************************************************
- ** 功能: 連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- void Multiple_Read_BH1750(void)
- {
- unsigned char i;
- BH1750_Start(); //起始信號
- BH1750_SendByte(SlaveAddress+1); //發(fā)送設備地址+讀信號
- for(i=0; i<3; i++) //連續(xù)讀取2個地址數(shù)據(jù),存儲中BUF
- {
- BUF[i] = BH1750_RecvByte(); //BUF[0]存儲0x32地址中的數(shù)據(jù)
- if(i == 3)
- {
- BH1750_SendACK(1); //最后一個數(shù)據(jù)需要回NOACK
- }
- else
- {
- BH1750_SendACK(0); //回應ACK
- }
- }
- BH1750_Stop(); //停止信號
- // delay_ms(150);
- }
- /***************************************************************
- ** 功能: 初始化BH1750
- ** 參數(shù): 無參數(shù)
- ** 返回值: 無
- ****************************************************************/
- void BH1750_Init()
- {
- BH1750IO_Init();
- Single_Write_BH1750(0x01);
- CLRADDR; //將ADDR位初始化拉低
- }
- /***************************************************************
- ** 功能: 讀取光照度
- ** 參數(shù): 無參數(shù)
- ** 返回值: 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在執(zhí)行讀取數(shù)據(jù)
-
- case 1:
- Multiple_Read_BH1750(); //連續(xù)讀出數(shù)據(jù),存儲在BUF中
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];//合成數(shù)據(jù),即光照數(shù)據(jù)
- temp=(float)dis_data/1.2;
- data=(int)temp;
- ifg=0;
- break;
- }
- return 100;
- }
- /***************************************************************
- ** 功能: 讀取光照度
- ** 參數(shù): 無參數(shù)
- ** 返回值: 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(); //連續(xù)讀出數(shù)據(jù),存儲在BUF中
- delay_ms(150);
- dis_data1=BUF[0];
- dis_data1=(dis_data1<<8)+BUF[1];//合成數(shù)據(jù),即光照數(shù)據(jù)
- temp_a=(float)dis_data1/1.2;
- data_a=(int)temp_a;
- return data_a;
- }
復制代碼 |