STC单片机控制BH1750测量光照强度程序

时间:2021-03-07 19:48:58
/****备注:此程序最低值为00212lux,时序可能还有一些问题,有时候乱改的话还会出现一直是00212或者00000的情况,****/

/****且数据变化是不连续的00212,00425,00639,00852,01065等等****/

/****2016.10.18日补充:后来发现是BH1750_Write_Byte最后6句写的不对****/

/****2016.10.18日补充:通过修改BH1750_Write_Byte函数的最后6句,程序已经能够正常测试****/
#include<reg51.h>
#include <intrins.h>

bit write=0;
sbit SDA=P2^0;
sbit SCL=P2^1;

typedef unsigned char BYTE;
BYTE BUF[8];

unsigned char num;
unsigned char a,b,sec,count;
unsigned char ge,shi,bai,qian,wan; //显示变量

int dis_data,dis_data1; //变量

void conversion(unsigned int temp_data) // 数据转换出 个,十,百,千,万
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}

void NOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void Delay(unsigned int i)
{
unsigned int j,k;
for(j=i;j>0;j--)
for(k=110;k>0;k--);
}

void BH1750_Start()
{
SDA=1;
NOP();
SCL=1;
NOP();
SDA=0;
NOP();
SCL=0;
NOP();
}

void BH1750_Stop()
{
SDA=0;
NOP();
SCL=1;
NOP();
SDA=1;
NOP();
}

void BH1750_Write_Byte(unsigned char dat)
{
unsigned char i,temp;
temp=dat;
for(i=0;i<8;i++)
{
temp=temp<<1;
SDA=CY;
NOP();
SCL=1;
NOP();
SCL=0;
NOP();
}
SDA=0; //注意:以下6句不可少,否则读到的数据是不正常的,如00212等
NOP();
SCL=1;
NOP();
SCL=0;
NOP();
}

unsigned char BH1750_Read_Byte()
{
unsigned char i,x=0;
SDA=1;
NOP();
for(i=0;i<8;i++)
{
x=x<<1;
SCL=1;
NOP();
x=x|SDA;
SCL=0;
NOP();
}
return x;
}

void Responds()
{
SDA=0;
NOP();
SCL=1;
NOP();
SCL=0;
NOP();
}

void No_Responds()
{
SDA=1;
NOP();
SCL=1;
NOP();
SCL=0;
NOP();
}

void Single_Write_BH1750(unsigned char reg_address)
{
BH1750_Start();
BH1750_Write_Byte(0x46);
//No_Responds(); //此语句不可少,否则返回的数值不会变化
BH1750_Write_Byte(reg_address);
//No_Responds(); //此语句不可少,否则返回的数值不会变化,2016.10.12日加
BH1750_Stop();
}

void Multiple_Read_BH1750(void)
{
unsigned char i;
BH1750_Start();
BH1750_Write_Byte(0x47);
for(i=0;i<2;i++) //连续读取2个地址数据,存储中BUF
{
BUF[i]=BH1750_Read_Byte(); //BUF[0]存储0x32地址中的数据
if (i == 1)
{
No_Responds(); //最后一个数据需要回NOACK
}
else
{
Responds(); //回应ACK
}
}
BH1750_Stop(); //停止信号
Delay(5);
}

void BH1750_init()
{
Single_Write_BH1750(0x01);
}

void uart_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
SCON=0x50;
}

void uart_putchar(unsigned char dat)
{
SBUF=dat; //把数据送给sbuf缓存器中
while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环
TI=0; //到了,TI清为0
}
void uart_printf(unsigned char *buff)
{
while(*buff)
uart_putchar(*buff++);
}

void main()
{
float temp;
unsigned char str[5];
uart_init();
BH1750_init();
while(1)
{
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
Delay(180);
Multiple_Read_BH1750();
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
temp=(float)dis_data/1.2;

conversion(temp); //计算数据和显示
str[0]=wan;
str[1]=qian;
str[2]=bai;
str[3]=shi;
str[4]=ge;
uart_printf("light:");
Delay(2000);
uart_printf(str);
Delay(2000);
uart_printf(" lx\r\n");
Delay(2000);
}
}

显示界面及原理图如下所示:

硬件上直接接四根线就行,VCC,GND,SDA,SCL。

STC单片机控制BH1750测量光照强度程序

STC单片机控制BH1750测量光照强度程序