文章目录
前言
感谢各位朋友的关注,大家的关注是我不断更新的动力!这一期就写一下板子上带的光照模块吧!
文章有参考网络学习知识,此文章也只供大家学习!如有侵权,请联系我,立马删帖道歉!
一、BH1750是什么?
BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。
它支持I2CBUS接口,支持1.8v逻辑输入接口。传感器有两种可选的I2Cslave地址,无需其他外部件。光源依赖性弱,受红外线影响很小。传感器通过降低功率功能,实现低电流化。通过50Hz/60Hz除光噪音功能实现稳定的测定,最小误差变动在±20%。
二、引脚图以及引脚说明
实物图:如图示
图片来自互联网
图片来自互联网
引脚图:
VCC,电源端口。
ADDR,I2C地址端口,ADDR=“H”(ADDR≥0.7Vcc)“1011100”;ADDR=“L”(ADDR≤0.3Vcc)“0100011”。ADDR端口是用来缓冲内部测试的3种状态而设计的。所以,需要注意Vcc和DVI支持程序。
GND,接地端口。
SDA,I2C接口SDA端口。
SCL,I2C接口SCL端口。
三、BH1750特点
支持I2CBUS接口
接近视觉灵敏度的光谱灵敏度特性
输出对应亮度的数字值
对应广泛的输入光范围。(相当于1-lx)
通过降低功率功能,实现低电流化。
通过50Hz/60Hz除光噪音功能实现稳定的测定。
支持1.8v逻辑输入接口。
无需其他外部件。
光源依赖性弱。
有两种可选的I2Cslave地址。
可调的测量结果影响较大的因素为光入口大小。
使用这种功能计算1.1lx到lx马克斯/分钟的范围。
最小误差变动在±20%。
受红外线影响很小。
四、使用步骤
1.基本步骤
1,发送设备地址(写)并等待ACK,
发送高分辨率测量指令,
等待ACK,
停止时序。
2,等待传感器第一次测量完成。
读取测量结果。发送设备地址(读),读取高字节和低字节数据,
等待ACK,
停止时序。
计算公式为:
光照强度=(H+ L)/ 1.2 * 测量精度 (单位:lx)
在前面的工程中已经介绍过iic 请大家参照以前的文章或源码链接。
2.代码
代码如下(示例):
iic代码:
#include "ls1b.h"
#include "ls1b_gpio.h"
#include "tick.h"
#include "bsp.h"
#include "bh1750_iic.h"
/*********************************************************
功 能:初始化IIC
参 数: 无
返回值: 无
**********************************************************/
void IIC_Init(void)
{
gpio_enable( 32, DIR_OUT );
gpio_enable( 33, DIR_OUT );
gpio_write(32,1);
gpio_write(33,1);
}
/**************************************************************
*功 能:配置输出端口
*参 数: 无
*返回值: 无
**************************************************************/
void SDA_OUT(void)
{
gpio_enable( 33, DIR_OUT );
}
/**************************************************************
*功 能:配置输入端口
*参 数: 无
*返回值: 无
**************************************************************/
void SDA_IN(void)
{
gpio_enable( 33, DIR_IN );
}
/*********************************************************
功 能:产生IIC起始信号
参 数: 无
返回值: 无
**********************************************************/
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
gpio_write(33,1);
gpio_write(32,1);
delay_us(2);
gpio_write(33,0);//START:when CLK is high,DATA change form high to low
delay_us(2);
gpio_write(32,0);//钳住I2C总线,准备发送或接收数据
}
/*********************************************************
功 能:产生IIC停止信号
参 数: 无
返回值: 无
**********************************************************/
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
gpio_write(32,0);
gpio_write(33,0);//STOP:when CLK is high DATA change form low to high
delay_us(2);
gpio_write(32,1);
gpio_write(33,1);//发送I2C总线结束信号
delay_us(2);
}
/*********************************************************
功 能:等待应答信号到来
参 数: 无
返回值: 1,接收应答失败
0,接收应答成功
**********************************************************/
unsigned char IIC_Wait_Ack(void)
{
unsigned char ucErrTime=0;
SDA_IN(); //SDA设置为输入
gpio_write(33,1);
delay_us(1);
gpio_write(32,1);
delay_us(1);
while(gpio_read( 33 ))
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
gpio_write(32,0);//时钟输出0
return 0;
}
/*********************************************************
功 能:产生ACK应答
参 数: 无
返回值: 无
**********************************************************/
void IIC_Ack(void)
{
gpio_write(32,0);
SDA_OUT();
gpio_write(33,0);
delay_us(2);
gpio_write(32,1);
delay_us(2);
gpio_write(32,0);
}
/*********************************************************
功 能:不产生ACK应答
参 数: 无
返回值: 无
**********************************************************/
void IIC_NAck(void)
{
gpio_write(32,0);
SDA_OUT();
gpio_write(33,1);
delay_us(2);
gpio_write(32,1);
delay_us(2);
gpio_write(32,0);
}
/*********************************************************
功 能:IIC发送一个字节
参 数: 无
返回值: 从机有无应答
1,有应答
0,无应答
**********************************************************/
void IIC_Send_Byte(unsigned char txd)
{
unsigned char t;
SDA_OUT();
gpio_write(32,0);//拉低时钟开始数据传输
for(t=0; t<8; t++)
{
gpio_write(33,(txd&0x80)>>7);
txd<<=1;
delay_us(1); //对TEA5767这三个延时都是必须的
gpio_write(32,1);
delay_us(1);
gpio_write(32,0);
delay_us(1);
}
}
/*********************************************************
功 能:读1个字节
参 数: ack=1时,ack=0时
返回值: 发送ACK,发送nACK
**********************************************************/
unsigned char IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0; i<8; i++ )
{
gpio_write(32,0);
delay_us(1);
gpio_write(32,1);
receive<<=1;
if(gpio_read( 33 ))
receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
iic.h
#ifndef _BH1750_IIC_H
#define _BH1750_IIC_H
//IIC所有操作函数
void IIC_Init(void); //初始化IIC的IO口
void SDA_OUT(void);
void SDA_IN(void);
void IIC_Start(void); //发送IIC开始信号
void IIC_Stop(void); //发送IIC停止信号
void IIC_Send_Byte(unsigned char txd); //IIC发送一个字节
unsigned char IIC_Read_Byte(unsigned char ack); //IIC读取一个字节
unsigned char IIC_Wait_Ack(void); //IIC等待ACK信号
void IIC_Ack(void); //IIC发送ACK信号
void IIC_NAck(void); //IIC不发送ACK信号
void IIC_Write_One_Byte(unsigned char daddr,unsigned char addr,unsigned char data);
unsigned char IIC_Read_One_Byte(unsigned char daddr,unsigned char addr);
#endif // _BH1750_IIC_H
BH1750.c
#include "ls1b.h"
#include "ls1b_gpio.h"
#include "tick.h"
#include "bsp.h"
#include "bh1750_iic.h"
#include "bh1750.h"
float result_lx=0;
unsigned char BUF[2]={0};
unsigned char result1750=0;
extern unsigned char tmp_buf[16];
/**************************************************************
*功 能:端口初始化
*参 数: 无
*返回值: 无
**************************************************************/
void BH1750_Init(void)
{
IIC_Init();
}
/**************************************************************
*功 能:发送设备地址
*参 数: 无
*返回值: 无
**************************************************************/
void Cmd_Write_BH1750(unsigned char cmd)
{
IIC_Start(); //起始信号
IIC_Send_Byte(BH1750_Addr+0); //发送设备地址+写信号
while(IIC_Wait_Ack());
IIC_Send_Byte(cmd); //内部寄存器地址
while(IIC_Wait_Ack());
IIC_Stop(); //发送停止信号
delay_ms(5);
}
/**************************************************************
*功 能:开启一次H分辨率模式
*参 数: 无
*返回值: 无
**************************************************************/
void Start_BH1750(void)
{
Cmd_Write_BH1750(BH1750_ON); //power on
Cmd_Write_BH1750(BH1750_RSET); //clear
Cmd_Write_BH1750(BH1750_ONE); //一次H分辨率模式,至少120ms,之后自动断电模式
}
/**************************************************************
*功 能:读光照信号
*参 数: 无
*返回值: 无
**************************************************************/
void Read_BH1750(void)
{
IIC_Start(); //起始信号
IIC_Send_Byte(BH1750_Addr+1); //发送设备地址+读信号
while(IIC_Wait_Ack());
BUF[0]=IIC_Read_Byte(1); //发送ACK
BUF[1]=IIC_Read_Byte(0); //发送NACK
IIC_Stop(); //停止信号
delay_ms(5);
}
/**************************************************************
*功 能:合成光照数据
*参 数: 无
*返回值: 无
**************************************************************/
void Convert_BH1750(void)
{
result1750=BUF[0];
result1750=(result1750<<8)+BUF[1]; //合成数据,即光照数据
result1750=(float)result1750/1.2;
}
/**************************************************************
*功 能:显示光照数据
*参 数: 无
*返回值: 无
**************************************************************/
void BH1750_Test(void)
{
unsigned char buf[20] = {0};
unsigned int lx = 0;
Start_BH1750(); //power on
delay_ms(120); //延时120ms
Read_BH1750(); //连续读取结果 到BUF里面
Convert_BH1750(); //转换结果到result_lx
sprintf((char *)buf,"%d lux", result1750);
fb_textout(160, 70, buf);
}
总结
源码链接:龙芯1B:BH1750光照例程-嵌入式文档类资源-CSDN文库
联系我们
vx ——> buildupup 公众号 嵌入式up 如果文章对您有帮助,请打赏一元呗,感谢支持,分享不易,码字不易。希望对大家帮助!