首页 > 编程知识 正文

bh1750光照强度传感器,光照传感器bh1750

时间:2023-05-03 07:29:46 阅读:252543 作者:4443

BH1750FVI光强度传感器及其STM32驱动程序 BH1750FVI光强度传感器的介绍

此传感器可以直接输出环境光强的数值(单位为lx),其内部有16位AD转换,即可表示1lx-65535lx,通过IIC输出其数值。
此传感器有3种分辨率模式,他们的分辨率分别为:4lx,1lx和0.5lx。他们的测量时间分别为:16ms,120ms,120ms。如果对测量时间要求不高的话,建议使用0.5lx分辨率的。
其引脚图为:

VCC:5V或3.3V
GND:接地
SCL:IIC时钟总线,在本程序中的引脚为PD6
SDA:IIC数据总线,在本程序中的引脚为PD7
AD0:地址线,不接时默认为低电平,在本程序中可不接

BH1750在STM32中的驱动程序

将下面的内容直接复制,可以直接使用,已经调试成功了。
light.h文件

#ifndef __LIGHT_H#define __LIGHT_H#include "sys.h"#include "delay.h"#include "light.h"//IO方向设置 #define SDA_IN() {GPIOD->CRL&=0X0FFFFFFF;GPIOD->CRL|=(u32)8<<28;}#define SDA_OUT() {GPIOD->CRL&=0X0FFFFFFF;GPIOD->CRL|=(u32)3<<28;}#define IIC_SCL PDout(6) //SCL#define IIC_SDA PDout(7) //SDA #define READ_SDA PDin(7) //输入SDA #define ADDR 0x23//0100011#define uchar unsigned char #define BHAddWrite 0x46 //从机地址+最后写方向位#define BHAddRead 0x47 //从机地址+最后读方向位#define BHPowDown 0x00 //关闭模块#define BHPowOn 0x01 //打开模块等待测量指令#define BHReset 0x07 //重置数据寄存器值在PowerOn模式下有效#define BHModeH1 0x10 //高分辨率 单位1lx 测量时间120ms#define BHModeH2 0x11 //高分辨率模式2 单位0.5lx 测量时间120ms#define BHModeL 0x13 //低分辨率 单位4lx 测量时间16ms#define BHSigModeH 0x20 //一次高分辨率 测量 测量后模块转到 PowerDown模式#define BHSigModeH2 0x21 //同上类似#define BHSigModeL 0x23 // 上类似void Single_Write_BH1750(uchar REG_Address);void Light_Init(void);void bh_data_send(u8 command);u16 bh_data_read(void);//IIC所有操作函数void IIC_Init(void); //初始化IIC的IO口 void IIC_Start(void);//发送IIC开始信号void IIC_Stop(void); //发送IIC停止信号void IIC_Send_Byte(u8 txd);//IIC发送一个字节u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节u8 IIC_Wait_Ack(void); //IIC等待ACK信号void IIC_Ack(void);//IIC发送ACK信号void IIC_NAck(void);//IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);u8 IIC_Read_One_Byte(u8 daddr,u8 addr);#endif

light.c文件

#include "delay.h"#include "light.h"typedef unsigned char BYTE;//BYTE BUF[8]; //接收数据缓存区 //iic接口初始化void Single_Write_BH1750(uchar REG_Address){ IIC_Start(); //起始信号 IIC_Send_Byte(BHAddWrite); //发送设备地址+写信号 IIC_Send_Byte(REG_Address); //内部寄存器地址, // BH1750_SendByte(REG_data); //内部寄存器数据, IIC_Stop(); //发送停止信号}void Light_Init(void){GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能A端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD3,6 GPIO_SetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_7);Single_Write_BH1750(0x01);}//产生IIC起始信号void IIC_Start(void){SDA_OUT(); //sda线输出IIC_SDA=1; IIC_SCL=1;delay_us(4); IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号void IIC_Stop(void){SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4); }//等待应答信号到来//返回值:1,接收应答失败// 0,接收应答成功u8 IIC_Wait_Ack(void){u8 ucErrTime=0;SDA_IN(); //SDA设置为输入 IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0 return 0; } //产生ACK应答void IIC_Ack(void){IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;}//不产生ACK应答 void IIC_NAck(void){IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;} //IIC发送一个字节//返回从机有无应答//1,有应答//0,无应答 void IIC_Send_Byte(u8 txd){ u8 t; SDA_OUT(); IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t<8;t++) { //IIC_SDA=(txd&0x80)>>7;if((txd&0x80)>>7)IIC_SDA=1;elseIIC_SDA=0;txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0;delay_us(2); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 IIC_Read_Byte(unsigned char ack){unsigned char i,receive=0;SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ){ IIC_SCL=0; delay_us(2);IIC_SCL=1; receive<<=1; if(READ_SDA)receive++; delay_us(1); } if (!ack) IIC_NAck();//发送nACK else IIC_Ack(); //发送ACK return receive;}/*************************************************************************************/void bh_data_send(u8 command){ do{ IIC_Start(); //iic起始信号 IIC_Send_Byte(BHAddWrite); //发送器件地址 }while(IIC_Wait_Ack()); //等待从机应答 IIC_Send_Byte(command); //发送指令 IIC_Wait_Ack(); //等待从机应答 IIC_Stop(); //iic停止信号}u16 bh_data_read(void){u16 buf;IIC_Start(); //iic起始信号IIC_Send_Byte(BHAddRead); //发送器件地址+读标志位IIC_Wait_Ack(); //等待从机应答buf=IIC_Read_Byte(1); //读取数据buf=buf<<8; //读取并保存高八位数据buf+=0x00ff&IIC_Read_Byte(0); //读取并保存第八位数据IIC_Stop(); //发送停止信号 return buf; }

main.c文件

#include "sys.h"#include "delay.h"#include "usart.h"#include "light.h" int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级delay_init(); //延时函数初始化 uart_init(115200); //串口初始化为115200Light_Init();bh_data_send(BHPowOn); bh_data_send(BHReset);bh_data_send(BHModeL); //选择的是分辨率是4lx,测量时间是16ms的delay_ms(180); while(1){printf("%dn",bh_data_read());delay_ms(16);} }

在串口调试助手中显示的结果为:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。