stm32f103 光敏传感器BH1750 实现串口回显

2023-05-16

在制作智能花盆的过程中,使用了光敏传感器BH1750。

因为在网上找了很多都是关于51的,32方面的比较少,所以这里记录一下BH750的驱动代码。

链接:https://pan.baidu.com/s/1UOQvp1qKvfeywY0BsDXA2w?pwd=zh92 
提取码:zh92 
--来自百度网盘超级会员V3的分享

这里由于篇幅限制,串口驱动的代码不给出,如果想要源码可以在上面链接获取。

bh1750.c

#include "BH1750.h"

unsigned char	BUF[8];                                 /* 读取光强中间量 */
int		dis_data;                               /* 读取光强中间量 */
int		mcy;                                    /* 读取光强中间量 */

void GPIOConfig( void )
{
	GPIO_InitTypeDef GPIO_InitStruct;

	/*开启GPIOB的外设时钟*/
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );

	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Pin	= sda | scl;
	GPIO_Init( GPIOB, &GPIO_InitStruct );
}

void Delay_5us( void )
{
	Delay_us( 5 );
}

void Delay_mms( unsigned int tmp )
{
	while ( tmp-- )
	{
		Delay_ms( 1 );
	}
}


/***开始信号***/
void BH1750_Start()
{
	GPIO_SetBits( GPIOB, sda );     /* 拉高数据线 */
	GPIO_SetBits( GPIOB, scl );     /* 拉高时钟线 */
	Delay_5us();                    /* 延时 */
	GPIO_ResetBits( GPIOB, sda );   /* 产生下降沿 */
	Delay_5us();                    /* 延时 */
	GPIO_ResetBits( GPIOB, scl );   /* 拉低时钟线 */
}


/*****停止信号******/
void BH1750_Stop()
{
	GPIO_ResetBits( GPIOB, sda );   /* 拉低数据线 */
	GPIO_SetBits( GPIOB, scl );     /* 拉高时钟线 */
	Delay_5us();                    /* 延时 */
	GPIO_SetBits( GPIOB, sda );     /* 产生上升沿 */
	Delay_5us();                    /* 延时 */
}


/**************************************
*  发送应答信号
*  入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK( unsigned int ack )
{
	GPIO_InitTypeDef GPIO_InitStruct;

	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Pin	= sda;
	GPIO_Init( GPIOB, &GPIO_InitStruct );


	if ( ack == 1 )                 /* 写应答信号 */
		GPIO_SetBits( GPIOB, sda );
	else if ( ack == 0 )
		GPIO_ResetBits( GPIOB, sda );
	else
		return;

	GPIO_SetBits( GPIOB, scl );     /* 拉高时钟线 */
	Delay_5us();                    /* 延时 */
	GPIO_ResetBits( GPIOB, scl );   /* 拉低时钟线 */
	Delay_5us();                    /* 延时 */
}


/**************************************
*  接收应答信号
**************************************/
unsigned int BH1750_RecvACK()
{
	GPIO_InitTypeDef GPIO_InitStruct;

	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_IPU;        /*这里一定要设成输入上拉,否则不能读出数据*/
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Pin	= sda;
	GPIO_Init( GPIOB, &GPIO_InitStruct );

	GPIO_SetBits( GPIOB, scl );                             /* 拉高时钟线 */
	Delay_5us();                                            /* 延时 */

	if ( GPIO_ReadInputDataBit( GPIOB, sda ) == 1 )         /* 读应答信号 */
		mcy = 1;
	else
		mcy = 0;

	GPIO_ResetBits( GPIOB, scl );                           /* 拉低时钟线 */
	Delay_5us();                                            /* 延时 */

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init( GPIOB, &GPIO_InitStruct );

	return(mcy);
}


/**************************************
*  向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte( unsigned char dat )
{
	unsigned char i;

	for ( i = 0; i < 8; i++ ) /* 8位计数器 */
	{
		if ( 0X80 & dat )
			GPIO_SetBits( GPIOB, sda );
		else
			GPIO_ResetBits( GPIOB, sda );

		dat <<= 1;
		GPIO_SetBits( GPIOB, scl );     /* 拉高时钟线 */
		Delay_5us();                    /* 延时 */
		GPIO_ResetBits( GPIOB, scl );   /* 拉低时钟线 */
		Delay_5us();                    /* 延时 */
	}
	BH1750_RecvACK();
}


unsigned char BH1750_RecvByte()
{
	unsigned char	i;
	unsigned char	dat = 0;
	unsigned char	bit;

	GPIO_InitTypeDef GPIO_InitStruct;

	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_IPU;        /*这里一定要设成输入上拉,否则不能读出数据*/
	GPIO_InitStruct.GPIO_Pin	= sda;
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz;
	GPIO_Init( GPIOB, &GPIO_InitStruct );

	GPIO_SetBits( GPIOB, sda );                             /* 使能内部上拉,准备读取数据, */
	for ( i = 0; i < 8; i++ )                               /* 8位计数器 */
	{
		dat <<= 1;
		GPIO_SetBits( GPIOB, scl );                     /* 拉高时钟线 */
		Delay_5us();                                    /* 延时 */

		if ( SET == GPIO_ReadInputDataBit( GPIOB, sda ) )
			bit = 0X01;
		else
			bit = 0x00;

		dat |= bit;                                     /* 读数据 */

		GPIO_ResetBits( GPIOB, scl );                   /* 拉低时钟线 */
		Delay_5us();                                    /* 延时 */
	}

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init( GPIOB, &GPIO_InitStruct );
	return(dat);
}

void Single_Write_BH1750( unsigned char REG_Address )
{
	BH1750_Start();                         /* 起始信号 */
	BH1750_SendByte( SlaveAddress );        /* 发送设备地址+写信号 */
	BH1750_SendByte( REG_Address );         /* 内部寄存器地址,请参考中文pdf22页 */
	/*  BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页 */
	BH1750_Stop();                          /* 发送停止信号 */
}

/* 初始化BH1750,根据需要请参考pdf进行修改**** */
void Init_BH1750()
{
	GPIOConfig();
	Single_Write_BH1750( 0x01 );
}


/* 连续读出BH1750内部数据 */
void mread( void )
{
	unsigned char i;
	BH1750_Start();                         /* 起始信号 */
	BH1750_SendByte( SlaveAddress + 1 );    /* 发送设备地址+读信号 */

	for ( i = 0; i < 3; i++ )               /* 连续读取6个地址数据,存储中BUF */
	{
		BUF[i] = BH1750_RecvByte();     /* BUF[0]存储0x32地址中的数据 */
		if ( i == 3 )
		{
			BH1750_SendACK( 1 );    /* 最后一个数据需要回NOACK */
		}else {
			BH1750_SendACK( 0 );    /* 回应ACK */
		}
	}

	BH1750_Stop();                          /* 停止信号 */
	Delay_mms( 5 );
}

float get_light_power(void)
{
	float lightPower;

	mread();                                        /* 连续读取gy30数据 */
	dis_data	= BUF[0];
	dis_data	= (dis_data << 8) + BUF[1];     /* 合成数据 */
	lightPower	= (float) dis_data / 1.2;       /* 得出光强  单位是lx */
	Single_Write_BH1750( 0x01 );                    /* power on */
	Single_Write_BH1750( 0x10 );                    /* H- resolution mode */
	return(lightPower);
}


BH1750.h

#ifndef __BH1750_H__
#define __BH1750_H__


#include "sys.h"
#include "delay.h"


#define sda	GPIO_Pin_6      /* 20 */
#define scl	GPIO_Pin_5      /* 21 */

#define   SlaveAddress 0x46  
/*
* 定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
* ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
 */
 
 
void Init_BH1750( void );
void conversion( unsigned int temp_data );
void Single_Write_BH1750( unsigned char REG_Address );  /* 单个写入数据 */
unsigned char Single_Read_BH1750( unsigned char REG_Address );  /* 单个读取内部寄存器数据 */
void mread( void );                             /* 连续的读取内部寄存器数据 */
void Delay_5us( void );
void Delay_ms( unsigned int tmp );
void GPIOConfig( void );
float get_light_power(void);
	

#endif

main.c

int main(void)
{	

		/* LED 端口初始化 */
	LED_G_Confing();
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  USART_Config();
		//bh1750初始化
	Init_BH1750();       //初始化BH1750
	printf("Start!!!\n");
	//  Delay_ms(180);            //延时180ms
	
	a = get_light_power();//获取光强
	printf("光照强度:%d\n",a);
  	while(1)
		{              /* 存储光强的变量 */
			a = get_light_power();//获取光强
			printf("Start!!!\n");
			printf("光照强度:%d\n",a);
			Delay_us(1000000);   
			
		}		
}	

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32f103 光敏传感器BH1750 实现串口回显 的相关文章

  • 初学FreeRTOS实现多任务程序

    初学FreeRTOS实现多任务程序 1 什么是FreeRTOS2 STM32下FreeRTOS移植2 1 准备工作2 2 移植更改2 2 1 新建分组2 2 2 添加相应的头文件路径2 2 3 修改 SYSTEM 文件 3 多任务程序的实现
  • 【计网+go】如何获取完整的报文?

    我们想要获取完整的报文 xff0c 首先得知道消息的长度和起始位置然后来读取 通常有以下几种方法 使用带消息头的协议 头部写入包长度 xff0c 然后再读取包内容 设置定长消息 xff0c 每次读取定长内容 xff0c 长度不够时空位补固定
  • Visual Studio 2022下载安装

    Visual Studio 2022下载安装 1 进入官网 官网地址 xff1a https visualstudio microsoft com 这里以Windows操作系统为例 根据需要选择版本 xff0c 我这里下载的是Enterpr
  • Lighttpd入门教程

    Lighttpd入门教程 概述入门教程安装配置静态文件服务动态文件服务 虚拟主机SSL启动服务器日志模块总结lighthttpd使用场景和原理使用场景原理 概述 Lighttpd xff08 也称为轻量级HTTP服务器 xff09 是一款快
  • 5.OSD叠加学习之在YUV图片上显示 竖线横线斜线

    目录 实现效果图 实现思路 xff1a 代码编写 实现效果图 实现思路 xff1a 无论是显示 竖线横线还是斜线 xff0c 无非是对 多个连续的 像素点进行操作 xff0c 明白了一个像素点如何点亮 xff0c 加个循环偏移量 xff0c
  • shell脚本发送http请求

    简述 xff1a 使用shell脚本发送http请求 xff0c 解析请求获取token再次发起请求 系统 xff1a ubuntu系统 工具 xff1a cURL 发送http请求 xff0c jq 解析json xff0c 没有需要安装
  • 2020年电赛省赛题目A——无线运动传感器节点设计

    无线运动传感器节点设计 题目要求设计方案分析心电检测模块方案ADS1292的A D转换计算心电信号的处理体表温度分析计算运动量分析计算无线传输模块设计显示屏的设计电路设计温度模块设计加速度计模块设计无线传输模块设计PCB布线布局 题目要求
  • 【全志T113-S3_100ask】8-USB串口获取GPS数据(含解析)

    全志T113 S3 100ask 8 USB串口获取GPS数据 xff08 含解析 xff09 背景 xff08 一 xff09 USB串口驱动 xff08 二 xff09 驱动加载 xff08 三 xff09 简单读取串口数据 xff08
  • Java ---JVM栈的存储结构与运行原理

    目录 一 栈中存储结构 二 栈运行原理 一 栈中存储结构 1 每个线程都有自己的栈 xff0c 栈中的数据都是以栈帧 Stack Frame 的格式存在 2 在这个线程上正在执行的每个方法都各自对应一个栈帧 3 栈帧是一个内存区块 xff0
  • c++配置opencv环境

    c 43 43 配置opencv环境 环境 xff1a 系统 xff1a win10系统截至20190523版本 opencv版本 xff1a 3 4 6版本 教程 xff1a 1 下载opencv安装包 xff0c 由于4 0 1版本会出
  • Android应用安全解决方案

    前言 防止第三方反编译篡改应用 xff0c 防止数据隐私泄露 xff0c 防止二次打包欺骗用户 1 一些必要的基础知识 我们在加密的时候会用到一些加密或者编码方法 常见的有 xff0c 非对称加密算法 RSA 等 xff1b 对称加密算法
  • win10修改系统配置处理器引导参数后,系统无限蓝屏解决办法

    win10修改系统配置处理器引导参数后 xff0c 系统无限蓝屏解决办法 0 xff1a 开机时先按f8进入安全模式 xff0c 在进入命令提示符 1 进入 启动修复 的 命令提示符 xff08 最好是使用有管理员权限的 xff0c 不过普
  • 运行内存变成的2G,为硬件保留内存为6G

    运行内存变成的2G xff0c 为硬件保留内存为6G 先看设置中下面是否有设置是否激活windows xff0c 如有点进去 xff0c 有疑难解疑下面 xff0c 点入会自动激活windows xff0c 如盗版就不行 xff0c 激活后
  • ubuntu20.4安装NVIDIA驱动,cuda

    安装NVIDIA驱动准备工作 下载NVIDIA地址 xff1a https www nvidia cn Download index aspx lang 61 cn 查看是否安装好驱动命令 xff1a nvidia span class t
  • 图像进行反转:白变黑,黑变白

    图像进行反转 xff1a 白变黑 xff0c 黑变白 二值图对图像进行反转 span class token keyword import span cv2 img span class token operator 61 span spa
  • python调用相机和双目相机

    python调用相机 span class token keyword import span cv2 span class token keyword import span numpy span class token keyword
  • 安装PCL1.9.1其它版本号Python3.6+PCL1.9.1+VS2017+gtkbundle_3.6.4版本

    下载 python pcl文件 地址 xff1a https github com strawlab python pcl 安装 VS2017 安装PLC1 91 首先在自己电脑上安装PCL xff08 点击这里 xff09 xff0c 这
  • ROS--机器人小车仿真rviz

    URDF练习 需求描述 创建一个四轮圆柱状机器人模型 xff0c 机器人参数如下 底盘为圆柱状 xff0c 半径 10cm xff0c 高 8cm xff0c 四轮由两个驱动轮和两个万向支撑轮组成 xff0c 两个驱动轮半径为 3 25cm
  • ROS--URDF集成Gazebo仿真小车和rviz结合

    ROS URDF集成Gazebo仿真小车 实现流程 需要编写封装惯性矩阵算法的 xacro 文件 为机器人模型中的每一个 link 添加 collision 和 inertial 标签 xff0c 并且重置颜色属性 在 launch 文件中
  • 使用D435i深度相机运行ORB-SLAM3

    下载安装链接 下载ORB SLAM3地址 xff1a git clone https github com UZ SLAMLab ORB SLAM3 git eigen3多版本安装 xff1a https blog csdn net wei

随机推荐

  • keil5使用一个父工程打开多个子工程文件

    1 首先工程文件需要在同样的文件夹里 2 打开keil5 xff0c 选择Project New Multi Project Workspace 3 将工程文件建立在刚刚的总文件夹里面 xff0c 命名保存 4 弹出此页面 xff08 Cr
  • ​Android动态加载so!这一篇就够了!

    作者 xff1a Pika 链接 xff1a https juejin cn post 7107958280097366030 对于一个普通的android应用来说 xff0c so库的占比通常都是巨高不下的 xff0c 因为我们无可避免的
  • HTTP是什么

    HTTP是什么 HTTP是什么 HTTP协议是Hyper Text Transfer Protocol xff08 超文本传输协议 xff09 的缩写 是用于从万维网 xff08 WWW World Wide Web xff09 服务器传输
  • error: array has incomplete element type ‘char []‘

    原代码 xff1a void explain input char int char a 报错 xff1a error array has incomplete element type 39 char 39 原因 xff1a 可以用二维数
  • STM32串口接收十六进制数转为十进制数(包含负数)

    外部设备传输给STM32单片机十六进制数 例如0x09c4 代表2500 0xff38 代表 200 xff08 并不是65336 xff0c 因为这是有符号的 xff09 串口接收处理函数 接收到 5A A5 06 83 55 00 01
  • 无人机-3无人机ROS应用与开发

    一 ROS是什么 二 为什么要学习ROS 三 怎么学习ROS https www cnblogs com masbay p 10745170 html TF坐标系指机器人在现实世界会有坐标的变换 xff0c ROS已经将其算成固定的程序 x
  • ROS入门-4.安装ROS系统(ubuntu20.04版本安装ros的noetic版本)

    ubuntu20 04版本安装ros的noetic版本 1 添加软件源2 添加密钥3 更新4 安装ROS5 初始化rosdep6 设置环境变量7 测试ROS安装是否成功 1 添加软件源 2 添加密钥 3 更新 4 安装ROS 5 初始化ro
  • 数学建模-12.预测模型

    灰色预测 灰色系统 GM 1 1 模型 xff1a Grey Model GM 1 1 原理介绍 呢么 xff0c 准指数规律的检验 xff1f 发展系数 a 与预测情形的探究 发展系数越小预测的越精确 GM 1 1 模型的评价 在使用GM
  • 数学建模-数学规划模型

    数学规划模型 一 概述 1 什么是数学规划 xff1f 运筹学的一个分支 xff0c 用来研究在给定条件下 即约束条件 xff0c 如何按照某一衡量指标 xff08 目标函数 xff09 来寻求计划 管理工作中的最优方案 即求目标函数在一定
  • 机器学习西瓜书学习记录-第四章 决策树

    第4章 决策树 4 1基本流程 决策树 xff0c 一类常见机器学习方法 xff0c 希望从给定训练集学得一个模型用以对新示例进行分类 一般 xff0c 一棵决策树包含一个根结点 若干个内部结点和若干个叶结点 xff1b 叶结点对应于决策结
  • 机器学习西瓜书学习记录-第五章 神经网络

    第5章 神经网络 5 1神经元模型 神经网络中最基本的成分是神经元模型 M P神经元模型 xff0c 又称 阈值逻辑单元 在模型中 xff0c 神经元接收到来自n个其他神经元传递过来的输入信号 xff0c 这些输入信号通过带权重的连接进行传
  • 机器学习西瓜书学习记录-第六章 支持向量机

    第6章 支持向量机 移步b站学习 学习贴
  • SurfaceFlinger模块

    SurfaceFlinger是一个系统服务 xff0c 作用就是接受不同layer的buffer数据进行合成 xff0c 然后发送到显示设备进行显示 SurfaceFlinger进程是什么时候起来的 xff1f 在之前的Android低版本
  • STM32-串口通信实验

    一 通信接口背景知识 1 通信的两种方式 xff1a 并行通信 传输原理 数据各个位同时传输 优点 速度快缺点 占用引脚资源多 串行通信 传输原理 数据按位顺序传输 优点 占用引脚资源少缺点 速度相对较慢 2 串行通信 按照数据传送的方向
  • UDP介绍,编程流程

    介绍 xff1a 面向无连接的用户数据报协议 xff0c 不需要建立任何连接 xff0c 目的主机接收后不需要确认 UDP特点 xff1a 相比TCP速度快一些简单的应用程序直接使用 不需要加密对于海量数据不采用UDP广播和多播必须采用UD
  • 数据结构-线性表的链式存储(包含代码实现)

    线性表的链式表示和实现 链式存储结构 结点在存储器中的位置是任意的 xff0c 即逻辑上相邻的数据元素在物理上不一定相邻线性表的链式存储结构又称为非顺序映像或链式映像 用一组物理位置任意的存储单元来存放线性表的数据元素这组存储单元既可以是连
  • Android6.0以上高危权限动态申请

    1 在项目的Manifest xml中添加静态权限 拨打电话 lt uses permission android name 61 34 android permission CALL PHONE 34 gt 发送短信 lt uses pe
  • Linux入学—共享文件夹(保姆教程)

    序言 自从上学期上完课以来就没有用过Linux xff0c 最近因为学习传感器数据上传云端的需要 xff0c 安装了Linux xff0c 在开始装jdk的时候需要下载jdk的压缩包 xff0c 需要通过windows上传到Ubuntu 之
  • Ubuntu下安装java环境及idea

    前言 一 JDK的安装 二 配置环境 1 在 系统中配置java环境 三 idea社区版的安装 前言 提示 xff1a 这里可以添加本文要记录的大概内容 xff1a 由于自己的学习需要 xff0c 这里需要用到在Linux系统下的Java
  • stm32f103 光敏传感器BH1750 实现串口回显

    在制作智能花盆的过程中 xff0c 使用了光敏传感器BH1750 因为在网上找了很多都是关于51的 xff0c 32方面的比较少 xff0c 所以这里记录一下BH750的驱动代码 链接 xff1a https pan baidu com s