STM32F103—有关BH1750(GY-302)环境光强度传感器模块的代码
VCC(供电电压源正极,3.3~5v的电压)
GND(供电电压源负极)
SCL(IIC时钟线,时钟输入引脚,由MCU输出时钟)GPIO_Pin_6
SDA(IIC数据线,双向IO口,用来传输数据)GPIO_Pin_7
ADDR(IIC地址线,接GND时器件地址为0100011 ,接VCC时器件地址为1011100)接电源
BH1750电路工作原理原理图:
指令集:
bh1750.c
#include "bh1750.h"
#include "sys.h"/*应用说明:在访问I2C设备前,请先调用 i2c_CheckDevice() 检测I2C设备是否正常,该函数会配置GPIO
*/static void I2C_BH1750_GPIOConfig(void);/*
*********************************************************************************************************
* 函 数 名: i2c_Delay
* 功能说明: I2C总线位延迟,最快400KHz
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void i2c_Delay(void)
{uint8_t i;/* 下面的时间是通过逻辑分析仪测试得到的。工作条件:CPU主频72MHz ,MDK编译环境,1级优化循环次数为10时,SCL频率 = 205KHz 循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us 循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us */for (i = 0; i < 10; i++);
}/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线启动信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Start(void)
{/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */BH1750_I2C_SDA_1();BH1750_I2C_SCL_1();i2c_Delay();BH1750_I2C_SDA_0();i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();
}/*
*********************************************************************************************************
* 函 数 名: i2c_Start
* 功能说明: CPU发起I2C总线停止信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Stop(void)
{/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */BH1750_I2C_SDA_0();BH1750_I2C_SCL_1();i2c_Delay();BH1750_I2C_SDA_1();
}/*
*********************************************************************************************************
* 函 数 名: i2c_SendByte
* 功能说明: CPU向I2C总线设备发送8bit数据
* 形 参:_ucByte : 等待发送的字节
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{uint8_t i;/* 先发送字节的高位bit7 */for (i = 0; i < 8; i++){ if (_ucByte & 0x80){BH1750_I2C_SDA_1();}else{BH1750_I2C_SDA_0();}i2c_Delay();BH1750_I2C_SCL_1();i2c_Delay(); BH1750_I2C_SCL_0();if (i == 7){BH1750_I2C_SDA_1(); // 释放总线}_ucByte <<= 1; /* 左移一个bit */i2c_Delay();}
}/*
*********************************************************************************************************
* 函 数 名: i2c_ReadByte
* 功能说明: CPU从I2C总线设备读取8bit数据
* 形 参:无
* 返 回 值: 读到的数据
*********************************************************************************************************
*/
uint8_t i2c_ReadByte(void)
{uint8_t i;uint8_t value;/* 读到第1个bit为数据的bit7 */value = 0;for (i = 0; i < 8; i++){value <<= 1;BH1750_I2C_SCL_1();i2c_Delay();if (BH1750_I2C_SDA_READ()){value++;}BH1750_I2C_SCL_0();i2c_Delay();}return value;
}/*
*********************************************************************************************************
* 函 数 名: i2c_WaitAck
* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
* 形 参:无
* 返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
uint8_t i2c_WaitAck(void)
{uint8_t re;BH1750_I2C_SDA_1(); /* CPU释放SDA总线 */i2c_Delay();BH1750_I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */i2c_Delay();if (BH1750_I2C_SDA_READ()) /* CPU读取SDA口线状态 */re = 1;elsere = 0;BH1750_I2C_SCL_0();i2c_Delay();return re;
}/*
*********************************************************************************************************
* 函 数 名: i2c_Ack
* 功能说明: CPU产生一个ACK信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{BH1750_I2C_SDA_0(); /* CPU驱动SDA = 0 */i2c_Delay();BH1750_I2C_SCL_1(); /* CPU产生1个时钟 */i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();BH1750_I2C_SDA_1(); /* CPU释放SDA总线 */
}/*
*********************************************************************************************************
* 函 数 名: i2c_NAck
* 功能说明: CPU产生1个NACK信号
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{BH1750_I2C_SDA_1(); /* CPU驱动SDA = 1 */i2c_Delay();BH1750_I2C_SCL_1(); /* CPU产生1个时钟 */i2c_Delay();BH1750_I2C_SCL_0();i2c_Delay();
}/*
*********************************************************************************************************
* 函 数 名: I2C_BH1750_GPIOConfig
* 功能说明: 配置I2C总线的GPIO,采用模拟IO的方式实现
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void I2C_BH1750_GPIOConfig(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(BH1750_RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */GPIO_InitStructure.GPIO_Pin = BH1750_I2C_SCL_PIN | BH1750_I2C_SDA_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /* 开漏输出 */GPIO_Init(BH1750_GPIO_PORT_I2C, &GPIO_InitStructure);/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */i2c_Stop();
}/*
*********************************************************************************************************
* 函 数 名: i2c_CheckDevice
* 功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在
* 形 参:_Address:设备的I2C总线地址
* 返 回 值: 返回值 0 表示正确, 返回1表示未探测到
*********************************************************************************************************
*/
uint8_t i2c_CheckDevice(uint8_t _Address)
{uint8_t ucAck;i2c_Start(); /* 发送启动信号 *//* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */i2c_SendByte(_Address | BH1750_I2C_WR);ucAck = i2c_WaitAck(); /* 检测设备的ACK应答 */i2c_Stop(); /* 发送停止信号 */return ucAck;
}//BH1750写一个字节
//返回值 成功:0 失败:非0
uint8_t BH1750_Byte_Write(uint8_t data)
{i2c_Start();//发送写地址i2c_SendByte(BH1750_Addr|0);if(i2c_WaitAck()==1)return 1;//发送控制命令i2c_SendByte(data);if(i2c_WaitAck()==1)return 2;i2c_Stop();return 0;
}//BH1750读取测量数据
//返回值 成功:返回光照强度 失败:返回0
uint16_t BH1750_Read_Measure(void)
{uint16_t receive_data=0; i2c_Start();//发送读地址i2c_SendByte(BH1750_Addr|1);if(i2c_WaitAck()==1)return 0;//读取高八位receive_data=i2c_ReadByte();i2c_Ack();//读取低八位receive_data=(receive_data<<8)+i2c_ReadByte();i2c_NAck();i2c_Stop();return receive_data; //返回读取到的数据
}//BH1750s上电
void BH1750_Power_ON(void)
{BH1750_Byte_Write(POWER_ON);
}//BH1750s断电
void BH1750_Power_OFF(void)
{BH1750_Byte_Write(POWER_OFF);
}//BH1750复位 仅在上电时有效
void BH1750_RESET(void)
{BH1750_Byte_Write(MODULE_RESET);
}//BH1750初始化
void BH1750_Init(void)
{I2C_BH1750_GPIOConfig(); /* 配置GPIO */BH1750_Power_ON(); //BH1750s上电//BH1750_RESET(); //BH1750复位BH1750_Byte_Write(Measure_Mode);//SysTick_Delay_ms(120);
}//获取光照强度
float LIght_Intensity(void)
{return (float)(BH1750_Read_Measure()/1.1f*Resolurtion);
}
bh1750.h
#ifndef __BH1750_H
#define __BH1750_H
#include "sys.h"//BH1750的地址
#define BH1750_Addr 0x46//BH1750指令码
#define POWER_OFF 0x00
#define POWER_ON 0x01
#define MODULE_RESET 0x07
#define CONTINUE_H_MODE 0x10
#define CONTINUE_H_MODE2 0x11
#define CONTINUE_L_MODE 0x13
#define ONE_TIME_H_MODE 0x20
#define ONE_TIME_H_MODE2 0x21
#define ONE_TIME_L_MODE 0x23//测量模式
#define Measure_Mode CONTINUE_H_MODE//分辨率 光照强度(单位lx)=(High Byte + Low Byte)/ 1.2 * 测量精度
#if ((Measure_Mode==CONTINUE_H_MODE2)|(Measure_Mode==ONE_TIME_H_MODE2))#define Resolurtion 0.5
#elif ((Measure_Mode==CONTINUE_H_MODE)|(Measure_Mode==ONE_TIME_H_MODE))#define Resolurtion 1
#elif ((Measure_Mode==CONTINUE_L_MODE)|(Measure_Mode==ONE_TIME_L_MODE))#define Resolurtion 4
#endif#define BH1750_I2C_WR 0 /* 写控制bit */
#define BH1750_I2C_RD 1 /* 读控制bit *//* 定义I2C总线连接的GPIO端口, 只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define BH1750_GPIO_PORT_I2C GPIOB /* GPIO端口 */
#define BH1750_RCC_I2C_PORT RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define BH1750_I2C_SCL_PIN GPIO_Pin_6 /* 连接到SCL时钟线的GPIO */
#define BH1750_I2C_SDA_PIN GPIO_Pin_7 /* 连接到SDA数据线的GPIO *//* 定义读写SCL和SDA的宏,已增加代码的可移植性和可阅读性 */
#if 0 /* 条件编译: 1 选择GPIO的库函数实现IO读写 */#define BH1750_I2C_SCL_1() GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN) /* SCL = 1 */#define BH1750_I2C_SCL_0() GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SCL_PIN) /* SCL = 0 */#define BH1750_I2C_SDA_1() GPIO_SetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN) /* SDA = 1 */#define BH1750_I2C_SDA_0() GPIO_ResetBits(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN) /* SDA = 0 */#define BH1750_I2C_SDA_READ() GPIO_ReadInputDataBit(BH1750_GPIO_PORT_I2C, BH1750_I2C_SDA_PIN) /* 读SDA口线状态 */
#else /* 这个分支选择直接寄存器操作实现IO读写 *//* 注意:如下写法,在IAR最高级别优化时,会被编译器错误优化 */#define BH1750_I2C_SCL_1() BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SCL_PIN /* SCL = 1 */#define BH1750_I2C_SCL_0() BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SCL_PIN /* SCL = 0 */#define BH1750_I2C_SDA_1() BH1750_GPIO_PORT_I2C->BSRR = BH1750_I2C_SDA_PIN /* SDA = 1 */#define BH1750_I2C_SDA_0() BH1750_GPIO_PORT_I2C->BRR = BH1750_I2C_SDA_PIN /* SDA = 0 */#define BH1750_I2C_SDA_READ() ((BH1750_GPIO_PORT_I2C->IDR & BH1750_I2C_SDA_PIN) != 0) /* 读SDA口线状态 */
#endifvoid i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);void BH1750_Init(void); //未包含IIC初始化
float LIght_Intensity(void); //读取光照强度的值
uint8_t BH1750_Byte_Write(uint8_t data);
uint16_t BH1750_Read_Measure(void);
void BH1750_Power_ON(void);
void BH1750_Power_OFF(void);
void BH1750_RESET(void);#endif
STM32F103—有关BH1750(GY-302)环境光强度传感器模块的代码相关推荐
- BH1750环境光强度传感器FPGA驱动
BH1750环境光强度传感器FPGA驱动 1. BH1750介绍 BH1750是一种用于两线式串行总线接口的数字型光强度传感器集成电路.这种集成电路可以根据收集的光线强度数据来调整液晶或 ...
- bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器
更多精彩~点击上面蓝字关注我们呀! 寻求更好的阅读体验,请点击阅读原文移步:Mculover666的个人博客. 本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I ...
- GY-39 气压,温湿度,光强度 传感器
文章目录 一.什么是GY-39? 二.产品参数 三.引脚说明 四.通信协议 1. 串口通信 2. IIC通信 五.项目工程 一.什么是GY-39? GY-39 是一款低成本,气压,温湿度,光强度 传感 ...
- 【花雕体验】14 行空板pinpong库测试外接传感器模块
1.pinpong库是一套控制开源硬件主控板的Python库,基于Firmata协议并兼容MicroPython语法,5分钟即可让你上手使用Python控制开源硬件.借助于pinpong库,直接用Py ...
- 使用ESP32 MicroPython I2C功能读取 BH1750光度传感器模块数据
简 介: 使用ESP32读取BH1750的光度传感器的数据.但是最终不知道甚么原因,所读取的数据都是0 ? 后面通过证明,说明在原来进行I2C写的时候出现了语法错误. 关键词: BH1750,ESP3 ...
- 强度光照模块rimg02 BH1750光度传感器模块
01简介 BH1750 是一款环境光强传感器,输出16bit的数字测量结果.下面是在淘宝购买的模块 强度光照模块rimg02bh1750光度传感器模块 . ▲ BH1750光强度模块的正反面 ■ 表格 ...
- 基于STM32单片机环境光强度检测系统光敏电阻LCD1602
实践制作DIY- GC0011-环境光强度检测系统光敏电阻 一.功能说明: 基于STM32单片机设计-环境光强度检测系统光敏电阻 功能介绍: 1.基于STM32F103C系列,LCD1602,使用光敏 ...
- 车载环境感知传感器介绍及比较
车载环境感知传感器比较 传感器的种类及分布 传感器种类及数量:3个激光雷达,两个毫米波雷达,工业相机(有单目也有双目的) 覆盖范围:车体360度全覆盖 探测距离:前方为100m,后方为80m),左右侧 ...
- 15.STC15W408AS单片机驱动BH1750FVI光强度传感器
https://mp.weixin.qq.com/s/id9sVd_uRSxIEgwgwlw31A 在上一篇中,我们介绍了IIC驱动OLED显示屏.这一篇是IIC驱动BH1750FVI光强度传感器.其 ...
最新文章
- 深度学习中的图像分割:方法和应用
- jsp内置对象page
- Phalcon控制器
- 基于TFS实践敏捷-可视化管理
- 美汽车销售商使用RFID汽车,加快销售速度
- jar 工程我怎么在网页上url访问某一个方法_Java高级编程之URL处理
- python爬虫系统知识_网络爬虫基础知识(Python实现)
- java基础视频教程 学习笔记
- Python+OpenCv实现摄像头人脸识别
- 国外常用免费博客平台
- oracle 允许级联删除,oracle系列--级联删除和级联更新
- zbrush常用笔刷_教您在ZBrush中制作笔刷
- WORDS WORTH光与影的传说简明攻略
- apache 开启php fpm,apache php fpm安装方法详解
- 0.618法matlab
- 传智播客javase总结 2
- 易推宝网络推广效果怎么样?
- python并列排名_Oracle并列排名显示
- 那些选择科研的女科学家(一)
- 华为VRRP双机热备(基于接口设置热备)