硬件:
BH1750.c
#include "BH1750.h"
void GPIOConfig( void )
{
GPIO_InitTypeDef GPIO_InitStruct;
/*¿ªÆôGPIOBµÄÍâÉèʱÖÓ*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda | scl;
GPIO_Init( GPIOA, &GPIO_InitStruct );
}
void Delay_5us( void )
{
delay_us(5);
}
void Delay_mms( unsigned int tmp )
{
unsigned int i = 0;
while ( tmp-- )
{
delay_ms(1);
}
}
/***¿ªÊ¼ÐźÅ***/
void BH1750_Start()
{
GPIO_SetBits( GPIOA, sda ); /* À¸ßÊý¾ÝÏß */
GPIO_SetBits( GPIOA, scl ); /* À¸ßʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
GPIO_ResetBits( GPIOA, sda ); /* ²úÉúϽµÑØ */
Delay_5us(); /* ÑÓʱ */
GPIO_ResetBits( GPIOA, scl ); /* ÀµÍʱÖÓÏß */
}
/*****Í£Ö¹ÐźÅ******/
void BH1750_Stop()
{
GPIO_ResetBits( GPIOA, sda ); /* ÀµÍÊý¾ÝÏß */
GPIO_SetBits( GPIOA, scl ); /* À¸ßʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
GPIO_SetBits( GPIOA, sda ); /* ²úÉúÉÏÉýÑØ */
Delay_5us(); /* ÑÓʱ */
}
/**************************************
* ·¢ËÍÓ¦´ðÐźÅ
* Èë¿Ú²ÎÊý:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK( unsigned int ack )
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_Init( GPIOA, &GPIO_InitStruct );
if ( ack == 1 ) /* дӦ´ðÐźŠ*/
GPIO_SetBits( GPIOA, sda );
else if ( ack == 0 )
GPIO_ResetBits( GPIOA, sda );
else
return;
GPIO_SetBits( GPIOA, scl ); /* À¸ßʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
GPIO_ResetBits( GPIOA, scl ); /* ÀµÍʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
}
/**************************************
* ½ÓÊÕÓ¦´ðÐźÅ
**************************************/
unsigned int BH1750_RecvACK()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; /*ÕâÀïÒ»¶¨ÒªÉè³ÉÊäÈëÉÏÀ£¬·ñÔò²»ÄܶÁ³öÊý¾Ý*/
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_Init( GPIOA, &GPIO_InitStruct );
GPIO_SetBits( GPIOA, scl ); /* À¸ßʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
if ( GPIO_ReadInputDataBit( GPIOA, sda ) == 1 ) /* ¶ÁÓ¦´ðÐźŠ*/
mcy = 1;
else
mcy = 0;
GPIO_ResetBits( GPIOA, scl ); /* ÀµÍʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOA, &GPIO_InitStruct );
return(mcy);
}
/**************************************
* ÏòIIC×ÜÏß·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ý
**************************************/
void BH1750_SendByte( unsigned char dat )
{
unsigned char i;
for ( i = 0; i < 8; i++ ) /* 8λ¼ÆÊýÆ÷ */
{
if ( 0X80 & dat )
GPIO_SetBits( GPIOA, sda );
else
GPIO_ResetBits( GPIOA, sda );
dat <<= 1;
GPIO_SetBits( GPIOA, scl ); /* À¸ßʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
GPIO_ResetBits( GPIOA, scl ); /* ÀµÍʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
}
BH1750_RecvACK();
}
unsigned char BH1750_RecvByte()
{
unsigned char i;
unsigned char dat = 0;
unsigned char bit;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; /*ÕâÀïÒ»¶¨ÒªÉè³ÉÊäÈëÉÏÀ£¬·ñÔò²»ÄܶÁ³öÊý¾Ý*/
GPIO_InitStruct.GPIO_Pin = sda;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct );
GPIO_SetBits( GPIOA, sda ); /* ʹÄÜÄÚ²¿ÉÏÀ,×¼±¸¶ÁÈ¡Êý¾Ý, */
for ( i = 0; i < 8; i++ ) /* 8λ¼ÆÊýÆ÷ */
{
dat <<= 1;
GPIO_SetBits( GPIOA, scl ); /* À¸ßʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
if ( SET == GPIO_ReadInputDataBit( GPIOA, sda ) )
bit = 0X01;
else
bit = 0x00;
dat |= bit; /* ¶ÁÊý¾Ý */
GPIO_ResetBits( GPIOA, scl ); /* ÀµÍʱÖÓÏß */
Delay_5us(); /* ÑÓʱ */
}
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init( GPIOA, &GPIO_InitStruct );
return(dat);
}
void Single_Write_BH1750( unsigned char REG_Address )
{
BH1750_Start(); /* ÆðʼÐźŠ*/
BH1750_SendByte( SlaveAddress ); /* ·¢ËÍÉ豸µØÖ·+дÐźŠ*/
BH1750_SendByte( REG_Address ); /* ÄÚ²¿¼Ä´æÆ÷µØÖ·£¬Çë²Î¿¼ÖÐÎÄpdf22Ò³ */
/* BH1750_SendByte(REG_data); //ÄÚ²¿¼Ä´æÆ÷Êý¾Ý£¬Çë²Î¿¼ÖÐÎÄpdf22Ò³ */
BH1750_Stop(); /* ·¢ËÍÍ£Ö¹ÐźŠ*/
}
/* ³õʼ»¯BH1750£¬¸ù¾ÝÐèÒªÇë²Î¿¼pdf½øÐÐÐÞ¸Ä**** */
void Init_BH1750()
{
GPIOConfig();
Single_Write_BH1750( 0x01 );
}
/* Á¬Ðø¶Á³öBH1750ÄÚ²¿Êý¾Ý */
void mread( void )
{
unsigned char i;
BH1750_Start(); /* ÆðʼÐźŠ*/
BH1750_SendByte( SlaveAddress + 1 ); /* ·¢ËÍÉ豸µØÖ·+¶ÁÐźŠ*/
for ( i = 0; i < 3; i++ ) /* Á¬Ðø¶ÁÈ¡6¸öµØÖ·Êý¾Ý£¬´æ´¢ÖÐBUF */
{
BUF[i] = BH1750_RecvByte(); /* BUF[0]´æ´¢0x32µØÖ·ÖеÄÊý¾Ý */
if ( i == 3 )
{
BH1750_SendACK( 1 ); /* ×îºóÒ»¸öÊý¾ÝÐèÒª»ØNOACK */
}else {
BH1750_SendACK( 0 ); /* »ØÓ¦ACK */
}
}
BH1750_Stop(); /* Í£Ö¹ÐźŠ*/
Delay_mms( 5 );
}
BH1750.h
#ifndef __BH1750_H__
#define __BH1750_H__
#include "sys.h"
#define sda GPIO_Pin_4 /* 20 */
#define scl GPIO_Pin_3 /* 21 */
#define SlaveAddress 0x46 /*
* ¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä
* ALT ADDRESSÒý½Å½ÓµØʱµØַΪ0xA6£¬½ÓµçԴʱµØַΪ0x3A
*/
extern unsigned char BUF[8]; /* ½ÓÊÕÊý¾Ý»º´æÇø */
extern int dis_data; /* ±äÁ¿ */
extern int mcy; /* ±íʾ½øλ±ê־λ */
void Init_BH1750( void );
void conversion( unsigned int temp_data );
void Single_Write_BH1750( unsigned char REG_Address ); /* µ¥¸öдÈëÊý¾Ý */
unsigned char Single_Read_BH1750( unsigned char REG_Address ); /* µ¥¸ö¶ÁÈ¡ÄÚ²¿¼Ä´æÆ÷Êý¾Ý */
void mread( void ); /* Á¬ÐøµÄ¶ÁÈ¡ÄÚ²¿¼Ä´æÆ÷Êý¾Ý */
void Delay_5us( void );
void Delay_mms( unsigned int tmp );
void GPIOConfig( void );
#endif
使用:
- 在main.c里面#include “BH1750.h”
- 在main.c里声明下面几个全局变量
unsigned char BUF[8]; /* ¶ÁÈ¡¹âÇ¿ÖмäÁ¿ */
int dis_data; /* ¶ÁÈ¡¹âÇ¿ÖмäÁ¿ */
int mcy; /* ¶ÁÈ¡¹âÇ¿ÖмäÁ¿ */
float lightPower; /* ´æ´¢¹âÇ¿µÄ±äÁ¿ */
- 在main.c里初始化 Init_BH1750(); /* init BH1750 */
- 在while(1)里面,得出的lightPower就是光强 单位是lx
delay_ms( 5 );
t++;
if ( t > 40 )
{
mread(); /* Á¬Ðø¶ÁÈ¡gy30Êý¾Ý */
dis_data = BUF[0];
dis_data = (dis_data << 8) + BUF[1]; /* ºÏ³ÉÊý¾Ý */
lightPower = (float) dis_data / 1.2; /* µÃ³ö¹âÇ¿ µ¥Î»ÊÇlx */
Single_Write_BH1750( 0x01 ); /* power on */
Single_Write_BH1750( 0x10 ); /* H- resolution mode */
display(); /* ¸üÐÂÏÔʾ */
t = 0;
}
参考main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
#include "oled.h" /* oled */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "BH1750.h"
unsigned char BUF[8]; /* ¶ÁÈ¡¹âÇ¿ÖмäÁ¿ */
int dis_data; /* ¶ÁÈ¡¹âÇ¿ÖмäÁ¿ */
int mcy; /* ¶ÁÈ¡¹âÇ¿ÖмäÁ¿ */
float lightPower; /* ´æ´¢¹âÇ¿µÄ±äÁ¿ */
extern struct ds1302time time; /* 1302ʱ¼ä */
char xianshi[30];
u8 tmp_buf[33]; /* 24l02½ÓÊÜbuf */
void display( void )
{
//ÏÔʾʱ¼äÄ£¿éµÄʱ·ÖÃë
memset( xianshi, 0, sizeof(xianshi) );
sprintf( xianshi, "%02d:%02d:%02d", time.hour, time.minute, time.second );
OLED_P8x16Str( 0, 2, xianshi, 0 );
//ÏÔʾ¹âÇ¿
memset( xianshi, 0, sizeof(xianshi) );
sprintf( xianshi, "%.1f", lightPower );
OLED_P8x16Str( 0, 4, xianshi, 0 );
}
int main( void )
{
u8 t = 0;
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 ); /* ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ */
delay_init(); /* ÑÓʱº¯Êý³õʼ»¯ */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable, ENABLE ); /* ¹Ø±Õjtag£¬Ê¹ÄÜSWD£¬¿ÉÒÔÓÃSWDģʽµ÷ÊÔ */
uart_init( 9600 ); /* uart */
Init_BH1750(); /* init BH1750 */
while ( 1 )
{
delay_ms( 5 );
t++;
if ( t > 40 )
{
mread(); /* Á¬Ðø¶ÁÈ¡gy30Êý¾Ý */
dis_data = BUF[0];
dis_data = (dis_data << 8) + BUF[1]; /* ºÏ³ÉÊý¾Ý */
lightPower = (float) dis_data / 1.2; /* µÃ³ö¹âÇ¿ µ¥Î»ÊÇlx */
Single_Write_BH1750( 0x01 ); /* power on */
Single_Write_BH1750( 0x10 ); /* H- resolution mode */
display(); /* ¸üÐÂÏÔʾ */
t = 0;
}
}
}