基于BH1750的光照度检测Word文档下载推荐.docx

上传人:b****8 文档编号:22377503 上传时间:2023-02-03 格式:DOCX 页数:16 大小:19.92KB
下载 相关 举报
基于BH1750的光照度检测Word文档下载推荐.docx_第1页
第1页 / 共16页
基于BH1750的光照度检测Word文档下载推荐.docx_第2页
第2页 / 共16页
基于BH1750的光照度检测Word文档下载推荐.docx_第3页
第3页 / 共16页
基于BH1750的光照度检测Word文档下载推荐.docx_第4页
第4页 / 共16页
基于BH1750的光照度检测Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于BH1750的光照度检测Word文档下载推荐.docx

《基于BH1750的光照度检测Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于BH1750的光照度检测Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

基于BH1750的光照度检测Word文档下载推荐.docx

OSC为内部的振荡器提供内部逻辑时钟,通过相应的指令操作即可读取出内部存储的光照数据。

数据传输使用标准的I2C总线,按照时序要求操作起来也非常方便。

2.NOKIA5110是一款价廉的液晶显示器,该显示器可以显示15个汉字、30个字符,仅仅需要4根I/O数据线,其工作电压为3.3V。

它采用NXP公司的PCD8544显不驱动芯片,NOKIA5110可以使用没有MISO只有MOSI的SPI协议,可以利用硬件SPI,但通常只需要软件程序模拟即可,数据传输需要严格按照手册中串行接口时序图编写。

其运行速度十分理想,是LCD12864显示器的20倍,LCD1602显示器的40倍,适用于对反应灵敏度有要求的场合。

2.1NOKIA5110液晶显示器的初始化

接通电源后,NOKIA5110液晶显示器的内部寄存器和RAM的内容是不确定的,这时需要一个RES低电平脉冲进行复位。

当VDD变为高电平,达到或高于VDD的最小值之后,给NOKIA5110显示模块的复位端RST引脚输入低电平(要求复位电平<

0.3VDD),便进行了NOKIA5110液晶显示器的复位。

图2为NOKIA5110液晶显示器的复位时序图。

2.2设置NOKIA5110液晶显示器的坐标

通过查询NOKIA5110液晶显示器的指令集与手册可以知道其功能设置命令的H和V。

其中:

H=0使用基本指令集命令,H=1使用扩展指令集命令,V=0水平寻址,V=1垂直寻址。

数据以字节8位为单位下载到PCD8544的48×

84位显示数据RAM矩阵。

列通过地址指针寻址,地址X围为X:

0~83(1010011);

Y:

0~5(101)。

在垂直寻址模式时(V=1),Y地址在每个字节之后递增,经最后的Y地址(Y=5)之后,Y绕回0,X递增到下一列的地址。

存水平寻址模式时(V=0),X地址在每个字节之后递增,经最后的X地址(X=83)之后,X绕回0,Y递增到下一行的地址。

经每一个最后地址之后(X=83,Y=5),地址指针绕回地址(X=0,Y=0)。

2.3显示方式

显示汉字可以采用两种点阵方式,一种是12×

12点阵,一种是16×

16点阵。

采用12×

12点阵汉字时,由于不是8的整数倍数,因此行与行之间只能隔开,这样才能完整显示一个汉字。

英文字符占用6×

8个点阵,可以通过建立一个ASCII的数组来进行寻址。

3.利用BH1750FVI和NOKIA5110液晶显示器进行系统结构的设计,其中NOKIA5110需要使用5个I/O口,RST复位端、SCE芯片使能端、DC模式选择端、DIN数据线、CLK时钟线分别接到单片机的P2.1~P2.5口。

由于BH1750FVI使用低电压3.3V,而传统单片机使用的是5V电压,故需要一个3.3V电源芯片662k输出稳定的3.3V电压,BH1750FVI光强度传感器的ADDR端口接地,测量仪电路图如图3所示。

4.#include<

REG51.H>

#include<

math.h>

//Keillibrary

stdio.h>

INTRINS.H>

#defineucharunsignedchar

#defineuintunsignedint

#defineDataPortP0//LCD1602数据端口

sbitSCL=P1^0;

//IIC时钟引脚定义

sbitSDA=P1^1;

//IIC数据引脚定义

sbitLCM_RS=P2^0;

//LCD1602命令端口

sbitLCM_RW=P2^1;

sbitLCM_EN=P2^2;

//LCD1602命令端口

#defineSlaveAddress0x46//定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改

//ALTADDRESS引脚接地时地址为0x46,接电源时地址为0xB8

typedefunsignedcharBYTE;

typedefunsignedshortWORD;

BYTEBUF[8];

//接收数据缓存区

ucharge,shi,bai,qian,wan;

//显示变量

intdis_data;

//变量

voiddelay_nms(unsignedintk);

voidInitLcd();

voidInit_BH1750(void);

voidWriteDataLCM(uchardataW);

voidWritemandLCM(ucharCMD,ucharAttribc);

voidDisplayOneChar(ucharX,ucharY,ucharDData);

voidconversion(uinttemp_data);

voidSingle_Write_BH1750(ucharREG_Address);

//单个写入数据

ucharSingle_Read_BH1750(ucharREG_Address);

//单个读取内部寄存器数据

voidMultiple_Read_BH1750();

//连续的读取内部寄存器数据

//------------------------------------

voidDelay5us();

voidDelay5ms();

voidBH1750_Start();

//起始信号

voidBH1750_Stop();

//停止信号

voidBH1750_SendACK(bitack);

//应答ACK

bitBH1750_RecvACK();

//读ack

voidBH1750_SendByte(BYTEdat);

//IIC单个字节写

BYTEBH1750_RecvByte();

//IIC单个字节读

//-----------------------------------

//*********************************************************

voidconversion(uinttemp_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;

}

//毫秒延时**************************

voiddelay_nms(unsignedintk)

{

unsignedinti,j;

for(i=0;

i<

k;

i++)

{

for(j=0;

j<

121;

j++)

{;

}}

/*******************************/

voidWaitForEnable(void)

{

DataPort=0xff;

LCM_RS=0;

LCM_RW=1;

_nop_();

LCM_EN=1;

while(DataPort&

0x80);

LCM_EN=0;

}

voidWritemandLCM(ucharCMD,ucharAttribc)

if(Attribc)WaitForEnable();

LCM_RW=0;

DataPort=CMD;

voidWriteDataLCM(uchardataW)

WaitForEnable();

LCM_RS=1;

DataPort=dataW;

}

/***********************************/

voidInitLcd()

WritemandLCM(0x38,1);

WritemandLCM(0x08,1);

WritemandLCM(0x01,1);

WritemandLCM(0x06,1);

WritemandLCM(0x0c,1);

}

voidDisplayOneChar(ucharX,ucharY,ucharDData)

Y&

=1;

X&

=15;

if(Y)X|=0x40;

X|=0x80;

WritemandLCM(X,0);

WriteDataLCM(DData);

}

/**************************************

延时5微秒(STC90C52RC12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

**************************************/

voidDelay5us()

{

_nop_();

延时5毫秒(STC90C52RC12M)

不同的工作环境,需要调整此函数

voidDelay5ms()

WORDn=560;

while(n--);

起始信号

voidBH1750_Start()

SDA=1;

//拉高数据线

SCL=1;

//拉高时钟线

Delay5us();

//延时

SDA=0;

//产生下降沿

SCL=0;

//拉低时钟线

停止信号

voidBH1750_Stop()

//拉低数据线

//产生上升沿

发送应答信号

入口参数:

ack(0:

ACK1:

NAK)

voidBH1750_SendACK(bitack)

SDA=ack;

//写应答信号

接收应答信号

bitBH1750_RecvACK()

CY=SDA;

//读应答信号

returnCY;

向IIC总线发送一个字节数据

voidBH1750_SendByte(BYTEdat)

BYTEi;

for(i=0;

i<

8;

i++)//8位计数器

{

dat<

<

=1;

//移出数据的最高位

SDA=CY;

//送数据口

}

BH1750_RecvACK();

从IIC总线接收一个字节数据

BYTEBH1750_RecvByte()

BYTEdat=0;

//使能内部上拉,准备读取数据,

dat|=SDA;

//读数据

returndat;

//*********************************

voidSingle_Write_BH1750(ucharREG_Address)

BH1750_Start();

BH1750_SendByte(SlaveAddress);

//发送设备地址+写信号

BH1750_SendByte(REG_Address);

//内部寄存器地址,

//BH1750_SendByte(REG_data);

//内部寄存器数据,

BH1750_Stop();

//发送停止信号

//********单字节读取*****************************************

/*

ucharSingle_Read_BH1750(ucharREG_Address)

{ucharREG_data;

//发送存储单元地址,从0开始

BH1750_SendByte(SlaveAddress+1);

//发送设备地址+读信号

REG_data=BH1750_RecvByte();

//读出寄存器数据

BH1750_SendACK

(1);

returnREG_data;

*/

//

//连续读出BH1750内部数据

voidMultiple_read_BH1750(void)

{uchari;

3;

i++)//连续读取2个地址数据,存储中BUF

BUF[i]=BH1750_RecvByte();

//BUF[0]存储0x32地址中的数据

if(i==3)

//最后一个数据需要回NOACK

else

{

BH1750_SendACK(0);

//回应ACK

Delay5ms();

//初始化BH1750,根据需要请参考pdf进行修改****

voidInit_BH1750()

Single_Write_BH1750(0x01);

//主程序********

voidmain()

floattemp;

delay_nms(100);

//延时100ms

InitLcd();

//初始化LCD

Init_BH1750();

//初始化BH1750

while

(1)//循环

{

//poweron

Single_Write_BH1750(0x10);

//H-resolutionmode

delay_nms(180);

//延时180ms

Multiple_Read_BH1750();

//连续读出数据,存储在BUF中

dis_data=BUF[0];

dis_data=(dis_data<

8)+BUF[1];

//合成数据,即光照数据

temp=(float)dis_data/1.2;

conversion(temp);

//计算数据和显示

DisplayOneChar(0,0,'

L'

);

DisplayOneChar(1,0,'

i'

DisplayOneChar(2,0,'

g'

DisplayOneChar(3,0,'

h'

DisplayOneChar(4,0,'

t'

DisplayOneChar(5,0,'

:

'

DisplayOneChar(7,0,wan);

//显示数据

DisplayOneChar(8,0,qian);

DisplayOneChar(9,0,bai);

DisplayOneChar(10,0,shi);

DisplayOneChar(11,0,ge);

DisplayOneChar(13,0,'

l'

////显示数单位

DisplayOneChar(14,0,'

x'

}

以上程序为液晶1602事例程序来之互联网仅供参考

利用16位数字光强度传感器BH1750FVI和普通的51单片机设计了数字光照强度的数据实时采集与显示。

由于光强度传感器精度高,I2C总线接口简单易用,NOKIA5110液晶显示器使用方便、体积较小等特性,较为价廉地实现了高精度数字光照强度的实时采集。

其反应速度非常灵敏,测量精度高,适合于对精度要求较高的场合。

体会:

能看懂数据手册是个关键点,要有独立的编程能力才能做出一个好项目。

1.BH1710FVC/BH1750FVI应用手册

2.ROMH公司的BH1750FVI数据手册手册

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1