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光照强度传感相关推荐

  1. gy30光照传感器c语言程序,STM32F103驱动GY-30(BH1750)光照强度传感器程序讲解(附加程序下载)...

    GY-30是一款采用了ROHM-BH1750FVI芯片的数字输出的感光模块,可以测量的光照度范围为0~65535勒克斯,最小误差变动为±20%,分辨度为1勒克斯. GY-30是一个五针脚模块,包含VC ...

  2. 单片机控制数字光照强度传感模块GY-30(主芯片BH1750FVI)之模块化编程(持续更新中)

    这里将我写的STC12C5A60S2单片机控制数字光照强度模块GY-30(主芯片BH1750FVI)的程序共享一下,是为了让前辈给予斧正. 更新: 2014/04/29 14:05 (补充:以下代码只 ...

  3. STM32F103驱动GY-30(BH1750)光照强度传感器程序讲解(附加程序下载)

    GY-30是一款采用了ROHM-BH1750FVI芯片的数字输出的感光模块,可以测量的光照度范围为0~65535勒克斯,最小误差变动为±20%,分辨度为1勒克斯. GY-30是一个五针脚模块,包含VC ...

  4. STM32之光照强度(BH1750)

    STM32之光照强度BH1750 光照强度BH1750 API BH1750函数使用API IIC函数API 原文件 bh1750.c 头文件 bh1750.h 光照强度BH1750 API BH17 ...

  5. 【STM32-库函数】光照强度传感器BH1750 GY-30

    下载地址:BH1750光照强度库文件下载 BH1750光照强度传感器(GY-30) 谢谢观看,有问题需要请教的,请加入STM32学习交流群(QQ群号:470804974),本人QQ号297427819 ...

  6. ⑧ ESP8266 开发学习笔记_By_GYC 【ESP8266 驱动 BH1750 光强传感器】

    目录 一.BH1750是什么 二.驱动原理&代码 关于IIC BH1750驱动 三.结语 本章介绍 在ESP8266上使用IIC总线驱动BH1750光强传感器的方法. 一.BH1750是什么 ...

  7. 小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇)

    小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇) 文章目录 前言 一.Keil5+FLYMCU(软件烧录) 二.DHT11温湿度模块驱动代码 三.BH1750光照强度驱动代码 四. ...

  8. STM32应用开发实践教程:环境光照强度监测的应用开发

    4.2.1 任务分析 本任务要求设计一个应用程序,以实现对环境光照强度的监测.传感器硬件使用 ROHM 半 导体公司的 BH1750 光照强度传感器模块,该模块如图 4-2-1 所示,图 4-2-1( ...

  9. RT-Thread 传感器软件包归类

    简介 介绍了目前已经适配了rtthread的sensor框架的软件包,注意:有些传感器是即支持IIC也支持SPI,但是目前适配sensor框架只用了一种通讯接口. 传感器软件包列表 传感器型号 类型 ...

最新文章

  1. 3.QML布局和输入元素
  2. POJ1185 炮兵阵地 状压DP
  3. 计算机专业的学生如何为国防建设做贡献,大学生如何为国防建设做贡献?
  4. Delphi XE5 for Android (十一)
  5. 偏见为什么是数据科学领域的一个大问题
  6. 为什么Python中称__lt__、__gt__等为“富比较”方法
  7. 搜狗云输入法对外提供调用体验
  8. vs2015编译ffmpeg
  9. 1. 第一个lavarel 项目
  10. 安卓谷歌地图离线包_手机卫星地图
  11. 牧云Webshell检测神器
  12. IBM PureApplication System中的硬件之旅:第二代
  13. 微带线和带状线的SIEMC分析以及对DDR等长设置的影响
  14. 从零起步认识XAML
  15. 行业研究-全球与中国移动现场服务解决方案市场现状及未来发展趋势
  16. joan jett(mv)
  17. 腾讯文档多人在线编辑表格协议分析
  18. java 定时器(整点报时)
  19. 航天联志Aisino系列服务器,高性价比 航天联志5241NR服务器评测
  20. 小程序的踩坑-持续更新-建议收藏

热门文章

  1. STM32F103标准库开发:外部中断(EXTI)实验
  2. Windows下用cmd跳转指定目录(切换盘符出bug的解决方案)
  3. 分布式理论——CAP定理
  4. python 卡方分布值_重温统计学--抽样分布
  5. 用Python爬取我的微信好友昵称和头像,原来...
  6. 【每日英文】2021.8.9
  7. 数字图像处理(冈萨雷斯版)学习笔记(3)第3,6章
  8. 分享7个漂亮的 JetBrains IDE 代码主题,让你的开发体验更高效愉悦
  9. What is important ?
  10. 三菱FX3U底层源码,PLSR源码 总体功能和指令可能支持在RUN中下载程序,支持注释的写入和读取