STM32F103ZET6+IIC+BH1750光照强度传感

这篇具有很好参考价值的文章主要介绍了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);  //初始化BH1750
  delay_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;
    else
      BH_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();
  else
    BH_IIC_Ack(); 
  return receive;
}

光照强度传感器的驱动过程

BH1750数据手册下载

STM32F103ZET6+IIC+BH1750光照强度传感
STM32F103ZET6+IIC+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;
    else
      BH_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();
  else
    BH_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();  //初始化BH1750
	
	BH_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光照强度传感
完整工程下载!!!文章来源地址https://www.toymoban.com/news/detail-410149.html

到了这里,关于STM32F103ZET6+IIC+BH1750光照强度传感的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32使用HAL库BH1750光照度传感器

    单片机:STM32F103C8T6 光照度传感器:BH1750 IDE:KEIL+STM32CUBEMX 1、STM32CUBEMX 1、头文件 2、C文件 3、主函数操作BH1750

    2024年02月14日
    浏览(30)
  • STM32外设芯片驱动学习记录 —— (一) BH1750光照传感器驱动开发

    一、芯片介绍 二、Datasheet解读 1.硬件说明 2.寄存器说明 3.通信过程 三、驱动代码编写 1.软件I2C驱动 2. BH1750芯片驱动函数 总结             BH1750是16位数字输出型,环境光强度传感器集成电路,使用I2C接口通信,工作电压:VCC(2.4~3.6V),I2C电平(1.65~VCC),用于各类消费类LCD屏

    2024年02月02日
    浏览(71)
  • BH1750( GY-302 )光照传感器

    这里我先简单的介绍一下BH1750光照传感器模块的基本信息(不多废话),我将着重讲解它的使用部分,相信对于屏幕前的你也是更关心它是怎么使用的,OK,gogogo!!! 芯片: BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的

    2024年02月03日
    浏览(29)
  • BH1750(GY-302)的使用,(光照传感器)

    BH1750(GY-302)的使用,(光照传感器) 提示:文章写完后,目录可以 自动生成,如何生成可参考右边的帮助文档 直接在网上购买BH1750 传感器模块 本课题使用 STM32F103-mini 提示:以下是本篇文章正文内容,下面案例可供参考 BH1750FVI是一款数字型光强度传感器集成芯片。某宝上

    2024年02月06日
    浏览(32)
  • STM32F103ZET6 驱动 OLED

    目录 前言 OLED模块的基本了解 OLED驱动程序的开发 前言 ​ 大家好,这是我第一次发帖,由于,我的技术并不成熟,程序难免有编写不规范的地方,希望读者能够指正,也希望这篇帖子能够让读者对OLED模块有个大致的了解。很高兴能与大家交流。 OLED模块的基本了解 OLED模块的

    2024年02月14日
    浏览(29)
  • 【STM32】STM32F103ZET6程序下载(串口方式)

    STM32 的程序下载有多种方法:USB、串口、JTAG、SWD 等,这几种方式,都可以用来给 STM32 下载代码。不过,我们最常用的,最经济的,就是通过串口给 STM32 下载代码。我们将向大家介绍,如何利用串口给 STM32 下载代码。 STM32 的串口下载一般是通过串口 1 下载的,STM32开发板,

    2024年02月04日
    浏览(42)
  • 矩阵键盘之门锁小项目(stm32f103zet6)

    今天,给大家分享的是自己弄着玩的一个矩阵键盘控制控制舵机模拟一个智能门锁的功能。 用到的硬件: 开发板我用的是原子哥的精英板(杀鸡用宰牛刀了)。 矩阵键盘(宝上十几块买的): 外加一个舵机和一个0.96的oled显示屏。 矩阵键盘: 有VCC,GND,SCL,SDO四条线,这个矩阵键

    2024年02月10日
    浏览(34)
  • AD7606与STM32F103ZET6的串行通信

      本文是AD7606与STM32的串行通信的学习心得,可帮助你快速入门AD7606。   图一   图二   图三   图四   根据图一,一些引脚在置高或置低时的上升或下降沿会受时间影响,因此在编写代码时,一些对引脚的操作需要放在一起,且延时函数不能随意使用。   图

    2024年02月08日
    浏览(57)
  • STM32---stm32f103c8t6与stm32f103zet6之间的代码移植转换

    目录 一、将c8t6转换为zet6 1、修改启动文件 2、修改芯片 3、将MD修改为HD  4、下载器的修改 5、修改完成,编译成功  二、将zet6转换为c8t6 最终结果如下:   将STM32F103C8改为STM32F103ZE   基本相同,反向即可。    

    2024年02月06日
    浏览(46)
  • MDK Keil5 创建Stm32工程-理论篇(这里以Stm32F103Zet6为例)

    整个工程可以粗略的划分为几个文件夹: BSP 底层驱动比如GPIOTimer等驱动文件 CMSIS 内核相关的文件 Firmware 生成的固件下载文件 Mycode 用户编写的相关文件,主要编写的文件都在这个文件夹里 Project 工程文件 startup 芯片启动文件 STM32F10x_FWLib 标准库文件 USER 主函数等文件 readm

    2023年04月24日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包