×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-17 发布时间:
|

#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。







『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
激光跟踪仪市场2023年有望达5.216亿美元