STM32 BH1750光线感应源程序

2020-08-06来源: elecfans关键字:STM32  BH1750  光线感应

单片机源程序如下:

#include  "bh1750.h"

#include "delay.h"

#include "timer.h"


u8 BUF[8];

u16 temp2=0;

float lux=0;



void bh1750_iic_init(void)

{

        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟

           

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6);         //PB6,PB7 输出高


}


/****向BH1750单次写命令****/

void Single_Write_bh1750(unsigned char Reg_Address)

{

        bh1750_iic_start();

        bh1750_send_byte(0x46);  //发送器件地址0100 0110   最后一位0,表示写

        //IIC_Wait_Ack();

        bh1750_send_byte(Reg_Address);  

        //IIC_Wait_Ack();

        bh1750_iic_stop();

}


/****BH1750初始化****/

void bh1750_Init(void)

{

        char dir=0;

        unsigned char value=0;

        TIM3_PWM_Init(899,0);

        bh1750_iic_init();

        TIM_SetCompare3(TIM3,0);

        

        while(1)

        {        

                Single_Write_bh1750(0x01);

                Single_Write_bh1750(0x10);

                delay_ms(200);

                bh1750_ReadContinuous1();

                temp2=BUF[0];

                temp2=(temp2<<8)+BUF[1];

                lux=(float)temp2/1.2;    //lux是float型        

                if((lux>0)&&(lux<50))

                        value=10;

                else if(lux<75)

                        value=20;

                else if(lux<100)

                        value=40;

                else if(lux<125)

                        value=50;

                else if(lux<150)

                        value=60;

                else if(lux<175)

                        value=70;

                else if(lux<200)

                        value=80;

                else if(lux<250)

                        value=90;

                else if(lux<280)

                        value=110;

                else if(lux<300)

                        value=120;

                else if(lux<320)

                        value=130;

                else if(lux<340)

                        value=140;

                else if(lux<360)

                        value=150;

                else if(lux<380)

                        value=160;

                else if(lux<400)

                        value=170;

                else if(lux<410)

                        value=180;

                else if(lux<450)

                        value=190;        

                else if(lux<800)

                        value=240;

                printf("光照强度:%f   value:%drn",lux,value);

                TIM_SetCompare3(TIM3,value);

               

                //delay_ms(1000);

        }

        

        

}


/****从BH1750单次读Lux****/

/****

模式选择:H-Resolution Mode,分辨率1lux

单次读Opecode:0010 0000 ,即0x20

器件地址:0100011,ADDR接GND

****/

void bh1750_ReadOneTime(void)

{

        


        bh1750_iic_start();

        bh1750_send_byte(0x46);  //发送器件地址0100 0110   最后一位0,表示写

        bh1750_recv_ack();

        bh1750_send_byte(0x20);   //发送One time H-Resolution Mode的Opecode 0010 0000,分辨率为1lux

        bh1750_recv_ack();

        bh1750_iic_stop();

        delay_ms(200);

        bh1750_iic_start();

        bh1750_send_byte(0x47);  //

        bh1750_recv_ack();

        BUF[0]=bh1750_recv_byte(1);

        //IIC_Ack();        //主机应答

        //temp1=temp<<8;

        BUF[1]=bh1750_recv_byte(0);

        //IIC_NAck();        //主机不应答        

        bh1750_iic_stop();

        

        

//         temp2=BUF[0];

//         temp2=(temp2<<8)+BUF[1];

//         lux=(float)temp2/1.2;    //lux是float型

        

        //return lux;

        //delay_ms(200);

}


/****从BH1750连续读Lux****/

/****

模式选择:H-Resolution Mode,分辨率1lux

连续读Opecode:0001 0000

器件地址:0100011,ADDR接GND

****/

void  bh1750_ReadContinuous1(void)

{

//        u16 temp=0,temp1=0;

        bh1750_iic_start();

  bh1750_send_byte(0x46);  //发送器件地址0100 0110   最后一位0,表示写

        bh1750_recv_ack();

        bh1750_send_byte(0x10);  //发送Continuous H-Resolution Mode的Opecode 0001 0000,分辨率为1lux

        bh1750_recv_ack();

        bh1750_iic_stop();

        delay_ms(200);

        bh1750_iic_start();

  bh1750_send_byte(0x47);  

        bh1750_recv_ack();

        

        

         BUF[0]=bh1750_recv_byte(1);

        BUF[1]=bh1750_recv_byte(0);        

        

        

        //temp=bh1750_recv_byte(1);

        //temp1=bh1750_recv_byte(0);



        bh1750_iic_stop();

        

        //temp2=temp1+(temp<<8);

        //lux=(float)temp2/1.2;    //lux是float型



}


void Conversion(void)

{

        temp2=BUF[0];

        temp2=(temp2<<8)+BUF[1];

        lux=(float)temp2/1.2;    //lux是float型

        

}







/**************************************

起始信号

**************************************/

void bh1750_iic_start(void)

{

                BH1750_SDA_OUT()       //设置SDA线为输出

        //在开始数据传输前,先让SDA和SCL都拉高

                BH1750_IIC_SDA=1;    //发送起始条件的数据信号,释放总线

          delay_us(2);

                BH1750_IIC_SCL=1;   


                delay_us(5);   //Tsu;STA:起始条件的建立时间大于4.7us。

        

[1] [2]
关键字:STM32  BH1750  光线感应 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic505500.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F103ZE+mpu6050+hmc5883L通过卡尔曼滤波串口输出姿态角
下一篇:STM32驱动0.96 OLED I2C显示程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32定时器T2纯软件仿真时间准确,JTAG在线调试查看时间不准
通过查看Sec的值和上次中断的差值计算的,虽然这个值是不准的 ,但实际上时间是准的,原因如下:stm32在调试模式下虽然进断点之后程序停止了,但定时器的时钟还在走,计数器还在计数,若要在产生断点时计数器停止计数可以在初始化时调用函数DBGMCU_Config(DBGMCU_TIM2_STOP,ENABLE);,这样一来仿真的时候定时时间就是准的了
发表于 2020-09-15
<font color='red'>STM32</font>定时器T2纯软件仿真时间准确,JTAG在线调试查看时间不准
STM32的JTAG下载模式
SWJ:串行线JTAG配置 (Serial wire JTAG configuration)SWJ(串行线JTAG)支持JTAG或SWD访问Cortex的调试端口。系统复位后的默认状态是启用SWJ但没有跟踪功能,这种状态下可以通过JTMS/JTCK脚上的特定信号选择JTAG或SW(串行线)模式。
发表于 2020-09-15
Python 和OpenMV如何玩转 STM32 MCU
如今网络边缘侧的机器学习现状如何?哪些工具可以帮助工程师收集数据并执行推断运算?在哪里可以找到ST MEMS,它们对现实生活中的产品有哪些影响?本文是我们即将举行的STM32全国研讨会系列的第二篇专题文章。在第14届STM32全国研讨会上,我们将通过应用演示、产品展示以及工程师与观众互动回答问题的方式,来与蝶粉社区近距离交流。在STM32全国研讨会专题系列报道第一部分我们着重介绍了云连接方面的用例,如一款新的智能门铃功能演示,还介绍了工业和数据安全相关应用。 今天,我们将重点探讨人工智能、计算以及感知技术。 人工智能与计算Qeexo 和STM32Cube.AI 当今边缘机器学习解决方案的种类
发表于 2020-09-14
stm32定时器主从模式
TIM2作master;TIM3,TIM4作slave定时器2事件更新被用作触发输出TRGO从定时器TIM3,TIM4工作在从模式:门控模式触发选择设为:ITR1,这样TIM2的TRGO就连到了TIM3和TIM4的内部触发输入ITR1上,经过一系列选择器之后TIM2的TRGO就是TIM3和tim4的TRGI;这样一来就可以通过控制TIM2的period和Pulse来控制TIM3和TIM4输出一定的脉冲个数;
发表于 2020-09-14
<font color='red'>stm32</font>定时器主从模式
STM32驱动74hc595
#include "bsp_74HC595.h"#define HC595_DS        PCout(13)//#define HC595_OE        PAout(0)//#define HC595_ST_CP        PBout(9)//#define HC595_SH_CP             PBout(8)//static void HC595_Delay(u32 t){    u32 i; 
发表于 2020-09-14
定时器周期计算公式
例如:TIM_TimeBaseStructure.TIM_Period = 10000-1;       //当定时器从0计数到10000,即为10000次,为一个定时周期10khz TIM_TimeBaseStructure.TIM_Prescaler = 71;     //设置预分频:1us/clk TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;  //设置时钟分频系数:不分频(是对外部时钟TIMXETR进行滤波的) TIM_TimeBaseStruct
发表于 2020-09-14
定时器周期计算公式
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved