| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
数字光强度+光照传感器BH1750FVI+模块+GY30 源程序 原理图和资料 
7 T+ \- T1 g" B% Q8 ]& Z2 m' n3 I& d% M$ ?9 c 
今天看到了,所以,发出来了,光强度模块客户资料: 
" h6 u6 r6 Q4 u. P/ V4 U- n8 B  2 v& k9 e5 J2 c; k 
  $ a) V+ K* `, j2 j% S 
   
  P9 X, ?4 X4 _  a/ h1 F8 J+ E/ d5 t& A& R+ `9 M& d) k/ {7 y! I; } 
 
; X; N8 m. E# Y8 q7 y/*****************************************- k1 T2 Q  w- e7 [# I8 a$ ` 
* 基于AVR单片机GY-30模块通信程序                  * 
9 i6 s, S$ z3 [* 功    能:IIC通信读取数据并显示        * 
; s0 K- G) ~1 T7 K) p* 时钟频率:内部11.0592M                                                  * 
6 [, B, W% f3 }' p* 设    计: 51黑电子论坛5 t! I9 ?" Q2 r1 F 
* 编译环境:ICC-AVR7.14                                         * 
) H' j0 q7 a& l' K. M/ a- C( F* 实验环境:ATmega16+1602                             *. o9 V( U+ x! G2 f 
* 使用端口:PC0,PC1,PC6,PC7,PA4~PA7          * 
- Y& O0 [* }5 S0 P, [* 参    考:莫锦攀实验程序24c02读取实验  *" c) U# h, L6 B$ X) ] 
*****************************************/ 
* E+ O) s/ R/ x( O* N, R( x#include <iom16v.h> 
* v. ]! \7 I, k/ V* E" S#include "I2C.h" 
  x  k3 s# z: g#include "1602.h"& f% d( k1 B# Q$ O: P8 q 
#include "delay.h"- z% Z" S" I  Q1 y5 A. z  E 
void conversion(unsigned int i);5 ]& f8 b: l6 | 
unsigned char display[9]={0,0,0,0,0,' ','l','u','x'};//显示数据& }* T" D3 y/ ]2 G 
/********************************************* 
" K4 u' [& m# L) D$ E1 C数据转换,十六进制数据转换成10进制 
, [6 m  s& @' O, @- n& c输入十六进制范围:0x0000-0x270f(0-9999)* G5 X9 A9 w* L$ R 
结果分成个十百千位,以ascii存入显示区 
5 z: A5 s" [' Z2 }& R**********************************************/ 
- u0 e4 r4 Z1 D( H! \  jvoid conversion(unsigned int i)  $ C" G# E% c. l( M: b( p: c 
{   
/ O$ o" X6 g( @3 T           display[0]=i/10000+0x30 ; 
; E( y1 @* c& u0 ]/ c    i=i%10000;    //取余运算' k& ^& C; x+ r% i 
        display[1]=i/1000+0x30 ;# M4 @) d7 K7 E# G& b( ?; i 
    i=i%1000;    //取余运算- f, Z5 o% l; e2 z 
    display[2]=i/100+0x30 ; 
) @3 k  E: K5 z7 ?# A    i=i%100;    //取余运算 
4 V% p& O" x- B+ Y  u    display[3]=i/10+0x30 ; 
$ {6 H5 I9 W+ Y8 L3 S, N    i=i%10;     //取余运算8 B* r- s: V/ q 
    display[4]=i+0x30;   
9 T# z6 g7 N; ~' \6 s5 k} 
" M$ ~# Z+ N6 x3 z5 V0 Z4 K! c. y/*******************************; ?$ Y, _! P& Y$ {1 n0 c 
主程序 
7 s% c2 y% C  D! }0 C*******************************/0 @- I0 r+ F7 g/ l' q" }% Y( i 
void main(void)9 y- E6 {$ m2 L8 X5 x; ^ 
{         
! |) @6 l3 w+ W2 H: r8 x' o; L        unsigned char i; 
) k/ m8 ?5 o3 [" W* a" u4 N- k        float  lux_data;                   //光数据    
# o' R% f* Z9 `          
+ y. K0 ?( b( E) g         delay_nms(10);                    //lcd上电延时# `& a* [' w/ J* _. G' P 
         LCD_init();                       //lcd初始化1 a# m+ D$ ]* o) I2 E+ T 
     i=I2C_Write(0x01);                //BH1750 初始化             
1 r- _1 j7 s, ?# g0 X, r         delay_nms(10);           
' T( h7 h% d/ k  W- c1 s        while(1){                          //循环   % J/ }5 k& t, \& L3 k 
         i=I2C_Write(0x01);                //power on6 ]; \" n, `5 Q" ?; ^2 i 
         i=I2C_Write(0x10);                //H- resolution mode 
2 [# N( ]( ^; {/ o& s& }. h         TWCR=0;                           //释放引脚7 V( Y2 @1 A0 f% g. ^3 u  Z  ` 
     delay_nms(180);                   //大约180ms 
& `  R# A! q) _           if(i==0){7 q( l* [3 O1 R* b+ u" i( X+ b+ _ 
             lux_data=I2C_Read();          //从iic总线读取数值          ]' C# {3 g* P9 o3 J 
                 lux_data=(float)lux_data/1.2; //pdf文档第7页 
9 C# ?8 G* G1 i: R$ Z. ]; C             conversion(lux_data);         //数据转换出个,十,百,千 位        
0 N2 }) [3 E. E  a2 w( Z' h. A' c2 e                 LCD_write_string(7,0,display);//显示数值,从第9列开始    
2 u% g. Z) K% O; o: p% S; P) E           }   
/ ^( q5 F; x9 i0 M    }' C% o8 }* T3 e2 f 
}! O7 F7 C: e% S' g2 R" U1 \ 
8 y7 ?5 A5 ?9 q- ^2 V% s5 E 
' j: T: @" a4 i% j' H 
51单片机源程序(附件里面还有avr单片机的):* r1 `. m8 q& d' C 
//*************************************** 
$ |9 O' ?7 S0 p, h& Z5 W// BH1750FVI IIC测试程序$ F+ F* f' C- E( }+ | 
// 使用单片机STC89C51  
& P8 ~1 z% N/ @: v// 晶振:11.0592M 
" Z$ ]4 Q( R+ C* o# P+ N// 显示:LCD1602) L/ V) b  l% Y 
// 编译环境 Keil uVision2 
" F- W5 G0 C/ K" U. s// 参考宏晶网站24c04通信程序/ t* j% b; Z4 X8 c 
// 时间:2011年4月20日' ?* u, Y* O+ a' R8 Q" p 
//**************************************** 
* t6 l5 l4 F" b. u/ z#include  <REG51.H>         
6 i. j* ]# @* C  D0 p#include  <math.h>    //Keil library   
! H$ i, e5 ?, Q$ Z- D) U2 o#include  <stdio.h>   //Keil library        ( W/ ]) p' _) j8 X( J. ? 
#include  <INTRINS.H> 
5 V8 b2 }" v  t# ~1 ]% t  S#define   uchar unsigned char/ c, F) ]% T, O( |1 B& C2 W 
#define   uint unsigned int        1 D  ]! e) n/ {1 _  n  k 
#define   DataPort P0         //LCD1602数据端口 
' g7 q6 M5 k$ W$ ?sbit          SCL=P1^0;      //IIC时钟引脚定义) V+ a- K" l( | 
sbit            SDA=P1^1;      //IIC数据引脚定义 
) }& S# e8 h; [2 ~2 Ysbit      LCM_RS=P2^0;   //LCD1602命令端口                - i0 T# C. r/ }8 m/ w+ Z 
sbit      LCM_RW=P2^1;   //LCD1602命令端口                ) |; }  E0 X2 S+ U9 D 
sbit      LCM_EN=P2^2;   //LCD1602命令端口  
! j3 W; w8 N( g+ I% O0 t" Q. `7 d#define          SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改 
8 }' k6 k- Z6 d                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A+ }& `! h) f- l/ o6 }" v 
typedef   unsigned char BYTE; 
. G/ l) h8 e8 w3 Z9 z+ ytypedef   unsigned short WORD;1 b9 c( f, U7 I$ n. t  p0 w7 a 
BYTE    BUF[8];                         //接收数据缓存区              , ?& W$ k9 D$ G  [ 
uchar   ge,shi,bai,qian,wan;            //显示变量# L& S7 [: r5 q1 m 
int     dis_data;                       //变量 
2 q* f9 V2 f1 ^! U( vvoid delay_nms(unsigned int k); 
9 G, s0 i: Z/ h: e4 X6 q/ vvoid InitLcd();+ ^. L( {$ T- d* u! n" m, v 
void Init_BH1750(void);( t, A: t, D: w3 e# d 
void WriteDataLCM(uchar dataW);+ s0 z( K' |5 Y7 s4 M2 K 
void WriteCommandLCM(uchar CMD,uchar Attribc);- W; r3 N" {1 F) ?( |% B3 m 
void DisplayOneChar(uchar X,uchar Y,uchar DData); 
/ V8 @- H! J- b7 W+ Q. U( Mvoid conversion(uint temp_data);& t. z: |, k4 Y2 e4 D1 V5 ] 
void  Single_Write_BH1750(uchar REG_Address);               //单个写入数据 
" ?, N. A) E, M- t+ `+ _uchar Single_Read_BH1750(uchar REG_Address);                //单个读取内部寄存器数据 
7 N- M% Z- {; |) Z" h: h: Fvoid  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据# V& t5 k" c5 P- ]8 { 
//------------------------------------ 
% A1 U* [% J+ j  Kvoid Delay5us(); 
5 B% e, v4 A2 E: J. |, q: F  mvoid Delay5ms();1 i! ^3 I: y& s# t 
void BH1750_Start();                    //起始信号 
  N: U3 p, D3 H% k' j! T6 C* Rvoid BH1750_Stop();                     //停止信号' M- J7 U, ]. C% [. i 
void BH1750_SendACK(bit ack);           //应答ACK 
" Z7 P  X0 ]6 e' T/ d; o3 ^bit  BH1750_RecvACK();                  //读ack$ G! u3 ]" @6 p5 L& L3 ^ 
void BH1750_SendByte(BYTE dat);         //IIC单个字节写 
- U7 v# B4 M: z. |, yBYTE BH1750_RecvByte();                 //IIC单个字节读/ x3 R8 l* s7 P, J* z' Z 
//-----------------------------------+ y, }; R, U0 M& n" [" z 
//********************************************************* 
& [8 t' Q1 v1 M5 X% X- ?void conversion(uint temp_data)  //  数据转换出 个,十,百,千,万( p$ D1 x5 U$ i5 O6 A+ L/ q 
{  ) Z% e* z1 e' G2 ~' J* V 
    wan=temp_data/10000+0x30 ; 
9 r3 N! Z0 {4 x! J    temp_data=temp_data%10000;   //取余运算 
7 j1 q. W" X, b# l( _        qian=temp_data/1000+0x30 ; 
& E* D3 g4 H; w+ d    temp_data=temp_data%1000;    //取余运算0 A5 ~0 i% v" ^% A' W* q 
    bai=temp_data/100+0x30   ;, b) b. J/ I) S# R 
    temp_data=temp_data%100;     //取余运算* `0 W9 e/ H6 l' c 
    shi=temp_data/10+0x30    ;5 T/ p( p" ?( U6 \9 n$ s9 Z 
    temp_data=temp_data%10;      //取余运算 
6 L! [* q6 x1 O1 I    ge=temp_data+0x30;         " S3 L. C( K1 g- G& G& ]4 X 
} 
6 m0 E, j: F1 N1 z//毫秒延时************************** 
! d! k& z, t: G! }1 Bvoid delay_nms(unsigned int k)         
7 C7 L& c, [) f; x3 M) C{                                                : m7 S* d2 P& c, _* l 
unsigned int i,j;                                : a6 a5 Z' K: M; e6 v. m4 h. _- _. ], O 
for(i=0;i<k;i++) 
0 z! D  j9 g2 B4 O7 h{                         
: Q* x. o2 `5 B2 x" u# h  b+ Pfor(j=0;j<121;j++)                        ! f6 p* \4 i1 U/ F5 o& c# T 
{;}}                                                 
: [5 g: y+ v& D- b9 x* y2 M}" _2 M' p0 U) T9 G) ]: V% C$ Z! u 
/*******************************/& X. {; ~6 @0 H: g5 h, \" _1 r. R5 p 
void WaitForEnable(void)        : D6 I( a# Z- Z4 q0 Z3 S# \ 
{                                         
( ^( @1 B  g4 D8 }3 }DataPort=0xff;                 
9 c+ J# _4 \: p* ]LCM_RS=0;LCM_RW=1;_nop_();5 B" z1 Q7 U9 H$ m2 f! s 
LCM_EN=1;_nop_();_nop_(); 
: P; P2 X* `/ X- ~. [while(DataPort&0x80);        ! B/ N* G" [$ Y5 D% l 
LCM_EN=0;                                ' G- V5 G4 t3 ~! I 
}                                        & s; V7 ]/ p9 f; {* n' j/ F 
/*******************************/ 
. y  m* ]5 Z8 x3 b6 Y; D$ E4 a+ @void WriteCommandLCM(uchar CMD,uchar Attribc)) H- r9 ]6 O$ D  |1 ` 
{                                         
% g7 l8 S. M- C$ gif(Attribc)WaitForEnable();        ' A3 N/ Q  M9 E) V$ e1 v! U! I9 _; B 
LCM_RS=0;LCM_RW=0;_nop_();& a+ c7 i% t, Q* u 
DataPort=CMD;_nop_();        % R( }! D- a5 y 
LCM_EN=1;_nop_();_nop_();LCM_EN=0;# m- q: t% d& v. v; m 
}                                         
$ h0 K% b" ?2 G/ F# u. i4 W/*******************************/+ T. o2 U- `8 u( A( B 
void WriteDataLCM(uchar dataW) 
! Z, [1 p! i8 @5 J{                                        % `* _( X& y7 q) Q9 U+ X 
WaitForEnable();                 
9 k# M/ G& u; m6 ~( r: FLCM_RS=1;LCM_RW=0;_nop_();, p( A3 Q- C' s& B% F; } 
DataPort=dataW;_nop_();        3 v; J0 _7 X. T+ V 
LCM_EN=1;_nop_();_nop_();LCM_EN=0;0 }/ F, E. M5 E& n$ i 
}                 
. R: J* k3 M& U# @( E. ~/***********************************/4 ?" \# r- i& B, b 
void InitLcd()                                . g8 n/ n4 l" ?7 R1 T* ? 
{                         
- k# A* y( F9 f  KWriteCommandLCM(0x38,1);         
* u3 f2 C& N3 d; R+ x2 w" uWriteCommandLCM(0x08,1);         
9 W% y; ]$ h$ _8 A; d$ c( j# vWriteCommandLCM(0x01,1);         
: u1 }- p. h8 Y9 \1 pWriteCommandLCM(0x06,1);         
, h9 f4 h) \' J: v- fWriteCommandLCM(0x0c,1);3 K; y0 w, ~+ }$ h- X3 ]" X& W 
}                        0 R9 A; \4 `3 u" ? 
/***********************************/  p1 i" Q  Z7 [$ r  M* k 
void DisplayOneChar(uchar X,uchar Y,uchar DData)6 Z" U6 f2 T/ ~+ B2 p" W2 U* S, B 
{                                                1 B! J4 `8 i$ Z/ R% r( E& Z8 H 
Y&=1;                                                , A. H  m5 t) j% a! V 
X&=15;                                                ' d8 B+ {# S1 f1 d8 T0 i! E; n 
if(Y)X|=0x40;                                         
% A2 Q! Z9 F) z! {. K  d0 _X|=0x80;                         
" T, ?( _! s4 KWriteCommandLCM(X,0);                 
4 {) W* g( _# }1 `# z$ \( r) AWriteDataLCM(DData);                / s, v3 T; c, u; s, ?6 ~  c 
}                                                + h! c& {% n, u 
/************************************** 
* W& z" }" C% Z& c$ [# p! [延时5微秒(STC90C52RC@12M) 
! @. @4 f' k* h; m1 b不同的工作环境,需要调整此函数,注意时钟过快时需要修改 
$ N1 `, z# C3 f4 r: s当改用1T的mcu时,请调整此延时函数 
! p+ Y6 `. m) t) x/ f/ H**************************************// X( T! b  v- R- C! d 
void Delay5us()% z) d" [* k. x  I 
{ 
5 G0 K% n2 z2 a; H  V4 Y8 {    _nop_();_nop_();_nop_();_nop_(); 
$ u, j' j2 A0 P7 _    _nop_();_nop_();_nop_();_nop_(); 
0 p4 r  L! r) r+ O3 }        _nop_();_nop_();_nop_();_nop_();& y1 A  H* p; k; o; I- e 
        _nop_();_nop_();_nop_();_nop_();7 V9 c; y+ Y7 a2 z+ f/ e/ O 
}" u" @5 w) C$ I5 b 
/************************************** 
; ^- t$ M( H. q$ H延时5毫秒(STC90C52RC@12M) 
, e2 F! ~/ G8 Y, g& d* \不同的工作环境,需要调整此函数7 \3 u3 m# o: Y9 U0 K 
当改用1T的MCU时,请调整此延时函数8 m) D) g4 z9 l' r# Z% r 
**************************************/ 
2 @# \) s& i5 z/ J6 H! m& Q0 W5 _# P! F' Gvoid Delay5ms() 
3 w! V8 S% }/ B& g  V  M  M" Y7 H{. Z8 ]1 k# ~0 }4 H  t  Z% g8 r* R" I+ ^ 
    WORD n = 560; 
/ l% C8 o& R3 e; b3 L    while (n--); 
( ]8 d; Y( z6 C4 e4 F% J! j: u} 
, K/ s4 W) r; u; R3 y% F/**************************************% s3 ]0 I6 E7 d2 C7 X 
起始信号( T0 Z0 t* P* ?; P 
**************************************/6 n9 H- M; H8 U. _% d/ G 
void BH1750_Start() 
$ P% q4 h9 [3 S6 d) ^: y{6 f1 ?+ @- `  e9 a% X7 Z 
    SDA = 1;                    //拉高数据线 
; ]+ E- i' H, B: K( N) B    SCL = 1;                    //拉高时钟线8 p2 P% g8 H' c 
    Delay5us();                 //延时 
, Y4 P* a( y" m8 t7 u' [! P& r+ u    SDA = 0;                    //产生下降沿' e. @' t' M$ g  l) b 
    Delay5us();                 //延时 
: Z1 M' `, K. \6 |    SCL = 0;                    //拉低时钟线2 F) x& F6 r9 p( R. h5 _ 
} 
) t% K! P9 q  ~: z' |$ d) p/************************************** 
* S% Z5 p/ Y: N! i4 c, k  ~停止信号# j) Y4 O8 Q6 w 
**************************************/ 
5 {6 v+ P- q1 nvoid BH1750_Stop()* R8 s1 P. }( f- b6 G3 M 
{ 
: ?! e* H: f1 m    SDA = 0;                    //拉低数据线 
7 y  @3 x! W2 _7 J' f% O) k    SCL = 1;                    //拉高时钟线 
) R2 r% I, v% P    Delay5us();                 //延时9 I/ D: m! i$ A# B1 n1 X 
    SDA = 1;                    //产生上升沿 
, p+ q5 I! ]+ y8 c6 i7 `    Delay5us();                 //延时 
9 w# n2 t% i- {9 }7 o- N1 E3 G0 L} 
$ ?4 F6 V* N7 i3 }" S6 T! Q' z3 X/************************************** 
* B. t; t$ }; J8 v% B, v发送应答信号 
' w6 N( M; H3 h% j) [) I入口参数:ack (0:ACK 1:NAK)' z$ @- ]# U7 \8 { 
**************************************/ 
+ f3 y8 k; `' Evoid BH1750_SendACK(bit ack)3 w- \( {) x1 C 
{5 j: F  ]+ [5 F' n- ] 
    SDA = ack;                  //写应答信号 
6 b8 G; r7 H; M0 ?2 S6 z    SCL = 1;                    //拉高时钟线 
: B4 z( Z4 a3 p5 p( `    Delay5us();                 //延时 
* e8 I* L1 }% S( I    SCL = 0;                    //拉低时钟线 
: N- \8 z  N% i% l    Delay5us();                 //延时5 n' h7 e2 h0 O+ C- ? 
} 
% j$ k; j" F0 n6 |, y/**************************************2 S, F- U/ C9 z( m 
接收应答信号/ M8 K, }7 F! ~6 n) h/ E# Q1 b 
**************************************/ 
; Z% `% t9 ^# w  v; T0 w. _% gbit BH1750_RecvACK() 
) e( D2 v* n4 \4 g5 j{; x1 K! a! E% j. T/ U 
    SCL = 1;                    //拉高时钟线  ?$ T* O& W3 r9 e, G 
    Delay5us();                 //延时 
+ d/ }+ K1 M% A: K  J# g    CY = SDA;                   //读应答信号, B+ |/ R  h2 m( Z' ` 
    SCL = 0;                    //拉低时钟线6 x+ w+ o7 e5 Y2 @ 
    Delay5us();                 //延时 
, Q) I$ g8 @$ @. o    return CY; 
6 n- T% P4 D$ M, s. g$ e}  |6 R& Z9 x0 q* ] 
/************************************** 
1 Y% O% ?1 u& S3 Y+ |向IIC总线发送一个字节数据 
# |) L6 [( V" f* E" Y' c4 e. v. p**************************************/ 
2 @5 {* e$ d7 a0 f1 m* k, x% zvoid BH1750_SendByte(BYTE dat)0 M; Z+ B; Y2 _7 f0 j& } 
{ 
9 @+ `8 M3 D: o3 L2 \) r, H    BYTE i;# N! \: V* ?0 J' a( @7 t 
    for (i=0; i<8; i++)         //8位计数器9 ~, B& R/ a0 d: R0 {: s 
    { 
. C- Y1 k2 c1 y  s$ L        dat <<= 1;              //移出数据的最高位% m+ _' ^; j* o6 A& M8 l4 _ 
        SDA = CY;               //送数据口  G2 I2 ?7 w( W% C; w$ } 
        SCL = 1;                //拉高时钟线: R0 d5 y2 }2 ~# q4 P9 [ 
        Delay5us();             //延时4 h) u) _8 [% x 
        SCL = 0;                //拉低时钟线( W! h& n, ~. X9 a5 S 
        Delay5us();             //延时7 d6 f6 \- o- N 
    }8 @& b" O% _! U( I8 Q 
    BH1750_RecvACK();' V' G! q: U6 Z0 M/ \3 H7 u  f 
} 
1 G" {6 I) M6 I, A4 v/ s  J/**************************************$ K0 G! _, V3 |# c" M 
从IIC总线接收一个字节数据 
4 D: n9 D; e9 v- F8 Q& ^( w**************************************/0 @0 a$ v7 S' U. ^* J0 T 
BYTE BH1750_RecvByte() 
" B! `+ j% B, [' Z4 P( b: f. s) ^{3 }5 S3 k" }/ D6 h' R+ D 
    BYTE i; 
. O( ?& j" r$ i: o9 Y, P    BYTE dat = 0; 
$ G6 v) ?/ \! u  b9 `% O2 G    SDA = 1;                    //使能内部上拉,准备读取数据, 
: g1 A; ?! C+ [' O' s2 S    for (i=0; i<8; i++)         //8位计数器 
% z( L# ^& q: [' `1 w+ t3 [    {: p/ j4 e9 S4 t6 W6 F( Y, H+ ? 
        dat <<= 1; 
; ^3 X) k2 e% H7 x! e+ f% M        SCL = 1;                //拉高时钟线 
7 r: b0 D0 l) }        Delay5us();             //延时" _$ T$ B/ E  k: K* A& ] 
        dat |= SDA;             //读数据               4 I9 ^2 z6 n' U+ y# [2 k6 [7 Y 
        SCL = 0;                //拉低时钟线# J" y  K1 H4 K5 s( c( g 
        Delay5us();             //延时6 u/ G; x9 n5 w9 E 
    } 
5 A7 {' v9 p6 M; \    return dat;1 Q( x! V5 i- q3 q9 [2 I" G% G5 l 
}! [3 p$ m* W0 e 
//*********************************4 I" ]" C' n; s 
void Single_Write_BH1750(uchar REG_Address)7 a& _) A. n/ R9 x0 h 
{& L$ e6 A, m7 g) d( c! {* U 
    BH1750_Start();                  //起始信号 
# ]" `4 |# D$ }- n, w2 D    BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号( {* @& E: O% N7 T7 w% r+ i 
    BH1750_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页 , P2 t, `+ i# V7 H 
  //  BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页 6 x# u$ ^2 H9 C; ? 
    BH1750_Stop();                   //发送停止信号' U* l) W' t3 F( g 
}3 A$ p+ d# z" t3 Y4 B 
//********单字节读取***************************************** 
4 Z; b! e0 g) g! J/*3 j% j" l8 U9 z 
uchar Single_Read_BH1750(uchar REG_Address) 
2 \+ B# v! {6 W' Y+ P{  uchar REG_data;! D) k: _5 g6 e7 m3 k; l; }9 H) n" u% p) Y 
    BH1750_Start();                          //起始信号$ K- ?; }2 r1 \5 I& v 
    BH1750_SendByte(SlaveAddress);           //发送设备地址+写信号. i/ V5 z/ v- r8 D+ @: R 
    BH1750_SendByte(REG_Address);                   //发送存储单元地址,从0开始        8 |9 J7 e5 {/ J6 w3 w* W( J2 g/ z: k 
    BH1750_Start();                          //起始信号 
0 }1 r# n  R$ I- q6 ?7 Q) }* ^    BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号 
& b! x( p; F" b    REG_data=BH1750_RecvByte();              //读出寄存器数据 
" W9 D  _/ B; C, q7 ~        BH1750_SendACK(1);    
, ?. v/ [  n* y& e1 J: A        BH1750_Stop();                           //停止信号8 M" u! i# I+ X- T; W  @2 T' D; ]/ s 
    return REG_data; % B- Y8 o, N  D+ s. W3 h 
} 
# ^: k" o7 Q* J*/ 
$ n. f3 I8 m% p" d. c//*********************************************************- E! P" z) w6 i3 E( Z8 m; } 
//8 ?2 ?) L3 V  }: l: N! X% ` 
//连续读出BH1750内部数据 
$ A$ w0 T) |' Y//4 T, r! m; h5 s 
//*********************************************************# |+ t4 H4 T6 ~- W* n; @ 
void Multiple_read_BH1750(void)2 T: G( `( |* [  n" K# D% C 
{   uchar i;         
; E; n+ {" U0 M  h3 ]$ P    BH1750_Start();                          //起始信号4 Q9 [" R! y( g8 r 
    BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号0 T$ t& F2 a0 d8 M4 x% g 
         
$ `) E- l0 T7 A4 Y' z3 Z         for (i=0; i<3; i++)                      //连续读取6个地址数据,存储中BUF 
' a* Q. }+ D3 E9 V4 T5 \    {$ X# e. E) k/ r1 @0 o% C( r. Q 
        BUF = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据 
: T' }$ ]' `- s4 F        if (i == 3) 
2 G7 p8 ^. a) d; |" F+ X* H1 i        { 
' E5 o4 O  E, G1 g3 j! [. k: s           BH1750_SendACK(1);                //最后一个数据需要回NOACK  J$ Y6 ~& z  F# D" ?: D 
        }. E$ ]4 O  k4 b' }5 m8 W 
        else2 w6 [0 n) u# w# K( [( f/ ^9 J 
        {                 
$ v  ^+ ^% j" j& P$ n6 q          BH1750_SendACK(0);                //回应ACK& y( N% L9 s$ F. K. y8 z' p  t8 Y 
       } 
% N  L7 R3 \, N6 o. K; k/ h   }8 E5 J9 f! x8 y 
    BH1750_Stop();                          //停止信号7 I: }# _# T% u: J 
    Delay5ms();, N) w" H5 I* |6 e5 D) F+ k 
}) Q9 K/ i8 u9 u& w, i) _ 
( t6 }& s& S+ |& j" @ 
//初始化BH1750,根据需要请参考pdf进行修改**** 
1 k+ I- c1 Q( Y. G: u4 S' z. S' tvoid Init_BH1750()( ?1 _( z. _$ i* M. C% ] 
, j( l; b4 Q' ] 
…………限于本文篇幅 余下代码请从论坛下载附件………… 
# j$ f/ I" W7 _3 k  a% C! l' [7 T- _, v8 B0 v; ?8 Z1 ] 
; x3 d8 g1 f8 K- y. M# r 
 |   
 
 
 
 |