基于51单片机驱动BH1750采集光强度 LCD1602显示
时间: 2023-11-28 19:05:10 浏览: 54
以下是基于51单片机驱动BH1750采集光强度并在LCD1602上显示的代码。
```
#include<reg52.h>
#include<intrins.h>
#define BH1750_ADDR 0x23
sbit SCL=P3^6;
sbit SDA=P3^7;
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;
unsigned char code InitTable[]={0x38,0x0c,0x06,0x01,0x80};
unsigned char LightData[2];
void Delay1ms(unsigned int cnt)
{
unsigned int i,j;
for(i=0;i<cnt;i++)
for(j=0;j<110;j++);
}
void Start()
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void Stop()
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
unsigned char WriteByte(unsigned char dat)
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp=dat&0x80;
SDA=temp;
dat<<=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
temp=SDA;
SCL=0;
return temp;
}
void InitLCD()
{
unsigned char i;
for(i=0;i<5;i++)
{
WriteByte(InitTable[i]);
Delay1ms(10);
}
}
void WriteCommand(unsigned char cmd)
{
RS=0;
RW=0;
WriteByte(cmd);
Delay1ms(10);
}
void WriteData(unsigned char dat)
{
RS=1;
RW=0;
WriteByte(dat);
Delay1ms(10);
}
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=110;j>0;j--);
}
void Display(unsigned char *p)
{
unsigned char i;
WriteCommand(0x80);
for(i=0;i<2;i++)
{
WriteData(p[i]/100+'0');
WriteData(p[i]%100/10+'0');
WriteData(p[i]%10+'0');
if(i==0)
WriteData('.');
}
WriteData('L');
}
void ReadData()
{
unsigned char i;
Start();
WriteByte(BH1750_ADDR);
WriteByte(0x10);
Stop();
Delay1ms(200);
Start();
WriteByte(BH1750_ADDR+1);
for(i=0;i<2;i++)
{
LightData[i]=WriteByte(0xff);
if(i==0)
WriteByte(0x51);
else
WriteByte(0x52);
}
Stop();
}
void main()
{
InitLCD();
while(1)
{
ReadData();
Display(LightData);
Delay(500);
}
}
```
需要注意的是,BH1750的地址默认为0x23,如果不同需要修改相应的代码。并且在初始化BH1750时需要写入0x10指令,让其进入连续高分辨率模式。同时,读取BH1750数据时需要先发送0x51或0x52指令,具体指令详见BH1750的数据手册。
阅读全文