龙芯1B:光照BH1750例程

文章目录


前言

一、BH1750是什么?

二、引脚图以及引脚说明

 三、BH1750特点

四、使用步骤

1.基本步骤

2.代码

总结


前言

感谢各位朋友的关注,大家的关注是我不断更新的动力!这一期就写一下板子上带的光照模块吧!

文章有参考网络学习知识,此文章也只供大家学习!如有侵权,请联系我,立马删帖道歉!


一、BH1750是什么?

BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

它支持I2CBUS接口,支持1.8v逻辑输入接口。传感器有两种可选的I2Cslave地址,无需其他外部件。光源依赖性弱,受红外线影响很小。传感器通过降低功率功能,实现低电流化。通过50Hz/60Hz除光噪音功能实现稳定的测定,最小误差变动在±20%。

二、引脚图以及引脚说明

实物图:如图示

dc09332c781146a798e0670a50aaa629.png

图片来自互联网

64207d31be2348b0b1f17c1de33619d5.png

图片来自互联网

引脚图:

bae45127c1bc42e9a0c7288c9f3cbf83.png

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   如果文章对您有帮助,请打赏一元呗,感谢支持,分享不易,码字不易。希望对大家帮助!


没有走不通的路,只有不敢走的人!

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值