bh1750光照传感器代码51
时间: 2023-06-27 22:01:41 浏览: 331
下面是基于51单片机的BH1750光照传感器的代码:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0; //I2C数据线
sbit SCL=P2^1; //I2C时钟线
uchar BH1750_address=0x23; //BH1750地址
uchar BH1750_mode=0x10; //BH1750模式控制命令
void delay(uint i)
{
while(i--);
}
void I2C_start() //I2C起始信号
{
SDA=1;
_nop_();
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
}
void I2C_stop() //I2C停止信号
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
_nop_();
}
void I2C_ack() //I2C应答信号
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SCL=0;
_nop_();
SDA=1;
}
void I2C_sendbyte(uchar dat) //I2C发送一字节数据
{
uchar i;
for(i=0;i<8;i++)
{
if(dat&0x80)
SDA=1;
else
SDA=0;
dat<<=1;
_nop_();
SCL=1;
_nop_();
SCL=0;
}
I2C_ack();
}
uchar I2C_receivebyte() //I2C接收一字节数据
{
uchar i,dat=0;
SDA=1;
for(i=0;i<8;i++)
{
_nop_();
SCL=1;
_nop_();
dat<<=1;
if(SDA)
dat|=0x01;
SCL=0;
}
return dat;
}
void BH1750_init() //BH1750初始化
{
I2C_start();
I2C_sendbyte(BH1750_address);
I2C_sendbyte(BH1750_mode);
I2C_stop();
}
uint BH1750_read() //BH1750读取光照强度
{
uint dat;
I2C_start();
I2C_sendbyte(BH1750_address);
I2C_sendbyte(0x00);
I2C_start();
I2C_sendbyte(BH1750_address+1);
dat=I2C_receivebyte();
dat<<=8;
dat+=I2C_receivebyte();
I2C_stop();
dat=dat/1.2;
return dat;
}
void main()
{
uint light=0;
while(1)
{
BH1750_init();
delay(100000);
light=BH1750_read();
}
}
```
以上代码需要用到51单片机的I2C总线通信,需要注意I2C的时钟频率和BH1750的地址和模式控制命令。具体的使用方法可以参考BH1750的数据手册。
阅读全文