STM32F103ZET6+IIC+BH1750光照强度传感
STM32F103ZET6+IIC+BH1750光照强度传感
为了加深对IIC协议的理解和应用,接下来,使用STM32驱动BH1750光照强度传感器
准备IIC协议
其实IIC协议还是之前的驱动温湿度传感的那个,只是把GPIO引脚口改了一下,同理,之后遇到使用IIC协议驱动的传感器,都可以用这个定义的IIC协议。
1、声明GPIO和IIC初始化
void BH1750_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(BH_SCL_GPIO_CLK | BH_SDA_GPIO_SDA, ENABLE);GPIO_InitStructure.GPIO_Pin = BH_SCL_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BH_SCL_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = BH_SDA_GPIO_PIN;GPIO_Init(BH_SDA_GPIO_PORT, &GPIO_InitStructure);Single_Write_BH1750(0x01); //初始化BH1750delay_ms(180);}
2、IIC数据线的输出模式
因为在IIC数据线输出数据前,需要将数据线设置为输出模式才行
void SDA_OUT(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = BH_SDA_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BH_SDA_GPIO_PORT, &GPIO_InitStructure);
}
3、IIC数据线的输入模式
同样在IIC数据线输入数据前,需要将数据线设置为输入模式才行
void SDA_IN(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = BH_SDA_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(BH_SDA_GPIO_PORT, &GPIO_InitStructure);
}
4、IIC起始信号
void BH_IIC_Start(void)
{SDA_OUT();BH_SDA = 1;BH_SCL = 1;delay_us(20);BH_SDA = 0; delay_us(20);BH_SCL = 0;
}
5、IIC停止信号
void BH_IIC_Stop(void)
{SDA_OUT();BH_SCL = 0;BH_SDA = 0; delay_us(20);BH_SCL = 1;BH_SDA = 1;delay_us(20);
}
6、IIC等待应答信号
返回值:1,接收应答失败;0,接收应答成功。
u8 BH_IIC_Wait_Ack(void)
{u8 ucErrTime = 0;SDA_IN();BH_SDA = 1;delay_us(10);BH_SCL = 1;delay_us(10);while(BH_SDA_READ()){ucErrTime++;if(ucErrTime > 250){BH_IIC_Stop();return 1;}}BH_SCL = 0; return 0;
}
7、IIC产生应答信号
void BH_IIC_Ack(void)
{BH_SCL = 0;SDA_OUT();BH_SDA = 0;delay_us(20);BH_SCL = 1;delay_us(20);BH_SCL = 0;
}
8、IIC不产生应答信号
void BH_IIC_NAck(void)
{BH_SCL = 0;SDA_OUT();BH_SDA = 1;delay_us(20);BH_SCL = 1;delay_us(20);BH_SCL = 0;
}
9、IIC发送一个字节
返回从机有无应答,1,有应答;0,无应答。
void BH_IIC_Send_Byte(u8 txd)
{u8 t;SDA_OUT();BH_SCL = 0; for(t = 0; t < 8; t++){if((txd & 0x80) >> 7)BH_SDA = 1;elseBH_SDA = 0;txd <<= 1;delay_us(20);BH_SCL = 1;delay_us(20);BH_SCL = 0;delay_us(20);}delay_us(20);}
10、IIC读取一个字节
读取字节时,ask=1,产生应答;ask=0,不产生应答
u16 BH_IIC_Read_Byte(u8 ack)
{u8 i;u16 receive = 0;SDA_IN();for(i = 0; i < 8; i++ ){BH_SCL = 0;delay_us(20);BH_SCL = 1;receive <<= 1;if(BH_SDA_READ())receive++;delay_us(20);}if (!ack)BH_IIC_NAck();elseBH_IIC_Ack(); return receive;
}
光照强度传感器的驱动过程
BH1750数据手册下载
驱动代码如下:
void Single_Write_BH1750(unsigned char REG_Address)
{BH_IIC_Start(); BH_IIC_Send_Byte(BHAddWrite); BH_IIC_Send_Byte(REG_Address); BH_IIC_Stop();
}//BH1750发送数据
void BH_Data_Send(u8 command)
{do{BH_IIC_Start(); BH_IIC_Send_Byte(BHAddWrite); }while(BH_IIC_Wait_Ack()); BH_IIC_Send_Byte(command); BH_IIC_Wait_Ack(); BH_IIC_Stop();
}//BH1750读取数据
u16 BH_Data_Read(void)
{u16 buf;u8 a;u8 b;BH_IIC_Start(); BH_IIC_Send_Byte(BHAddRead); BH_IIC_Wait_Ack(); b=BH_IIC_Read_Byte(1);a=BH_IIC_Read_Byte(0);buf=b*256+a; BH_IIC_Stop(); return buf;
}
在之前的USART工程上,新建两个文件,一个是BH1750.h文件,另一个是BH1750.c文件
BH1750.h文件的代码如下:
#ifndef __bh1750_H
#define __bh1750_H #include "sys.h"
#include "delay.h"#define BH_SCL PBout(0)
#define BH_SDA PBout(1)// GPIO 引脚定义
#define BH_SCL_GPIO_CLK RCC_APB2Periph_GPIOB
#define BH_SCL_GPIO_PORT GPIOB
#define BH_SCL_GPIO_PIN GPIO_Pin_0#define BH_SDA_GPIO_SDA RCC_APB2Periph_GPIOB
#define BH_SDA_GPIO_PORT GPIOB
#define BH_SDA_GPIO_PIN GPIO_Pin_1#define BH_SDA_READ() GPIO_ReadInputDataBit(BH_SDA_GPIO_PORT, BH_SDA_GPIO_PIN)#define ADDR 0x23 //0100011
#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 BH1750_GPIO_Init(void);
void SDA_OUT(void);
void SDA_IN(void);
void BH_IIC_Start(void);
void BH_IIC_Stop(void);
u8 BH_IIC_Wait_Ack(void);
void BH_IIC_Ack(void);
void BH_IIC_NAck(void);
void BH_IIC_Send_Byte(u8 txd);
u16 BH_IIC_Read_Byte(u8 ack);void Single_Write_BH1750(unsigned char REG_Address);
void BH_Data_Send(u8 command);
u16 BH_Data_Read(void);#endif
BH1750.c文件的代码如下:
#include "BH1750.h"void BH1750_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(BH_SCL_GPIO_CLK | BH_SDA_GPIO_SDA, ENABLE);GPIO_InitStructure.GPIO_Pin = BH_SCL_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BH_SCL_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = BH_SDA_GPIO_PIN;GPIO_Init(BH_SDA_GPIO_PORT, &GPIO_InitStructure);Single_Write_BH1750(0x01);delay_ms(180);}void SDA_OUT(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = BH_SDA_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BH_SDA_GPIO_PORT, &GPIO_InitStructure);
}void SDA_IN(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = BH_SDA_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(BH_SDA_GPIO_PORT, &GPIO_InitStructure);
}void BH_IIC_Start(void)
{SDA_OUT();BH_SDA = 1;BH_SCL = 1;delay_us(20);BH_SDA = 0;delay_us(20);BH_SCL = 0;
}void BH_IIC_Stop(void)
{SDA_OUT();BH_SCL = 0;BH_SDA = 0;delay_us(20);BH_SCL = 1;BH_SDA = 1;delay_us(20);
}u8 BH_IIC_Wait_Ack(void)
{u8 ucErrTime = 0;SDA_IN();BH_SDA = 1;delay_us(10);BH_SCL = 1;delay_us(10);while(BH_SDA_READ()){ucErrTime++;if(ucErrTime > 250){BH_IIC_Stop();return 1;}}BH_SCL = 0; return 0;
}void BH_IIC_Ack(void)
{BH_SCL = 0;SDA_OUT();BH_SDA = 0;delay_us(20);BH_SCL = 1;delay_us(20);BH_SCL = 0;
}void BH_IIC_NAck(void)
{BH_SCL = 0;SDA_OUT();BH_SDA = 1;delay_us(20);BH_SCL = 1;delay_us(20);BH_SCL = 0;
}void BH_IIC_Send_Byte(u8 txd)
{u8 t;SDA_OUT();BH_SCL = 0; for(t = 0; t < 8; t++){if((txd & 0x80) >> 7)BH_SDA = 1;elseBH_SDA = 0;txd <<= 1;delay_us(20);BH_SCL = 1;delay_us(20);BH_SCL = 0;delay_us(20);}delay_us(20);}u16 BH_IIC_Read_Byte(u8 ack)
{u8 i;u16 receive = 0;SDA_IN();for(i = 0; i < 8; i++ ){BH_SCL = 0;delay_us(20);BH_SCL = 1;receive <<= 1;if(BH_SDA_READ())receive++;delay_us(20);}if (!ack)BH_IIC_NAck();elseBH_IIC_Ack();return receive;
}void Single_Write_BH1750(unsigned char REG_Address)
{BH_IIC_Start(); BH_IIC_Send_Byte(BHAddWrite); BH_IIC_Send_Byte(REG_Address); BH_IIC_Stop();
}void BH_Data_Send(u8 command)
{do{BH_IIC_Start(); BH_IIC_Send_Byte(BHAddWrite); }while(BH_IIC_Wait_Ack()); BH_IIC_Send_Byte(command); BH_IIC_Wait_Ack(); BH_IIC_Stop();
}u16 BH_Data_Read(void)
{u16 buf;u8 a;u8 b;BH_IIC_Start(); BH_IIC_Send_Byte(BHAddRead); BH_IIC_Wait_Ack(); b=BH_IIC_Read_Byte(1);a=BH_IIC_Read_Byte(0);buf=b*256+a; BH_IIC_Stop(); return buf;
}
main.c文件的代码如下:
#include "stm32f10x.h"
#include <stdio.h>
#include "led.h"
#include "USART_Init_Config.h"
#include "BH1750.h"int main(void)
{int x=0;float c;delay_init(); //延时函数初始化 LED_Init(); //LED灯初始化USART_Init_Config(); //串口初始化BH1750_GPIO_Init(); //初始化BH1750BH_Data_Send(BHPowOn); delay_ms(2000); while(1){BH_Data_Send(BHReset);BH_Data_Send(BHModeH1); delay_ms(180);x=BH_Data_Read();c=x/1.2;printf("光照强度为:%0.2f",c);delay_ms(1000); }}
运行效果
打开串口调试助手
完整工程下载!!!
STM32F103ZET6+IIC+BH1750光照强度传感相关推荐
- gy30光照传感器c语言程序,STM32F103驱动GY-30(BH1750)光照强度传感器程序讲解(附加程序下载)...
GY-30是一款采用了ROHM-BH1750FVI芯片的数字输出的感光模块,可以测量的光照度范围为0~65535勒克斯,最小误差变动为±20%,分辨度为1勒克斯. GY-30是一个五针脚模块,包含VC ...
- 单片机控制数字光照强度传感模块GY-30(主芯片BH1750FVI)之模块化编程(持续更新中)
这里将我写的STC12C5A60S2单片机控制数字光照强度模块GY-30(主芯片BH1750FVI)的程序共享一下,是为了让前辈给予斧正. 更新: 2014/04/29 14:05 (补充:以下代码只 ...
- STM32F103驱动GY-30(BH1750)光照强度传感器程序讲解(附加程序下载)
GY-30是一款采用了ROHM-BH1750FVI芯片的数字输出的感光模块,可以测量的光照度范围为0~65535勒克斯,最小误差变动为±20%,分辨度为1勒克斯. GY-30是一个五针脚模块,包含VC ...
- STM32之光照强度(BH1750)
STM32之光照强度BH1750 光照强度BH1750 API BH1750函数使用API IIC函数API 原文件 bh1750.c 头文件 bh1750.h 光照强度BH1750 API BH17 ...
- 【STM32-库函数】光照强度传感器BH1750 GY-30
下载地址:BH1750光照强度库文件下载 BH1750光照强度传感器(GY-30) 谢谢观看,有问题需要请教的,请加入STM32学习交流群(QQ群号:470804974),本人QQ号297427819 ...
- ⑧ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 BH1750 光强传感器】
目录 一.BH1750是什么 二.驱动原理&代码 关于IIC BH1750驱动 三.结语 本章介绍 在ESP8266上使用IIC总线驱动BH1750光强传感器的方法. 一.BH1750是什么 ...
- 小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇)
小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇) 文章目录 前言 一.Keil5+FLYMCU(软件烧录) 二.DHT11温湿度模块驱动代码 三.BH1750光照强度驱动代码 四. ...
- STM32应用开发实践教程:环境光照强度监测的应用开发
4.2.1 任务分析 本任务要求设计一个应用程序,以实现对环境光照强度的监测.传感器硬件使用 ROHM 半 导体公司的 BH1750 光照强度传感器模块,该模块如图 4-2-1 所示,图 4-2-1( ...
- RT-Thread 传感器软件包归类
简介 介绍了目前已经适配了rtthread的sensor框架的软件包,注意:有些传感器是即支持IIC也支持SPI,但是目前适配sensor框架只用了一种通讯接口. 传感器软件包列表 传感器型号 类型 ...
最新文章
- 3.QML布局和输入元素
- POJ1185 炮兵阵地 状压DP
- 计算机专业的学生如何为国防建设做贡献,大学生如何为国防建设做贡献?
- Delphi XE5 for Android (十一)
- 偏见为什么是数据科学领域的一个大问题
- 为什么Python中称__lt__、__gt__等为“富比较”方法
- 搜狗云输入法对外提供调用体验
- vs2015编译ffmpeg
- 1. 第一个lavarel 项目
- 安卓谷歌地图离线包_手机卫星地图
- 牧云Webshell检测神器
- IBM PureApplication System中的硬件之旅:第二代
- 微带线和带状线的SIEMC分析以及对DDR等长设置的影响
- 从零起步认识XAML
- 行业研究-全球与中国移动现场服务解决方案市场现状及未来发展趋势
- joan jett(mv)
- 腾讯文档多人在线编辑表格协议分析
- java 定时器(整点报时)
- 航天联志Aisino系列服务器,高性价比 航天联志5241NR服务器评测
- 小程序的踩坑-持续更新-建议收藏
热门文章
- STM32F103标准库开发:外部中断(EXTI)实验
- Windows下用cmd跳转指定目录(切换盘符出bug的解决方案)
- 分布式理论——CAP定理
- python 卡方分布值_重温统计学--抽样分布
- 用Python爬取我的微信好友昵称和头像,原来...
- 【每日英文】2021.8.9
- 数字图像处理(冈萨雷斯版)学习笔记(3)第3,6章
- 分享7个漂亮的 JetBrains IDE 代码主题,让你的开发体验更高效愉悦
- What is important ?
- 三菱FX3U底层源码,PLSR源码 总体功能和指令可能支持在RUN中下载程序,支持注释的写入和读取