栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

关于BH1750的使用说明

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于BH1750的使用说明

1.、初始化IIC(用到STM32的管脚都要定义)

2、设置BH1750的参数(依次发送0x01,0x07,0x20下面是发送一个字节的流程,有一内内麻烦)

发送一个字节的流程

  • 起始信号(跟定义包头差不多,个人理解)
  • 发送一个“写操作”字节“0x46(告诉BH1750你要往它那写一个字节,)
  •  
  • 等待它反馈一个低电平信号
  • 发送一个0x01的字节(告诉BH1750它要使能)
  • 等待它反馈一个低电平信号
  • 发送停止信号(跟定义包尾差不多,个人理解)

发送一个字节的流程

  • 起始信号(跟定义包头差不多,个人理解)
  • 发送一个“写操作”字节“0x46(告诉BH1750你要往它那写一个字节,)
  • 等待它反馈一个低电平信号
  • 发送一个0x07的字节(告诉BH1750它要重置它里面的数据重置设置)
  • 等待它反馈一个低电平信号
  • 发送停止信号(跟定义包尾差不多,个人理解)

发送一个字节的流程

  • 起始信号(跟定义包头差不多,个人理解)
  • 发送一个“写操作”字节“0x46(告诉BH1750你要往它那写一个字节,)
  • 等待它反馈一个低电平信号
  • 发送一个0x20的字节(告诉BH1750它要设置成1次H分辨率模数,具体和其他模式下有什么区别有空你们可以尝试一下)
  • 等待它反馈一个低电平信号
  • 发送停止信号(跟定义包尾差不多,个人理解)

3  完成后需要等带120毫秒,等待BH1750反应时间,(下面是接送一个字节的流程,这个比较简单一内内)

读一个字节的流程

  • 起始信号(跟定义包头差不多,个人理解)
  • 发送一个“读操作”字节“0x47(告诉BH1750你要往它那读一个字节,)
  • 等待它反馈一个低电平信号
  • 先接收BH1750采集光照度数据的的高八位,发送一个信号告诉BH1750它可以发送下一个数据了(这个信号我们暂时定义它为1)
  • 在接收BH1750采集光照度数据的的低八位,发送一个信号告诉BH1750我们已经接收到最后的一个字节了(这个信号我们暂时定义它为0)
  • 发送停止信号(跟定义包尾差不多,个人理解)

4  对数据进行处理将高八位和低八位组合起来,在显示出来

#include "i2c.h"
#include "delay.h"


void IIC_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE);	//使能GPIOA/C时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;			//普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;		//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//100MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);				//初始化

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;			//普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;		//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//100MHz
    GPIO_Init(GPIOC, &GPIO_InitStructure);				//初始化

    IIC_SCL(1);
    IIC_SDA(1);
}


void SDA_OUT(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;					//PA4端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;		 	//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);				 	//初始化IO口
}


void SDA_IN(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;				 //PA4端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);				 	//初始化IO口

}


void IIC_Start(void)
{
    SDA_OUT();     //sda线输出
    IIC_SDA(1);
    IIC_SCL(1);
    Delay_us(4);
    IIC_SDA(0);//START:when CLK is high,DATA change form high to low
    Delay_us(4);
    IIC_SCL(0);//钳住I2C总线,准备发送或接收数据
}


void IIC_Stop(void)
{
    SDA_OUT();//sda线输出
    IIC_SCL(0);
    IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
    Delay_us(4);
    IIC_SCL(1);
    IIC_SDA(1);//发送I2C总线结束信号
    Delay_us(4);
}


uint8_t IIC_Wait_Ack(void)
{
    uint8_t ucErrTime=0;

    SDA_IN();      //SDA设置为输入
    IIC_SDA(1);
    Delay_us(1);
    IIC_SCL(1);
    Delay_us(1);

    while(READ_SDA())
    {
        ucErrTime++;
        if(ucErrTime>250)
        {
            IIC_Stop();
            return 1;
        }
    }
    IIC_SCL(0);//时钟输出0
    return 0;
}


void IIC_Ack(void)
{
    IIC_SCL(0);
    SDA_OUT();
    IIC_SDA(0);
    Delay_us(2);
    IIC_SCL(1);
    Delay_us(2);
    IIC_SCL(0);
}


void IIC_NAck(void)
{
    IIC_SCL(0);
    SDA_OUT();
    IIC_SDA(1);
    Delay_us(2);
    IIC_SCL(1);
    Delay_us(2);
    IIC_SCL(0);
}


void IIC_Send_Byte(uint8_t txd)
{
    uint8_t t;
    SDA_OUT();
    IIC_SCL(0);//拉低时钟开始数据传输
    for(t=0; t<8; t++)
    {
        IIC_SDA((txd&0x80)>>7);
        txd<<=1;
        Delay_us(2);   //对TEA5767这三个延时都是必须的
        IIC_SCL(1);
        Delay_us(2);
        IIC_SCL(0);
        Delay_us(2);
    }
}


uint8_t IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0; i<8; i++ )
    {
        IIC_SCL(0);
        Delay_us(2);
        IIC_SCL(1);
        receive<<=1;
        if(READ_SDA())receive++;
        Delay_us(1);
    }
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK
    return receive;
}

#include "bh1750.h"
#include 

float result_lx=0;
uint8_t BUF[2]={0};
uint16_t result1750=0;
extern unsigned char tmp_buf[16];


void BH1750_Init(void)
{
	IIC_Init(); 
}


void Cmd_Write_BH1750(uint8_t cmd)
{
    IIC_Start();						//起始信号
    IIC_Send_Byte(BH1750_Addr+0);		//发送设备地址+写信号
	while(IIC_Wait_Ack());
    IIC_Send_Byte(cmd);				//内部寄存器地址
	while(IIC_Wait_Ack());
    IIC_Stop();						//发送停止信号
	Delay_ms(5);
}



void Start_BH1750(void)
{
	Cmd_Write_BH1750(BH1750_ON);	 		//power on
	Cmd_Write_BH1750(BH1750_RSET);		//clear
	Cmd_Write_BH1750(BH1750_ONE);  		//一次H分辨率模式,至少120ms,之后自动断电模式  
}


void Read_BH1750(void)
{
    IIC_Start();							//起始信号
    IIC_Send_Byte(BH1750_Addr+1);		//发送设备地址+读信号
	while(IIC_Wait_Ack());
	BUF[0]=IIC_Read_Byte(1);				//发送ACK
	BUF[1]=IIC_Read_Byte(0);				//发送NACK
    IIC_Stop();							//停止信号
    Delay_ms(5);
}


void Convert_BH1750(void)
{
	result1750=BUF[0];
	result1750=(result1750<<8)+BUF[1];		//合成数据,即光照数据
	result1750=(double)result1750/1.2;

}


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/916887.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号