单片机 STM32 F103C8T6 GY-30 光强采集 正点原子版

硬件:
在这里插入图片描述
在这里插入图片描述
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;
		}
	}
}



发布了105 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/104648522