?
一、環(huán)境介紹
開發(fā)軟件:Keil5
代碼說明:使用IIC模擬時序驅(qū)動,方便移植到其他平臺,采集的光照度比較靈敏. 合成的光照度返回值范圍是 0~255。 0表示全黑 255表示很亮。
實測: 手機(jī)閃光燈照著的狀態(tài)返回值是245左右,手捂著的狀態(tài)返回值是10左右.
?
?
二、BH1750介紹
?
?
?
三、核心代碼
BH1750說明: ADDR引腳接地,地址就是0x46
完整工程代碼下載:https://download.csdn.net/download/xiaolong1126626497/18500653
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ù)據(jù)線拉高
IIC_SCL=1; //時鐘線拉高
DelayUs(4); //電平保持時間
IIC_SDA_OUT=0; //數(shù)據(jù)線拉低
DelayUs(4); //電平保持時間
IIC_SCL=0; //時鐘線拉低
}
/*
函數(shù)功能:IIC總線停止信號
*/
void IIC_Stop(void)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SDA_OUT=0; //數(shù)據(jù)線拉低
IIC_SCL=0; //時鐘線拉低
DelayUs(4); //電平保持時間
IIC_SCL=1; //時鐘線拉高
DelayUs(4); //電平保持時間
IIC_SDA_OUT=1; //數(shù)據(jù)線拉高
}
/*
函數(shù)功能:獲取應(yīng)答信號
返 回 值:1表示失敗,0表示成功
*/
u8 IIC_GetACK(void)
{
u8 cnt=0;
IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
IIC_SDA_OUT=1; //數(shù)據(jù)線上拉
DelayUs(2); //電平保持時間
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
DelayUs(2); //電平保持時間,等待從機(jī)發(fā)送數(shù)據(jù)
IIC_SCL=1; //時鐘線拉高,告訴從機(jī),主機(jī)現(xiàn)在開始讀取數(shù)據(jù)
while(IIC_SDA_IN) //等待從機(jī)應(yīng)答信號
{
cnt++;
if(cnt>250)return 1;
}
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
return 0;
}
/*
函數(shù)功能:主機(jī)向從機(jī)發(fā)送應(yīng)答信號
函數(shù)形參:0表示應(yīng)答,1表示非應(yīng)答
*/
void IIC_SendACK(u8 stat)
{
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
if(stat)IIC_SDA_OUT=1; //數(shù)據(jù)線拉高,發(fā)送非應(yīng)答信號
else IIC_SDA_OUT=0; //數(shù)據(jù)線拉低,發(fā)送應(yīng)答信號
DelayUs(2); //電平保持時間,等待時鐘線穩(wěn)定
IIC_SCL=1; //時鐘線拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
DelayUs(2); //電平保持時間,等待從機(jī)接收數(shù)據(jù)
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
}
/*
函數(shù)功能:IIC發(fā)送1個字節(jié)數(shù)據(jù)
函數(shù)形參:將要發(fā)送的數(shù)據(jù)
*/
void IIC_WriteOneByteData(u8 data)
{
u8 i;
IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
for(i=0;i<8;i++)
{
if(data&0x80)IIC_SDA_OUT=1; //數(shù)據(jù)線拉高,發(fā)送1
else IIC_SDA_OUT=0; //數(shù)據(jù)線拉低,發(fā)送0
IIC_SCL=1; //時鐘線拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
DelayUs(2); //電平保持時間,等待從機(jī)接收數(shù)據(jù)
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
DelayUs(2); //電平保持時間,等待時鐘線穩(wěn)定
data<<=1; //先發(fā)高位
}
}
/*
函數(shù)功能:IIC接收1個字節(jié)數(shù)據(jù)
返 回 值:收到的數(shù)據(jù)
*/
u8 IIC_ReadOneByteData(void)
{
u8 i,data;
IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
for(i=0;i<8;i++)
{
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
DelayUs(2); //電平保持時間,等待從機(jī)發(fā)送數(shù)據(jù)
IIC_SCL=1; //時鐘線拉高,告訴從機(jī),主機(jī)現(xiàn)在正在讀取數(shù)據(jù)
data<<=1;
if(IIC_SDA_IN)data|=0x01;
DelayUs(2); //電平保持時間,等待時鐘線穩(wěn)定
}
IIC_SCL=0; //時鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù) (必須拉低,否則將會識別為停止信號)
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ù)據(jù)線輸出
#define IIC_SDA_IN PBin(7) //數(shù)據(jù)線輸入
#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();//獲取應(yīng)答
if(r_s)printf("error:1\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:2\r\n");
IIC_Stop(); //停止信號
IIC_Start(); //發(fā)送起始信號
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:3\r\n");
IIC_WriteOneByteData(0x01);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:4\r\n");
IIC_Stop(); //停止信號
IIC_Start(); //發(fā)送起始信號
IIC_WriteOneByteData(0x46);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:5\r\n");
IIC_WriteOneByteData(0x10);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:6\r\n");
IIC_Stop(); //停止信號
DelayMs(300); //等待
IIC_Start(); //發(fā)送起始信號
IIC_WriteOneByteData(0x47);
r_s=IIC_GetACK();//獲取應(yīng)答
if(r_s)printf("error:7\r\n");
t0=IIC_ReadOneByteData(); //接收數(shù)據(jù)
IIC_SendACK(0); //發(fā)送應(yīng)答信號
t1=IIC_ReadOneByteData(); //接收數(shù)據(jù)
IIC_SendACK(1); //發(fā)送非應(yīng)答信號
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("光照強(qiáng)度=%d\r\n",val);
// BEEP=!BEEP;
LED0=!LED0;
LED1=!LED1;
}
}
}
3.6 運(yùn)行效果圖
審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
傳感器
+關(guān)注
關(guān)注
2542文章
50241瀏覽量
750099 -
STM32
+關(guān)注
關(guān)注
2263文章
10846瀏覽量
353699
發(fā)布評論請先 登錄
相關(guān)推薦
光照傳感器和光敏電阻區(qū)別在哪
光照傳感器和光敏電阻是兩種不同的光電元件,它們在光電領(lǐng)域中有著廣泛的應(yīng)用。雖然它們都對光有響應(yīng),但它們在工作原理、結(jié)構(gòu)、性能、應(yīng)用等方面存在顯著差異。 一、工作原理 光照
光照傳感器和光敏傳感器一樣嗎
光照傳感器和光敏傳感器并不完全一樣 ,它們在工作原理、應(yīng)用場景以及優(yōu)缺點(diǎn)上都有所不同。 一、工作原理 光照
CW32模塊使用:光敏電阻光照傳感器
光敏電阻是用硫化隔或硒化隔等半導(dǎo)體材料制成的特殊電阻器,其工作原理是基于內(nèi)光電效應(yīng)。隨著光照強(qiáng)度的升高,電阻值迅速降低,由于光照產(chǎn)生的載流子都參與導(dǎo)電,在外加電場的作用下作漂移運(yùn)動,電
16位數(shù)字輸出型環(huán)境光強(qiáng)度傳感器集成電路bh1750FVI中文數(shù)據(jù)手冊
電子發(fā)燒友網(wǎng)站提供《16位數(shù)字輸出型環(huán)境光強(qiáng)度傳感器集成電路bh1750FVI中文數(shù)據(jù)手冊.pdf》資料免費(fèi)下載
發(fā)表于 09-11 14:26
?1次下載
光敏電阻在光照下阻值是減小還是增大
光敏電阻是一種特殊的電阻元件,其電阻值會隨著光照強(qiáng)度的變化而發(fā)生變化。在光照下,光敏電阻的阻值是減小還是增大,取決于光敏電阻的類型和材料。
光敏電阻在無光照射時呈什么狀態(tài)
光敏電阻是一種特殊的電阻器,其電阻值會隨著光照強(qiáng)度的變化而變化。在無光照射時,光敏電阻的電阻值會顯著增大,表現(xiàn)出高阻抗的特性。 一、
光敏電阻隨光照強(qiáng)度的變化規(guī)律
光敏電阻是一種半導(dǎo)體材料,其電阻值會隨著光照強(qiáng)度的變化而變化。這種特性使得光敏電阻在許多領(lǐng)域得到廣泛應(yīng)用,如光控開關(guān)、光度計、自動控制等。 一、光敏電阻的工作原理
光敏電阻與光照強(qiáng)度的關(guān)系是什么
光敏電阻是一種特殊的電阻元件,其電阻值會隨著光照強(qiáng)度的變化而變化。 一、光敏電阻的工作原理 光敏電阻是一種半導(dǎo)體材料制成的電阻元件,其電阻值會隨著光
基于STM32單片機(jī)的智能書房系統(tǒng)設(shè)計
本次設(shè)計的系統(tǒng)是以STM32F103單片機(jī)作為核心控制器,可以通過光照傳感器對書房內(nèi)的光照強(qiáng)度進(jìn)行采集,可以通過溫度
硅光電池測量光照強(qiáng)度
我了解到的原理是,硅光電池的電池內(nèi)阻遠(yuǎn)大于R1,且在一定光強(qiáng)范圍內(nèi),輸出電流(uA級別)隨光照強(qiáng)度的增加而線性增加,所以我想通過2DU3硅光電池通過以下電路,將硅光電池輸出電流通過R1轉(zhuǎn)化為電壓,并
發(fā)表于 04-02 15:20
【外設(shè)移植】I2C 光照度傳感器(BH1750)M61開發(fā)板驅(qū)動
本作品由安信可社區(qū)用戶 制作 IC光度傳感器模塊種類很多,我選擇一種比較常用的模塊(BH1750)做外設(shè)移植。BH1750的優(yōu)點(diǎn)如下: 1、支持標(biāo)準(zhǔn)快速模式的IIC通信 2、模塊IIC通信地址可以
光敏傳感器的組成 光敏傳感器的應(yīng)用
光敏傳感器的組成 光敏傳感器的應(yīng)用 光敏傳感器是一種能夠檢測和測量光能的設(shè)備,廣泛應(yīng)用于光電變換
【飛騰派4G版免費(fèi)試用】硬件編程、運(yùn)行、代碼編譯之I2C光照傳感器調(diào)試
。它采用了專門的光敏元件和 ADC(模數(shù)轉(zhuǎn)換器),能夠?qū)?b class='flag-5'>光照強(qiáng)度轉(zhuǎn)換為數(shù)字輸出。BH1750 芯片具有高分辨率和廣泛的動態(tài)范圍,適用于各種光照
發(fā)表于 12-17 18:00
光敏電阻的特性、構(gòu)成、分類及測量
光敏電阻的特性、構(gòu)成、分類及測量? 光敏電阻(Light Dependent Resistor,LDR)又稱為光敏電阻器、光電阻器或光阻,是一種能夠根據(jù)
評論