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

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

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

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

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

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测量光照强度程序_第1张图片

你可能感兴趣的:(STC单片机,常用元器件)