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

来源:互联网 发布:奶奶抱走红网络 编辑:程序博客网 时间:2024/05/10 05:18
/****备注:此程序最低值为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。



1 0