• 方案介紹
    • 一、環(huán)境介紹
    • 二、BH1750介紹
    • 三、核心代碼
  • 附件下載
  • 相關推薦
申請入駐 產業(yè)圖譜

STM32+BH1750光敏傳感器獲取光照強度

02/02 08:37
2644
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

一、環(huán)境介紹

MCU:??STM32F103ZET6

光敏傳感器:?BH1750數(shù)字傳感器(IIC接口)

開發(fā)軟件:?Keil5

代碼說明:使用IIC模擬時序驅動,方便移植到其他平臺,采集的光照度比較靈敏.? 合成的光照度返回值范圍是 0~255。 0表示全黑? 255表示很亮。

實測:? ?手機閃光燈照著的狀態(tài)返回值是245左右,手捂著的狀態(tài)返回值是10左右.

完整工程代碼下載:
https://download.csdn.net/download/xiaolong1126626497/18500653

二、BH1750介紹

三、核心代碼

BH1750說明:? ADDR引腳接地,地址就是0x46

3.1 iic.c

#include "iic.h"

/*
函數(shù)功能:IIC接口初始化
硬件連接:
SDA:PB7
SCL:PB6
*/
void IIC_Init(void)
{
	RCC->APB2ENR|=1<<3;//PB
	GPIOB->CRL&=0x00FFFFFF;
	GPIOB->CRL|=0x33000000;
	GPIOB->ODR|=0x3<<6;
}

/*
函數(shù)功能:IIC總線起始信號
*/
void IIC_Start(void)
{
		IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
		IIC_SDA_OUT=1; 		 //數(shù)據線拉高
		IIC_SCL=1;     		 //時鐘線拉高
		DelayUs(4);        //電平保持時間
		IIC_SDA_OUT=0; 		 //數(shù)據線拉低
		DelayUs(4);        //電平保持時間
		IIC_SCL=0;     		 //時鐘線拉低
}


/*
函數(shù)功能:IIC總線停止信號
*/
void IIC_Stop(void)
{
		IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
		IIC_SDA_OUT=0; 		 //數(shù)據線拉低
		IIC_SCL=0;     		 //時鐘線拉低
		DelayUs(4);        //電平保持時間
		IIC_SCL=1;     		 //時鐘線拉高
		DelayUs(4);        //電平保持時間
		IIC_SDA_OUT=1; 		 //數(shù)據線拉高
}

/*
函數(shù)功能:獲取應答信號
返 回 值:1表示失敗,0表示成功
*/
u8 IIC_GetACK(void)
{
		u8 cnt=0;
		IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
		IIC_SDA_OUT=1; 		  //數(shù)據線上拉
	  DelayUs(2);         //電平保持時間
		IIC_SCL=0;     		  //時鐘線拉低,告訴從機,主機需要數(shù)據
		DelayUs(2);         //電平保持時間,等待從機發(fā)送數(shù)據
	  IIC_SCL=1;     		  //時鐘線拉高,告訴從機,主機現(xiàn)在開始讀取數(shù)據
		while(IIC_SDA_IN)   //等待從機應答信號
		{
				cnt++;
				if(cnt>250)return 1;
		}
		IIC_SCL=0;     		  //時鐘線拉低,告訴從機,主機需要數(shù)據
		return 0;
}

/*
函數(shù)功能:主機向從機發(fā)送應答信號
函數(shù)形參:0表示應答,1表示非應答
*/
void IIC_SendACK(u8 stat)
{
		IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
		IIC_SCL=0;     		 //時鐘線拉低,告訴從機,主機需要發(fā)送數(shù)據
		if(stat)IIC_SDA_OUT=1; //數(shù)據線拉高,發(fā)送非應答信號
		else IIC_SDA_OUT=0; 	 //數(shù)據線拉低,發(fā)送應答信號
		DelayUs(2);            //電平保持時間,等待時鐘線穩(wěn)定
		IIC_SCL=1;     		     //時鐘線拉高,告訴從機,主機數(shù)據發(fā)送完畢
		DelayUs(2);            //電平保持時間,等待從機接收數(shù)據
		IIC_SCL=0;     		  	 //時鐘線拉低,告訴從機,主機需要數(shù)據
}


/*
函數(shù)功能:IIC發(fā)送1個字節(jié)數(shù)據
函數(shù)形參:將要發(fā)送的數(shù)據
*/
void IIC_WriteOneByteData(u8 data)
{
		u8 i;
		IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
		IIC_SCL=0;     		 //時鐘線拉低,告訴從機,主機需要發(fā)送數(shù)據
		for(i=0;i<8;i++)
		{
				if(data&0x80)IIC_SDA_OUT=1; //數(shù)據線拉高,發(fā)送1
				else IIC_SDA_OUT=0; 	 //數(shù)據線拉低,發(fā)送0
				IIC_SCL=1;     		     //時鐘線拉高,告訴從機,主機數(shù)據發(fā)送完畢
				DelayUs(2);            //電平保持時間,等待從機接收數(shù)據
				IIC_SCL=0;     		 		 //時鐘線拉低,告訴從機,主機需要發(fā)送數(shù)據
				DelayUs(2);            //電平保持時間,等待時鐘線穩(wěn)定
				data<<=1;              //先發(fā)高位
		}
}


/*
函數(shù)功能:IIC接收1個字節(jié)數(shù)據
返 回 值:收到的數(shù)據
*/
u8 IIC_ReadOneByteData(void)
{
		u8 i,data;
		IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
	  for(i=0;i<8;i++)
	  {
			 	IIC_SCL=0;     		  //時鐘線拉低,告訴從機,主機需要數(shù)據
				DelayUs(2);         //電平保持時間,等待從機發(fā)送數(shù)據
				IIC_SCL=1;     		  //時鐘線拉高,告訴從機,主機現(xiàn)在正在讀取數(shù)據
				data<<=1;           
				if(IIC_SDA_IN)data|=0x01;
				DelayUs(2);         //電平保持時間,等待時鐘線穩(wěn)定
	  }
		IIC_SCL=0;     		  		//時鐘線拉低,告訴從機,主機需要數(shù)據 (必須拉低,否則將會識別為停止信號)
		return data;
}


3.2 iic.h

#ifndef _IIC_H
#define _IIC_H
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#define IIC_SDA_OUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x30000000;}
#define IIC_SDA_INPUTMODE() {GPIOB->CRL&=0x0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define IIC_SDA_OUT PBout(7)  //數(shù)據線輸出
#define IIC_SDA_IN PBin(7)  //數(shù)據線輸入
#define IIC_SCL PBout(6)  //時鐘線

void IIC_Init(void);
void IIC_Start(void);
void IIC_Stop(void);
u8 IIC_GetACK(void);
void IIC_SendACK(u8 stat);
void IIC_WriteOneByteData(u8 data);
u8 IIC_ReadOneByteData(void);
#endif

3.3 BH1750.h

#ifndef _BH1750_H
#define _BH1750_H
#include "delay.h"
#include "iic.h"
#include "usart.h"
u8 Read_BH1750_Data(void);
#endif

3.4 BH1750.c

#include "bh1750.h"
u8 Read_BH1750_Data()
{
    unsigned char t0;
    unsigned char t1;
    unsigned char t;
    u8 r_s=0;
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:1rn");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//獲取應答
     if(r_s)printf("error:2rn");
    IIC_Stop(); //停止信號 
    
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:3rn");
    IIC_WriteOneByteData(0x01);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:4rn");
    IIC_Stop(); //停止信號 
    
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x46);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:5rn");
    IIC_WriteOneByteData(0x10);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:6rn");
    IIC_Stop(); //停止信號 
    
    DelayMs(300); //等待
    
    IIC_Start(); //發(fā)送起始信號
    IIC_WriteOneByteData(0x47);
    r_s=IIC_GetACK();//獲取應答
    if(r_s)printf("error:7rn");
    
    t0=IIC_ReadOneByteData(); //接收數(shù)據
    IIC_SendACK(0); //發(fā)送應答信號
    t1=IIC_ReadOneByteData(); //接收數(shù)據
    IIC_SendACK(1); //發(fā)送非應答信號
    IIC_Stop(); //停止信號
    
     t=(((t0<<8)|t1)/1.2);
     return t;  
}

3.5 main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "at24c02.h"
#include "bh1750.h"

int main()
{
	u8 val;
	LED_Init();
	BEEP_Init();
	KeyInit();
  USARTx_Init(USART1,72,115200);
  IIC_Init();
  
	while(1)
	{
		val=KeyScan();
		if(val)
		{
            val=Read_BH1750_Data();
            printf("光照強度=%drn",val);
//			 BEEP=!BEEP;
			 LED0=!LED0;
			 LED1=!LED1;
		}
	}
}

? 3.6? 運行效果圖

  • 更多詳細資料請聯(lián)系.docx
    下載

相關推薦