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

2019-05-20来源: eefocus关键字: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(" lxrn");

Delay(2000);

  }

}

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


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



关键字:STC  单片机控制  BH1750  测量光照强度 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462271.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STC单片机控制PCA9554A程序
下一篇:为什么单片机不能直接驱动继电器和电磁阀

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

8051单片机(STC89C52)之改变蜂鸣器发声频率
由于定时器0的中断处理程序为50ms触发一次, 故改变tcount归零时的临界值即可改变蜂鸣器发声的频率. 当tcount = 40 进行电平翻转时, 发出的声音类似于公交车转向灯开启时的效果声音.当tcount = 10 进行电平翻转时, 发出的声音类似于倒计时秒表的哒哒声.当tcount = 5   进行电平翻转时, 发出的声音比tcount = 10进行翻转时更加急促.#include <STC89C5xRC.H>int tcount = 0;sbit beep = P1 ^ 5;// P1 xor 0000 0101void TO_EXT() interrupt 1//50ms触发
发表于 2020-03-19
STC89C52单片机用两个定时器控制蜂鸣器的频率和输出时间间隔
题目同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。遇到的问题出现定时器紊乱的现象,这个时候需要把T1定时器的优先级设为高于T0优先级具体代码如下:#include <reg52.h>typedef unsigned int unint;typedef unsigned char uchar;sbit beep = P1^5;sbit led = P2^0;uchar t1,bphz,times;uchar code table[]={ 500,300,200,100,50,25,12,10};vo
发表于 2020-03-17
智能厚度测量系统设计
本课题所研究的智能厚度计是基于单片机的成套解决方案,由主控制器、测量传感器、AD转换模块、液晶显示模块以及相应配套硬件组成。通过对测量传感器的运用,对厚度参数进行精确地数据采集,然后通过AD转换模块将测量传感器采集到的模拟信号转换成数字信号,再通过主控制器对AD转换模块输出的数字信号进行相应的数据分析处理,最后通过液晶显示模块对厚度参数进行直观地显示,以完成整个系统的功能需求。1 主控制器电路设计STC89C52单片机最小系统具有体积小、质量轻、功能强、功耗低、性价比高等特点。STC89C52单片机最小系统由芯片、系统时钟、I/O端口设备及复位电路等构成。STC89C52芯片内部结构框图单片机最小系统电路2 电阻式位移传感器
发表于 2020-03-09
智能厚度测量系统设计
STC8A8K64单片机关于AT24C04基本读写操作
实验:AT24C04基本读写操作步骤及现象:在下载程序前,选择stc-isp的IRC频率:12MHz。程序下载完成后,在串口助手界面,HEX模式下,选择波特率9600,然后点击“打开串口”按钮。这时按独立按键1在接收缓冲区打印出刚写入的16个数据。*数据帧格式I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。在总线的一次
发表于 2020-03-05
STC8A8K64单片机关于AT24C04基本读写操作
简易STC15F104E单片机定时报警器制作
非常时期,孩子不能上学,大人没在家,每天早上都睡得十几点,有点过份,所以作个简易定时报警器作闹钟用,主要是配合小米智能插座的网络定时功能用,只是自己的小制作,供有需求的人参考用;制作出来的实物图如下:功能:1.上电时即启动报警;2.定时30S后自动停止;3.报警过程中如有按键按下即停止报警;硬件:1.P32按一个按键,作为取消报警用;2.P35接蜂鸣器,作为报警声;/*/******************************************************************************-------------------------STC15F104E定时报警器
发表于 2020-03-04
简易STC15F104E单片机定时报警器制作
基于STC12C5408AD的记忆示波器 (1)
电路,将一些物理过程,如温度、湿度、压力等等,经过相应的传感器,将非电量转换成电压量,再经调理电路处理后送入STC单片机进行A/D转换,转换成数字量后再由串口发送到PC机,由PC机进行存储和图形显示,从而构成了记忆示波器。  2 STC12C5408AD简介  STC12C5408AD是新一代增强型8051单片机,速度快,集成度高,电压范围宽(3.8 V~5.5 V),指令系统和MCS-51系列完全兼容。其内部还有8 KBFlash程序存储器,512字节RAM、2 KB EEPROM、8通道10位ADC、4路PWM以及硬件看门狗(WDT)等宝贵资源,性价比极高。它的23个I/O口、内部电源供电系统、时钟电路、复位电路以及看门狗电路都经过特殊
发表于 2020-03-02
基于STC12C5408AD的记忆示波器 (1)
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved